Skip to content

OTOBO / Znuny Web Services – REST API

OTOBO REST API

W tej szczegółowej instrukcji dowiesz się, jak aktywować, skonfigurować i zintegrować API REST OTOBO (część Interfejsu Ogólnego) z własnymi aplikacjami.

1. Architektura i podstawy

OTOBO udostępnia swój Interfejs Ogólny poprzez usługi internetowe REST i SOAP. API REST komunikuje się za pomocą HTTP(S)/JSON i umożliwia:

  • Operacje na zgłoszeniach: tworzenie, pobieranie, modyfikowanie, usuwanie
  • Operacje na artykułach: dodawanie, zarządzanie załącznikami
  • Historia i wyszukiwanie: historia zgłoszeń i złożone zapytania wyszukiwania

Uwaga: Standardowa instalacja nie zawiera wstępnie skonfigurowanych usług internetowych – należy je utworzyć samodzielnie w module administracyjnym „Procesy i Automatyzacja → Usługi internetowe”.

2. Konfiguracja

2.1 Aktywacja Interfejsu Ogólnego

  1. W panelu administracyjnym → SysConfigGenericInterface.Transport ustaw wartość na REST (HTTP).
  2. W sekcji AdminGenericInterfaceTransportHTTPREST skonfiguruj limity czasu, nagłówki hosta i poziom debugowania.
  3. W GenericInterface.Operation utwórz i aktywuj żądane operacje (np. TicketCreate, TicketSearch, TicketGet, TicketUpdate, TicketDelete, TicketHistoryGet).

Dodaj usługę internetowąDostawca usługi internetowej

2.2 Podstawowy adres URL i uwierzytelnianie

  • Podstawowy URL

    https://TWÓJ-SERWER/otobo/nph-genericinterface.pl/Webservice/<NAZWA_USŁUGI>/
  • Uwierzytelnianie

    • Ciągki sesji OTOBO
    • Klucze API / tokeny (tworzone przez SysConfig)
    • Zawsze używaj HTTPS!

Konfiguracja żądającego REST

3. Punkty końcowe i metody HTTP (szczegóły)

Poniżej znajdziesz szczegółowy przegląd parametrów, możliwych odpowiedzi i praktycznych przykładów dla każdego punktu końcowego.

3.1 TicketCreate (POST)

URL: /Webservice/<NazwaUsługi>/TicketCreate
Metoda: POST

Opis: Tworzy nowe zgłoszenie i jednocześnie artykuł.

ParametrTypWymaganyOpis
SessionIDIntegerTak¹ID sesji lub para UserLogin+Password
UserLoginStringTak²Login agenta (w połączeniu z hasłem)
PasswordStringTak²Hasło (w połączeniu z UserLogin)
Ticket.TitleStringTakTemat zgłoszenia
Ticket.QueueStringTakNazwa kolejki lub Ticket.QueueID
Ticket.StateStringTakPoczątkowy stan (np. new)
Ticket.PriorityStringTakPriorytet (np. 3 normal)
Ticket.CustomerUserStringTakE-mail lub login klienta
Article.SubjectStringTakTemat pierwszego artykułu
Article.BodyStringTakTreść pierwszego artykułu
Article.MimeTypeStringTaktext/plain lub text/html

¹ Wymagane: albo SessionID, albo para UserLogin+Password.
² Jeśli nie ma tokenu SessionID.

Przykład żądania:

http
POST /Webservice/MyConnectorREST/TicketCreate HTTP/1.1
Host: demo.otobo.org
Content-Type: application/json
X-API-Key: abc123

{
  "Data": {
    "SessionID":  42,
    "Ticket": {
      "Title":        "Nowe zamówienie",
      "Queue":        "Sales",
      "State":        "new",
      "Priority":     "3 normal",
      "CustomerUser": "max.mustermann@example.com"
    },
    "Article": {
      "Subject":  "Zapytanie o zakup – produkt XY",
      "Body":     "Proszę o ofertę cenową…",
      "MimeType": "text/plain"
    }
  }
}

Przykład odpowiedzi:

json
{
  "Success":      1,
  "ErrorMessage": "",
  "Data": {
    "TicketID":     "12345",
    "ArticleID":    "67890"
  }
}

3.2 TicketSearch (GET)

URL: /Webservice/<NazwaUsługi>/TicketSearch
Metoda: GET

Opis: Wyszukuje zgłoszenia na podstawie różnych kryteriów filtrowania.

ParametrTypWymaganyOpis
UserLogin, PasswordString, StringTak¹Dane uwierzytelniające agenta lub SessionID²
SessionIDIntegerTak²Token dla uwierzytelnionej sesji
TitleString/String[]NieWyszukiwanie z użyciem symboli wieloznacznych (%Zamówienie%)
TicketNumberString/String[]NieNumer(y) zgłoszenia
QueueIDsInteger[]NieID kolejek
StatesString[]NieStany (new, open, …)
StateTypeString/String[]NieKategoria Open/Closed
DynamicField_Name.OpMixedNiePola dynamiczne z operatorem (Equals, Like, GreaterThan itd.)

¹ Wymagane: albo para UserLogin+Password, albo SessionID.
² Jeśli nie przekazano pary logowania.

Przykład żądania:

http
GET /Webservice/MyConnectorREST/TicketSearch?UserLogin=agent1&Password=geheim&Title=%25Zamówienie%25 HTTP/1.1
Host: demo.otobo.org

Przykład odpowiedzi:

json
{
  "Success": 1,
  "Data": {
    "TicketID": [1001,1005,1012]
  }
}

3.3 TicketGet (GET)

URL: /Webservice/<NazwaUsługi>/TicketGet
Metoda: GET

Opis: Zwraca szczegółowe dane zgłoszenia, w tym artykuły, załączniki i pola dynamiczne.

ParametrTypWymaganyOpis
UserLogin, PasswordString, StringTak¹Dane uwierzytelniające agenta lub SessionID²
SessionIDIntegerTak²Token dla uwierzytelnionej sesji
TicketIDString/String[]TakJedno lub więcej ID zgłoszeń (oddzielone przecinkiem lub tablica)
DynamicFieldsBoolean (0/1)Nie1 = pola dynamiczne w wyniku, domyślnie 0
ExtendedBooleanNie1 = rozszerzone metadane (np. FirstResponse)
AllArticlesBooleanNie1 = zwróć wszystkie artykuły
ArticleLimitIntegerNieMaks. liczba zwracanych artykułów
AttachmentsBooleanNie1 = osadź załączniki w Base64
GetAttachmentContentsBooleanNie1 = załaduj również treści załączników
HTMLBodyAsAttachmentBooleanNie1 = dołącz wersję HTML artykułu jako załącznik

¹ Wymagane: albo para UserLogin+Password, albo SessionID.
² Jeśli nie przekazano pary logowania.

Przykład żądania:

http
GET /Webservice/MyConnectorREST/TicketGet?SessionID=42&TicketID=12345&AllArticles=1&DynamicFields=1 HTTP/1.1
Host: demo.otobo.org

Przykład odpowiedzi (skrócony):

json
{
  "Success":1,
  "Data":{
    "Ticket":[{  
      "TicketID":12345,
      "TicketNumber":"202501230001",
      "Title":"Nowe zamówienie",
      "State":"open",
      "DynamicField":[{"Name":"Urgency","Value":"high"}],
      "Article":[{  
        "ArticleID":67890,
        "Subject":"Zapytanie o zakup…",
        "Body":"Proszę o ofertę cenową…",
        "Attachment":[{"Filename":"Oferta.pdf","Content":"JVBERi0x…="}]
      }]
    }]
  }
}

3.4 TicketUpdate (PUT)

URL: /Webservice/<NazwaUsługi>/TicketUpdate
Metoda: PUT

Opis: Aktualizuje pola istniejącego zgłoszenia i opcjonalnie tworzy nowy artykuł.

ParametrTypWymaganyOpis
SessionIDIntegerTak¹Token lub para UserLogin+Password²
TicketIDIntegerTakID zgłoszenia do aktualizacji
Ticket.TitleStringNieNowy tytuł
Ticket.StateStringNieNowy stan
Ticket.OwnerString/IDNieNowy właściciel
Ticket.PendingTimeHash / DiffNieNowy czas oczekiwania
Article.SubjectStringNieTworzy nowy artykuł
Article.BodyStringNieTreść nowego artykułu
DynamicField…ArrayNieAktualizacja pól dynamicznych
Attachment…ArrayNieDodanie nowych załączników

¹ Wymagane: albo SessionID, albo para UserLogin+Password.
² Jeśli nie ma tokenu SessionID.

Przykład żądania:

http
PUT /Webservice/MyConnectorREST/TicketUpdate HTTP/1.1
Host: demo.otobo.org
Content-Type: application/json
X-API-Key: abc123

{
  "Data":{
    "SessionID":42,
    "TicketID":12345,
    "Ticket":{ "State":"pending reminder","PendingTime":{"Diff":1440} },
    "Article":{ "Subject":"Przypomnienie ustawione","Body":"Zgłoszenie jest przetwarzane." }
  }
}

Przykład odpowiedzi:

json
{ "Success":1, "ErrorMessage":"", "Data":{ "TicketID":12345, "ArticleID":67891 } }

3.5 TicketDelete (DELETE)

URL: /Webservice/<NazwaUsługi>/TicketDelete
Metoda: DELETE

Opis: Trwale usuwa jedno lub więcej zgłoszeń.

ParametrTypWymaganyOpis
SessionIDIntegerTak¹Token lub para UserLogin+Password²
TicketIDString/ArrayTakJedno lub więcej ID zgłoszeń

Przykład żądania:

http
DELETE /Webservice/MyConnectorREST/TicketDelete?SessionID=42&TicketID=12345 HTTP/1.1
Host: demo.otobo.org

Przykład odpowiedzi:

json
{ "Success":1, "ErrorMessage":"", "Data":{} }

3.6 TicketHistoryGet (GET)

URL: /Webservice/<NazwaUsługi>/TicketHistoryGet
Metoda: GET

Opis: Pobiera historię jednego lub więcej zgłoszeń.

ParametrTypWymaganyOpis
SessionIDIntegerTak¹Token lub para UserLogin+Password²
TicketIDString/ArrayTakJedno lub więcej ID zgłoszeń

Przykład żądania:

http
GET /Webservice/MyConnectorREST/TicketHistoryGet?SessionID=42&TicketID=12345 HTTP/1.1
Host: demo.otobo.org

5. Rozszerzenia i dostosowania

5.1 Definicja WADL

Nowe zasoby w pliku GenericTicketConnectorREST.wadl:

xml
<resource path="MyTest" id="MyTest">
    <method name="GET" id="GET_MyTest">
        <response status="200">
            <representation mediaType="application/json"/>
        </response>
    </method>
</resource>

5.2 Import YAML

Alternatywnie przez YAML w development/webservices/GenericTicketConnectorREST.yml:

yaml
Provider:
  Operation:
    MyTest:
      Description: "Operacja testowa"
      MappingInbound: { }
      MappingOutbound: { }
      Type: Test::Module
Transport:
  Config:
RouteOperationMapping:
  MyTest:
    RequestMethod: [ GET ]
    Route: /MyTest

Dodaj dostawcę SOAP


6. Obsługa błędów i logowanie

  • Wskaźnik sukcesu: Success: 0|1
  • Komunikat o błędzie: ErrorMessage w JSON
  • Debugowanie: Ustaw w oknie transportu Poziom debugowania na Debug → wpisy logu będą widoczne w bazie danych

Debugger usługi internetowej


7. Przypadki użycia

ScenariuszOpis
Automatyzacja między systemamiTworzenie zgłoszeń z narzędzi monitorujących (Nagios, Zabbix)
Synchronizacja danychAktualizacje wsadowe pól zgłoszeń z zewnętrznego CRM
Portale samoobsługoweKlienci tworzą własne zgłoszenia przez REST
Aplikacje mobilneNatywne aplikacje iOS/Android komunikują się przez REST

8. Dodatkowe elementy interfejsu i integracja

Klonowanie usługi internetowej

Klonowanie usługi internetowej

Moduł obsługi błędów

Moduł obsługi błędów

Podsumowanie

API REST OTOBO jest elastyczne, wydajne i dzięki Interfejsowi Ogólnemu wysoce rozbudowalne. Niezależnie od tego, czy chcesz stworzyć proste zgłoszenie, czy zautomatyzować złożone procesy – z kilkoma kliknięciami w panelu administracyjnym i standardowymi żądaniami JSON możesz osiągnąć bezproblemową integrację z dowolnym środowiskiem IT.

Biblioteka klienta Python dla OTOBO

Asynchroniczna biblioteka Python do komunikacji z API REST OTOBO. Zbudowana z wykorzystaniem httpx i pydantic dla bezpieczeństwa typów i łatwości użycia.

Funkcje

  • Asynchroniczne żądania HTTP przy użyciu httpx.AsyncClient

  • Modele Pydantic do walidacji danych żądań i odpowiedzi

  • Pełne operacje CRUD na zgłoszeniach:

    • TicketCreate
    • TicketSearch
    • TicketGet
    • TicketUpdate
    • TicketHistoryGet
  • Obsługa błędów poprzez OTOBOError dla błędów API

  • Metoda pomocnicza search_and_get do łączenia wyników wyszukiwania z szczegółowym pobieraniem

Instalacja

Zainstaluj z PyPI:

bash
pip install otobo

Szybki start

Skonfiguruj usługi internetowe OTOBO:

Utwórz nową usługę internetową w OTOBO z następującą konfiguracją:

yaml
---
Debugger:
  DebugThreshold: debug
  TestMode: '0'
Description: ''
FrameworkVersion: 11.0.5
Provider:
  Operation:
    session-create:
      Description: ''
      IncludeTicketData: '0'
      MappingInbound:
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Session::SessionCreate
    ticket-create:
      Description: ''
      IncludeTicketData: '1'
      MappingInbound:
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Ticket::TicketCreate
    ticket-get:
      Description: ''
      IncludeTicketData: '0'
      MappingInbound:
        Config:
          KeyMapDefault:
            MapTo: ''
            MapType: Keep
          ValueMapDefault:
            MapTo: ''
            MapType: Keep
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Ticket::TicketGet
    ticket-history-get:
      Description: ''
      IncludeTicketData: '0'
      MappingInbound:
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Ticket::TicketHistoryGet
    ticket-search:
      Description: ''
      IncludeTicketData: '0'
      MappingInbound:
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Ticket::TicketSearch
    ticket-update:
      Description: ''
      IncludeTicketData: '1'
      MappingInbound:
        Type: Simple
      MappingOutbound:
        Type: Simple
      Type: Ticket::TicketUpdate
  Transport:
    Config:
      AdditionalHeaders: ~
      KeepAlive: '1'
      MaxLength: '16000'
      RouteOperationMapping:
        session-create:
          RequestMethod:
            - HEAD
            - OPTIONS
            - PATCH
            - POST
            - PUT
          Route: /session
        ticket-create:
          RequestMethod:
            - HEAD
            - OPTIONS
            - POST
          Route: /ticket
        ticket-get:
          RequestMethod:
            - HEAD
            - OPTIONS
            - POST
          Route: /ticket/get
        ticket-history-get:
          RequestMethod:
            - HEAD
            - OPTIONS
            - POST
          Route: /ticket/history
        ticket-search:
          RequestMethod:
            - HEAD
            - OPTIONS
            - POST
          Route: /ticket/search
        ticket-update:
          RequestMethod:
            - HEAD
            - OPTIONS
            - PATCH
            - PUT
          Route: /ticket
    Type: HTTP::REST
RemoteSystem: ''
Requester:
  Transport:
    Type: HTTP::REST

Utwórz nowego agenta

Utwórz nowego agenta OTOBO z bezpiecznym hasłem i nadaj mu odpowiednie uprawnienia.

1. Skonfiguruj klienta

python
from otobo import TicketOperation, OTOBOClientConfig
from otobo import AuthData

config = OTOBOClientConfig(
    base_url="https://your-otobo-server/nph-genericinterface.pl",
    service="OTOBO",
    auth=AuthData(UserLogin="user1", Password="SecurePassword"),
    operations={
        TicketOperation.CREATE.value: "ticket",
        TicketOperation.SEARCH.value: "ticket/search",
        TicketOperation.GET.value: "ticket/get",
        TicketOperation.UPDATE.value: "ticket",
        TicketOperation.HISTORY_GET.value: "ticket/history",
    }
)

2. Zainicjuj klienta

python
import logging
from otobo import OTOBOClient

logging.basicConfig(level=logging.INFO)

client = OTOBOClient(config)

3. Utwórz zgłoszenie

python
from otobo import (TicketOperation, OTOBOClientConfig, AuthData, TicketSearchParams, TicketCreateParams,
                   TicketHistoryParams, TicketUpdateParams, \
                   TicketGetParams, OTOBOClient, OTOBOTicketCreateResponse)

payload = TicketCreateParams(
    Ticket={
        "Title": "Nowe zamówienie",
        "Queue": "Sales",
        "State": "new",
        "Priority": "3 normal",
        "CustomerUser": "customer@example.com"
    },
    Article={
        "Subject": "Zapytanie o produkt",
        "Body": "Proszę o szczegóły cenowe...",
        "MimeType": "text/plain"
    }
)

response: OTOBOTicketCreateResponse = await client.create_ticket(payload)
print(response.TicketID, response.TicketNumber)

4. Wyszukaj i pobierz zgłoszenia

python
from otobo import TicketSearchParams, TicketGetParams

search_params = TicketSearchParams(Title="%Zamówienie%")
search_res = await client.search_tickets(search_params)
ids = search_res.TicketID

for ticket_id in ids:
    get_params = TicketGetParams(TicketID=ticket_id, AllArticles=1)
    details = await client.get_ticket(get_params)
    print(details.Ticket[0])

5. Zaktualizuj zgłoszenie

python
from otobo import TicketUpdateParams

update_params = TicketUpdateParams(
    TicketID=response.TicketID,
    Ticket={"State": "closed"}
)
await client.update_ticket(update_params)

6. Pobierz historię zgłoszenia

python
from otobo import TicketHistoryParams

history_params = TicketHistoryParams(TicketID=str(response.TicketID))
history_res = await client.get_ticket_history(history_params)
print(history_res.History)

7. Połączone wyszukiwanie i pobieranie

python
from otobo import FullTicketSearchResponse

full_res: FullTicketSearchResponse = await client.search_and_get(search_params)

Licencja

MIT © Softoft, Tobias A. Bueck