суббота, 26 декабря 2020 г.

Intraservice. Работаем через API

Попробуем парсить обращения из Intraservice при помощи Powershell. Пригодится, когда надо регулярно и быстро доставать инфу, имея на руках только номер обращения. Опишу основные действия, хотя это всё есть в официальной документации. Мне пригодилось в части автоматизации составления документов на печать из данных, полученных из обращения. 

Сперва посмотрим, какие данные можем получить из заявки через API в формате json через веб-браузер. Для этого переходим по адресу сервера/api/task/номер_заявки

Здесь и далее часть данных удалена

На скриншоте только часть данных, на самом деле их гораздо больше, и это здорово. 
Теперь попробуем авторизоваться и получить данные из заявки через Powershell. Из документации мы знаем, что в API использует базовая авторизация 
"Базовая авторизация представляет собой отправку заголовка «Authorization» со значением вида «Basic <base64UserLoginPass>», где <base64UserLoginPass> - закодированная в base64 строка вида «<login>:<password>»."
# Данные для авторизации
$username = "username"
$password = "password"
$userpass  = $username + ":" + $password
$bytes= [System.Text.Encoding]::UTF8.GetBytes($userpass)
$encodedlogin=[Convert]::ToBase64String($bytes)
$authheader = "Basic " + $encodedlogin
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization",$authheader)
$headers.Add("Accept","application/json")
$headers.Add("Content-Type","application/json")
В случае отправки запроса GET, данные можно получить как в json, так и в xml формате. Content-Type можно указать в заголовках запроса. А вот PUT и POST только в json.

Попробуем получить информацию из заявки по её номеру при помощи командлета Invoke-RestMethod (он же curl)
# Получаем информацию из заявки
$servername 'https://servername.ru/api/task'
$taskid '5774'
$uriTask = "$serername/$taskid"
$response = Invoke-RestMethod -Uri $uriTask -Headers $headers -Method Get -ContentType "application/json"
Все данные мы вывели в переменную $response. Это очень удобно, теперь следуя json-структуре ответа, можно получать данные из Task, например вернём его Id

Можно вывести список всех заявок измененных за определенный период в формате даты YYYY-MM-DD. 
$range = 'ChangedMoreThan=2020-08-20&ChangedLessThan=2020-08-21'
$period = Invoke-RestMethod -Uri "$serername?$range" -Headers $headers

А затем посмотреть количество обращений за этот период
$period.Paginator.Count

Или заявки, открытые за определенный период
$range = 'CreatedMoreThan=2020-08-20&CreatedLessThan=2020-08-21'
$period = Invoke-RestMethod -Uri "$serername?$range" -Headers $headers

Аналогично по заявкам, закрытым за определенный период
$range = 'ClosedMoreThan=2020-08-20&ClosedLessThan=2020-08-21'
$period = Invoke-RestMethod -Uri "$serername?$range" -Headers $headers

Или вывести общее количество заявок со статусом "Закрыто" (поле StatusID)
$status = 'StatusIDs=56'
$status = Invoke-RestMethod -Uri "$serername?$status" -Headers $headers

Если необходимо добавить к закрытым заявкам ещё и заявки со статусом "В работе", добавляем нужный StatusIDs через запятую
$status = 'StatusIDs=56,27'
$status = Invoke-RestMethod -Uri "$serername?$status" -Headers $headers

Можно выводить список заявок по нескольким критериям. Попробуем вывести закрытые заявки за определенный период
$status = 'StatusIDs=56'
$range = 'ClosedMoreThan=2020-08-20&ClosedLessThan=2020-08-21'
$status = Invoke-RestMethod -Uri "$serername?$status&$range" -Headers $headers

Немного о фильтрах. 
Использование фильтров очень помогает в работе с заявками через веб-интерфейс Итрасервиса. Если вы уже создали фильтр, его можно использовать и в своих скриптах. Для этого нужен его FilterId. 
Посмотрим список фильтров
$servername 'https://servername.ru/api'
$filter = Invoke-RestMethod -Uri "$servername/filter?resource=task" -Headers $headers

  Id Name                    IsCommon IsDefault
  -- ----                    -------- ---------
1149 Открытые                   True     False
1150 Закрытые                    True     False
1151 В работе                    True     False
Собственно 1149-1151 и есть наш FilterID

Выведем список заявок по фильтру 1150 (закрытые заявки) и отформатируем вывод данных по полям Id, Name, StatusId 
$fields = 'Id,Name,StatusId'
$filterId = 'FilterId=1451'
$filter = Invoke-RestMethod -Uri "$servername/task?fields=$fields&$filterId" -Headers $headers
$filter.Tasks

Data   Id Name                                                           StatusId
----   -- ----                                                           --------
     5318 Ремонт МФУ Kyocera                                             28

На этом остановлюсь. В официальной документации описано всё гораздо подробнее и нет смысла всё переписывать сюда. Для общего представления о работе с API через Powershell будет достаточно. А ведь ещё есть метод PUT! Можно обрабатывать обращения без участия GUI, и менять статусы заявок, добавлять вложения, закрывать заявки с определенным текстом не слезая с дивана прямо с консоли, или готовыми скриптами.
Правда тут я споткнулся, и так не вышло записывать изменения в заявки на сервер по https-подключению с ошибкой
Invoke-RestMethod : {"Message":"Не удалось обновить заявку. Причина: Method not found: 
'IntraService.Domain.ViewModels.UpdateTaskResult IntraService.Domain.Services.ITaskService.
UpdateTask(IntraService.Domain.Models.IntraServiceDataContext, IntraService.Domain.Models.
Task, SubmitFrom, IntraService.Domain.ViewModels.ITaskSubmitModel, IntraService.Security.
IIntraServicePrincipal, Boolean, Boolean, Boolean, Boolean)'."}

Обращение на форуме Intraservice так и осталось без ответа. Между тем, через http без SSL-сертификата PUT исполняется без проблем. 

Комментариев нет :

Отправить комментарий