DEV Community

Cover image for GLPI - Fechar ticket com API
João Pedro
João Pedro

Posted on

4

GLPI - Fechar ticket com API

Diferente do que está descrito na documentação oficial do GLPI, o sistema não funciona como deveria e não responde corretamente aos parâmetros fornecidos. A documentação encontrada em "https://DOMINIO_GLPI.COM/apirest.php" informa que alguns parâmetros devem ser passados no corpo da requisição, mas isso nem sempre funciona. O único jeito que parece funcionar é passando os parâmetros diretamente na URL.

Autor: joaoprd | joaopedrord2001@gmail.com

Iniciando sessão

Para iniciar qualquer chamada, precisamos do session_token e do app-token. Para gerar o session_token, fazemos uma requisição para "https://DOMINIO_GLPI//apirest.php/initSession" com os parâmetros app-token e user_token, que estão disponíveis na conta do usuário com a qual estamos trabalhando.

A requisição abaixo gera o session_token:

curl --location 'https://DOMINIO_GLPI.COM/apirest.php/initSession?app-token={YOUR-APP-TOKEN}&user_token={YOUR-USER-TOKEN}'
Enter fullscreen mode Exit fullscreen mode

Pesquisa de tickets

Com o session_token em mãos, podemos realizar pesquisas sobre os chamados. No entanto, de acordo com a documentação do GLPI, parece que o endpoint não funciona conforme os exemplos fornecidos, pois não é permitido enviar PAYLOAD para esse endpoint, resultando no seguinte erro:

[
    "ERROR_JSON_PAYLOAD_FORBIDDEN",
    "GET Request should not have json payload (http body); view documentation in your browser at /#ERROR_JSON_PAYLOAD_FORBIDDEN"
]
Enter fullscreen mode Exit fullscreen mode

Para contornar essa limitação, vamos passar os parâmetros diretamente na URL da requisição, utilizando o link "https://DOMINIO_GLPI.COM/apirest.php/search/Ticket". É necessário incluir o app-token e o session-token para se conectar, e em seguida, adicionar os filtros desejados para localizar as informações necessárias.

curl --location --globoff 'https://DOMINIO_GLPI.COM/apirest.php/search/Ticket
?app-token={YOUR-APP-TOKEN}
&session_token={YOUR-SESSION-TOKEN}
&criteria[0][field]=1
&criteria[0][searchtype]=contains
&criteria[0][value]=Verifica%C3%A7%C3%A3o%20diaria
&criteria[1][link]=AND
&criteria[1][field]=12
&criteria[1][searchtype]=equals
&criteria[1][value]=2
&glpilist_limit=1000' \
--header 'Content-Type: application/json'
Enter fullscreen mode Exit fullscreen mode

"Criteria" é a chamada de filtro, os fields são determidos filtros a serem colocados para encontrar algo. Por exemplo, "criteria[0][field]=1" é designado para o título onde passamos "criteria[0][searchtype]=contains" informando que contém "criteria[0][value]=Verifica%C3%A7%C3%A3o%20diaria", no caso seria 'Verificação diária' que foi encodado, mas ali seria o local a colocar o título do chamado. É feito outra filtragem abaixo em criteria[1][link]=AND, onde se é feito o AND informando uma nova pesquisa seguindo a anterior.

Para analisar todas as filtragens pode-se fazer a requisição para:

curl --location 'https://DOMINIO_GLPI.COM/apirest.php/listSearchOptions/Ticket?app-token={YOUR-APP-TOKEN}&session_token={YOUR-SESSION-TOKEN}' \
--data ''
Enter fullscreen mode Exit fullscreen mode

Alguns retornos para exemplo:

{
    "common": {
        "name": "Características"
    },
    "1": {
        "name": "Título",
        "table": "glpi_tickets",
        "field": "name",
        "datatype": "itemlink",
        "nosearch": false,
        "nodisplay": false,
        "available_searchtypes": [
            "contains",
            "notcontains"
        ],
        "uid": "Ticket.name"
    },
    "21": {
        "name": "Descrição",
        "table": "glpi_tickets",
        "field": "content",
        "datatype": "text",
        "nosearch": false,
        "nodisplay": false,
        "available_searchtypes": [
            "contains",
            "notcontains"
        ],
        "uid": "Ticket.content"
    },
    "2": {
        "name": "ID",
        "table": "glpi_tickets",
        "field": "id",
        "datatype": "number",
        "nosearch": false,
        "nodisplay": false,
        "available_searchtypes": [
            "contains",
            "notcontains"
        ],
        "uid": "Ticket.id"
    },
...
Enter fullscreen mode Exit fullscreen mode

Criação de tarefa

Com a requisição anterior, realizamos a busca dos chamados, que retornarão em formato JSON. Com essas informações, podemos realizar as tratativas necessárias. No caso específico desta documentação, vamos fechar o chamado. No entanto, antes de fechar o chamado completamente, precisamos criar uma tarefa vinculada ao ticket que deve ser concluída.

Alguns sistemas GLPI requerem o fechamento de chamados de formas específicas. No sistema em que estou trabalhando, é necessário criar uma tarefa e uma solução antes de fechar o chamado.

Abaixo está a requisição que cria a tarefa no ticket (lembre-se de que o ticket que estou passando foi gerado na busca anterior em "Pesquisa de tickets"). Em meu código de automação, foi implementado um loop para processar todos os tickets retornados, mas isso não será abordado nesta documentação.

curl --location 'https://DOMINIO_GLPI.COM/apirest.php/TicketTask?session_token={YOUR-SESSION-TOKEN}' \
--header 'app_token: {YOUR-APP-TOKEN}' \
--header 'Authorization: user_token {YOUR-USER-TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
    "input": {
        "tickets_id": 2408020023, 
        "taskcategories_id": 0, 
        "content": "Verificação diária - Tarefa realizada.",
        "actiontime": 60, 
        "state": 3 
    }
}
'
Enter fullscreen mode Exit fullscreen mode

Devemos observar que, em todos os casos, passamos o app_token no header, e o Authorization, que contém o user_token para autenticação da API.

Pontos importantes a serem considerados são os parâmetros passados no corpo da requisição:

  • content: O conteúdo que será inserido na tarefa.
  • actiontime: O tempo gasto na tarefa.
  • state: O estado que o chamado terá após a criação da tarefa.

Fechamento do chamado

Com a tarefa adicionada ao chamado, é necessário apenas realizar o fechamento do chamado, que segue o mesmo processo utilizado para adicionar a tarefa.

Utiliza-se a seguinte requisição:

curl --location --request PUT 'https://DOMINIO_GLPI.COM/apirest.php/Ticket/2408020023?session_token={YOUR-SESSION-TOKEN}' \
--header 'app_token: {YOUR-APP-TOKEN}' \
--header 'Authorization: user_token {YOUR-USER-TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
  "input": {
    "status": 6, 
    "solution": "<p>Chamado finallizado</p>",  
    "content": "<p>Chamado finallizado</p>",
    "solutiontypes_id": 3, 
    "solutiontemplates_id": 5  
  }
}'
'
Enter fullscreen mode Exit fullscreen mode

O status: 6 indica o fechamento do chamado. Para isso, é necessário passar o solution e o content como os textos do corpo para a solução. Um ponto importante nessa requisição é o solutiontemplates_id, que deve ser criado pelo administrador do sistema GLPI, sendo esse ID um referencial para uma solução padrão.

API Trace View

How I Cut 22.3 Seconds Off an API Call with Sentry 🕒

Struggling with slow API calls? Dan Mindru walks through how he used Sentry's new Trace View feature to shave off 22.3 seconds from an API call.

Get a practical walkthrough of how to identify bottlenecks, split tasks into multiple parallel tasks, identify slow AI model calls, and more.

Read more →

Top comments (2)

Collapse
 
anael_silva_bd23cd8950c66 profile image
Anael Silva

Oi João, parabéns pelo Post, se possível poderia compartilhar o seu script completo no GIT, vai ajudar muito a comunidade, estou iniciando na integração do GLPI com a o Spectrum, a abertura de chamados já está funcionando bem, ainda preciso amadurecer algumas questões, como inserir um acompanhamento quanto já tiver um chamado aberto com o mesmo titulo, e fechar os chamados, eu já escrevo o id do alerta no chamado, preciso agora conseguir pegar essa variável no chamado quando o alerta normalizar e fechar o chamado.

Collapse
 
joaoprd profile image
João Pedro

Opa, vou subir e deixar por aqui o script e obrigado rsrs

Essa variável não volta em um json ou algo assim do Spectrum?

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay