API/REST Schnittstelle

  • Hallo Zusammen,


    ich würde gerne ein eigenes Programm mit der Starface verbinden, dazu hatte ich an eine API bzw. die REST Schnittstelle gedacht.
    Ich hatte im Netz dazu folgendes gefunden: https://knowledge.starface.de/…ki64/REST+-+Schnittstelle
    Die Endpoints sind allerdings relativ mager und für mein Vorhaben bieten sie nicht das, was ich ich benötige.


    Ich würde gerne eine Möglichkeit nutzen, einem System per HTTP Request mitzuteilen, wann ein Gespräch beginnt, wann es beendet wurde, ob ein oder ausgehend und welche interne und externe Nummer beteiligt war.
    Entweder mit einem Request am Ende des Gespräches oder mit einem zu Beginn und einem zum Ende.


    Im Forum habe ich zwar ein paar Links zu einem Unterforum gefunden, welche eventuell Aufschluss hierüber geben könnten, wie ich das ganze angehen könnte, allerdings erhalte ich hier leider immer die Meldung vom Forum, dass ich nicht berechtigt wäre die Beiträge anzusehen.


    Eventuell ließe sich dies auch relativ einfach über den Modul Designer machen?
    Wäre super froh, wenn mich jemand in die richtige Richtung lenken könnte und evtl. ne Info dazu, warum ich die ganzen Beiträge zu diesem Thema nicht lesen kann.


    Grüße

  • Hallo Eichhorn


    Generell sollten alle Beiträge, die für dich ersichtlich sind auch Lesbar sein.


    Zum Thema Gesprächsbeginn/ende.


    Das kannst du etwa so lösen:


    Call-EntryPoint "always
    {
    GetCallUUID() ==> _uuid (Expert Mode ==> Call) //UUID des Rufs holen
    forK(watchcall(_uuid)) //Ruf in ein weiteres Thread weitergeben, damit der Ruf nicht blockiert wird
    HTTPRequest (Expert Miode ==> Net.http)
    Exit()
    }


    Funktion WatchCall()
    {
    Call.getCallState() _callstate(Expert Mode ==> UCI 3.0) //Rufstatus abfragen
    while(_Callstate != HANGUP) //Während der Ruf nicht Aufgehängt ist
    {
    sleep(1) //1 Sekunde schlafen
    Call.getCallState() _callstate //Status erneuern
    }
    HttpReqeust (Expert Mode ==> Net.HTTP)
    }


    MfG


    Fabian

  • Hallo Eichhorn


    Generell sollten alle Beiträge, die für dich ersichtlich sind auch Lesbar sein.


    Habe nebenbei gelesen, dass man so etwas auch über die UCI Schnittstelle machen könnte. Das in der Knowlegebase verlinkte Forum dazu kann ich z.B. gar nicht aufrufen.
    Es wird mir gesagt, ich hätte keine Berechtigung.


    http://support.starface.de/for…gration-Development-Forum


    Ich werde mir das mit den Modulen mal anschauen, und testen, ob ich etwas hinbekomme mit dem Beispiel von dir! Danke schonmal :)

  • Ich habe nun etwas rumexperimentiert, und vom Prinzip her sieht es auch so aus, als wenn es funktioniert.
    Leider mit einem bzw. zwei entscheidenden Problemchen.


    Ich kriege mit GetCallUUID zwar die uuID (z.B. ce28b6f6-7807-4a2b-8782-43f399a4e267) des Calls und übergebe diese auch an die WatchCall Funktion.
    Hier liefert die Call.getCallState(---,_uuid) aber immer nur ein "null" auf _state zurück.
    Ich komm nicht dahinter woran es liegt, im Log finde ich so auch nichts.


    Kann es vllt daran liegen, dass der STARFACE User Parameter --- ist? In der Info zu der Funktion steht immer, "liefert Informationen in Zusammenhang mit einem spezifischen Starface user".


    Weiterhin schlägt der httprequest über TLS fehl, im Log steht dazu, dass der Handshake nicht erfolgreich war. Kann es sein, dass in der Starface keine Stammzertifikate hinterlegt sind?
    Per http funktioniert es.


    Grüße


    EDIT:


    Ich habe irgendwo in den Tiefen dieses Forums von dir die CallStateFromUUID Klasse gefunden: https://support.starface.de/fo…n-wenn-Call-verbunden-ist
    Wenn ich die CallStateFromUUID in der Main Funktion des Moduls aufrufe mit der _uuid von GetCallUUID als Parameter dann funktioniert deine Methode und gibt den State korrekt zurück. Außerdem loggt deine Methode ja auch etwas.


    [2017-12-19 12:26:19,893] DEBUG [CallStatefromUUID] Getting Channelstate for: 389328c2-d192-486e-8b6e-1786453d4d0f
    [2017-12-19 12:26:19,893] DEBUG [CallStatefromUUID] Channel Found. Channelstate is: NEW


    Wenn ich diese Logik aber nun in die geforkte WatchCall auslagere geht es nicht mehr.


    ich habe zu beginn der WatchCall eine Log Ausgabe eingebaut und am Ende, um zu sehen ob sie ausgeführt wird und die uuid als parameter korrekt übergeben wird:


    [2017-12-19 12:52:30,307] DEBUG [Start] watchcall started
    [2017-12-19 12:52:30,308] DEBUG [Start] 8a87d5af-7af2-4de2-ad9b-e17a091a8eec
    [2017-12-19 12:52:30,308] DEBUG [Start] watchcall ended


    Eigentlich müsste hier ja nun auch die DEBUG Ausgabe von CallStatefromUUID mit auftauchen, tut sie aber nicht.
    CallStatefromUUID funktioniert in der geforkten Funktion komplett nicht, und ich verstehe nicht warum.

    2 Mal editiert, zuletzt von aeichhorn ()

  • Moin Fabian,


    richtig gut! :)
    Jetzt kann ich in der watchCall den Status abfragen.


    Folgendes Problem jetzt:



    Bei Ansage vor Melden ist bei der Ansage der Status "UP", bei der Warteschleifenmusik ist er dann "LINKED" und sobald jemand das Gespräch annimmt kommt "Call Leg does no Longer exist" und "HANGUP".


    Bei ausgehenden Gesprächen klappt alles wie erwartet:



    EDIT:


    Lag an der iQueue die ich vorgeschaltet hatte.
    Habe es nun zum Testen auf RingAll Group gestellt.
    Da werden dann mehrere Calls gestartet. Hab das Schema noch nicht ganz raus, wie ich das filtere, dass erkannt wird wann wirklich eine Sprechverbindung steht.
    Denn wenn man das Gespräch annimmt werden die anderen "Calls" beendet und der einzige der Bleibt ist immer State "LINKED", dieser verändert sich auch nicht bis zum Auflegen.
    Wenn man gar keine Gruppe einsetzt geht es auf jeden Fall.

    Einmal editiert, zuletzt von aeichhorn ()

  • Hallo Eichhorn


    Ich beziehe vom ModelCall die CallID. Wird diese CallID von der Starface geändert kann ich natürlich den Status nicht weiterverfolgen, da der ModelCall immer noch die alte ID enthält.


    MfG


    Fabian


  • Ja so etwas habe ich mir schon gedacht.
    Es scheint ja so zu sein, dass bei einer RingAll Group mehrere Calls aufgebaut werden.
    Interessant ist allerdings dass nur ein Call von Anfang bis Ende existiert.
    Wie ich diesen einen Call rausfiltere habe ich hinbekommen, nur ist dann das Klingeln, und der Fall, dass evtl. gar kein Gespräch zustande gekommen ist, mit in dieser Zeit zwischen "Start" und "Ende" einbegriffen.
    An dem Zustand dieses einen Calls ändert sich leider nichts, sowohl beim Klingeln als auch wenn das Gespräch aufgebaut ist, ist hier der Zustand "LINKED".
    Ich schätze, dass im ersten Channel das Gespräch schon aufgebaut wurde während die Teilnehmer der Gruppe Klingeln.
    Sobald die Teilnehmer klingeln wird für jeden Teilnehmer noch ein Call aufgemacht, welcher den Zustand "RINGING" hat.
    Nimmt nun jemand das Gespräch an, wird dieser Teilnehmer an den initialen Call übergeben/verbunden und der Call, welcher vorher den Zustand RINGING für den Teilnehmer hatte wird abgebaut.


    Ich hatte auch schon rumüberlegt, ob ich irgendwo anders dran fest machen kann, dass das Gespräch nun wirklich angenommen wurde.


    Ich wollte halt eigentlich zwei HTTP Requests versenden:


    Bei Aufbau der richtigen Sprechverbindung (nicht Warteschleife, oder anderes):


    {
    type: 'started',
    extNumber: '0049123456788',
    intNumber: '00494352535345',
    uuid: 'XXXX-XXXXX-XXXXX-XXXXX'
    }


    und beim beenden der verbindung


    {
    type: 'stopped',
    uuid: 'XXXX-XXXXX-XXXXX-XXXXX'
    }


    so kann ich in meinem CRM dann das Gespräch erfassen und die Zeit inklusive Gesprächspartner protokollieren.
    Von den Parametern her hat auch alles soweit geklappt, außer dass der started Befehl halt gesendet wird sobald es halt klingelt.


    Evtl. darf ich nicht über die uuid Matchen, sondern über die int und ext Nummern, dann könnte ich aus den verschiedenen Calls das evtl. hinkriegen den Started an der richtigen stelle abzusenden.
    Aber nach einer schönen Lösung hört sich das irgendwie nicht an.


    Bin für Tipps super dankbar! :)


    Und vielen Dank schonmal für deine super Hilfe nucom! :)
    Ohne dich hätte ich gar nicht weiter machen brauchen, denn ohne deine Klassen hätte ja gar nichts geklappt.


    Grüße
    Arne

  • Hallo Arne


    Danke fürs Feedback.


    Das Modul Ansicht kann ja auch "Telefonieren."
    Wenn du also dem Modul das Callmanagement überlassen würdest, dann könntest du es einfach und exakt Dokumentieren.


    Das könntest du Folgendermassen realisieren


    Einen Service EntryPoint vom Typ "Instance" erstellen.


    Dem Modul eine Rufnummer zuweisen


    EntryPoint Instance
    {
    log.debug("Incoming Call!")
    HttpRequest
    CallGroup([Nummer der Gruppe]) ==> Das Modul ruft für dich die Zielgruppe an, egal von welchem Typ sie ist.
    log.deb("Call is Over)
    HTTPRequest
    }
    Das Modulsystem verhält sich Speziell wenn es um Anrufe geht.


    Wenn das Modulsystem einen Anruf annimmt (Answer), dann läuft das Modul weiter.
    Wenn das Modul den Anruf für dich an einen User/Gruppe/Voicemail usw... weitergibt, wartet das Modul, bis dieser Anruf abgeschlossen wurde.


    Konkret: Anruf Kommt rein auf dem Modul ==> Modul ruft Gruppe an ==> Gruppenmitglied nimmt ab ==> Modul wartet bis Anruf beendet wird ==> Anruf wird beendet ==> Modul läuft weiter.


    Dementsprechend müsstest du dem Modul einfach die Externe Telnr. zuweisen, die vorher der Gruppe zugewiesen war.


    MfG


    Fabian

  • In anderen Themen habe ich gesehen, dass Leute für das Development Forum freigeschaltet wurden. Gibt es da nicht vielleicht Material um sich das anzueignen?
    Mit den ganzen Zertifizierungen lohnt sich für mich nicht wirklich :(
    Hab nur die Starter erstmal gemacht, aber damit man die Dokus bekommt muss man ja nochmal richtig löhnen.


    Mit deinem Ansatz erkenne ich dann ja aber trotzdem nicht, wann der Anruf genau angenommen wird? Und so würde es dann auch nur für eingehende Anrufe gehen und nicht gleichermaßen auch für ausgehende?


    Grüße
    Arne

  • Hallo Arne


    Ja das ist bei dem Konzept leider so, du weisst wann er Angerufen hat, und wann er aufgelegt hat, aber nicht wann genau das Gespräch zu Stande gekommen ist. Ausgehende Anrufe würden so natürlich auch nicht geloggt.


    MfG


    Fabian

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!