SIPGATE REST-API wie anwenden?

Guten Tag alle Zusammen,

folgende Frage: Unser Verein (makerspace-wi.de) hat einen SIPGATE Account eingerichtet und wir möchten gerne die Umleitungen nach einem bestimmten Schema automatisch schalten.

sipgate bietet wohl eine REST-API Schnittstelle an - allerdings habe ich keinen blassen Dunst, ob/wie diese via SYMCON genutzt werden kann.

Falls von Euch da schon mal jemand was gemacht hat, wären wir über jeden Tipp dankbar.

Gruß
Dieter aus Wiesbaden

Hallo,

also wenn ich die Doku der API richtig gelesen habe sollte das gehen.

Gib mal ein Beispiel, wie du es vor hast.

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

Hallo Kai,

vielen Dank, dass Du für uns da mal reingeschaut hast.

Also wir haben einen sipgate basic Account und wir möchten

Weiterleitung ein- und ausschalten
und
die 3 möglichen Weiterleitungen individuell setzen, dabei die Telefonnummer ändern, sowie die Zeit nach der weitergeleitet wird - z.B. sofort, 10s, 20s, 30s usw.

Das war es eigentlich schon.

Gruß
Dieter

Hallo,

ich schau mir das gerne heute Abend oder am Wochenende mal an. Muss gleich erst noch los.
Ich meine ich habe auch noch einen Sipgate Account.
Mal schauen, ob ich daraus ein kleines Script mache oder direkt ein kleines Modul. :smiley:

Hätte ich schon lust zu. :slight_smile:

Grüße,
Kai

Hallo,

so ganz verstanden habe ich die API leider noch nicht.
Hat sich schon mal jemand mit der Sipgate API über PHP verbunden? Also die Authorization durchgeführt?

Grüße,
Kai

nein, aber die Auth (in diesem Basic mit Username und Passwort) ist hier mit Beispielen angeführt:
sipgate API

Da müsste sich IP-Symcon drum kümmern bzw. das abklären, die können die Dinge, die für OAuth essentiell sind eintragen, und generieren dann einen Key der durch einen PHP Modul benutzt werden kann. Der Redirection Endpoint ist der Oauth Server von IP-Symcon der dann die Daten über IP-Symcon Connect an das jeweilige IP-Symcon System weiterleitet. Damit es da aber eine geordneten Ablauf gibt und eine Third Party Application sich ja auch nur einmal als solche authentifizieren kann sollte das alles geordnet über IP-Symcon laufen. Die Authentifizierung erfolgt dann wie bei anderen OAuth PHP Modulen auch über IP-Symcon Connect.

Die Authentifikation erfolgt dann wie in OAuth Test, dazu muss aber zunächst der oauthIdentifer von IP-Symcon zugewiesen worden sein.

Wenn Du da ein PHP Modul bauen willst dann schreibe einfach paresy wegen einem oauthIdentifer an.

Du willst dich doch bei Sipgate autorisieren und nicht Sipgate am IPS ?!
Dafür brauchst du doch nur die Zugangsdaten vom sipgate. Das hat doch gar nichts mit dem IPS OAuth zu tun.

Sipgate bietet für den Zugriff auf die REST API 2 mögliche Authentifizierungen:

  • Basic: Username und Passwort
  • OAuth2: wie von Fonzo beschrieben

Habe mir die API gerade noch mal angeschaut:
Du kannst dich via Basic auth autorisieren und dir einen Token abholen. Mit diesem Token autorisierst du dich dann mit deinen requests.
Ich habe mir diese Woche auch einen Account dort erstellt und kann dir da auch bisschen helfen (Bin ja auch aus WI ) :wink:

Hallo,

sollte doch mit curl zum Beispiel gehen oder?

Grüße,
Kai

Gesendet von iPhone mit Tapatalk

ja sollte es - ich habe leider keinen Account bzw. gibt es den für A nicht, sonst hätte ich es bereits versucht.

vielleicht kannst du aus dem Code Geschnipsel etwas basteln - stammt aus dem OSRAM Modul vor Umstellung auf OAuth2


  const GATEWAY_SERIAL_LENGTH   =  11;
  const CLOUD_REQUEST_INTERVALL =  60; //seconds
  const CLOUD_SESSION_TIMEOUT   = 840; //Lightify session time-out 14 min

  const PROTOCOL_VERSION        =   1;
  const HEADER_CONTENT_TYPE     = "Content-Type: application/json";
  const HEADER_AUTHORIZATION    = "authorization: ";
  const RESSOURCE_DEVICE_LIST   = "/devices";
  const RESSOURCE_GROUP_LIST    = "/groups";

  const RESOURCE_SESSION        = "/session";
  const LIGHTIFY_EUROPE         = "https://eu.lightify-api.org/lightify/services";
  const LIGHTIFY_USA            = "https://us.lightify-api.org/lightify/services";


  protected function cloudGET($url) {
    return $this->cloudRequest("GET", $url);
  }


  protected function cloudPOST($url, $args) {
    return $this->cloudRequest("POST", $url, $args);
  }


  protected function cloudLogin($userName, $password, $serialNumber) {
    if (file_exists($this->lightifyCookie) && !empty($this->cache_expires) && $this->cache_expires > time()) {
      return true;
    }

    $args = json_encode(array(
      'username'     => $userName,
      'password'     => $password, 
      'serialNumber' => $serialNumber)
    );
    $result = $this->cloudPOST(self::RESOURCE_SESSION, $args);

    if (is_object($result)) {
      $this->userId        = $result->userId;
      $this->securityToken = $result->securityToken;
      $this->cache_expires = time()+self::CLOUD_SESSION_TIMEOUT; //Lightify session time-out 14 min

      $this->saveCache();
      return true;
    }

    return false;
  }


  private function cloudRequest($method, $url, $args = null) {
    $headers = array(self::HEADER_CONTENT_TYPE);
    $client  = curl_init();

    if ($client !== false) {
      if ($url[0] == "/")
        $url = self::LIGHTIFY_EUROPE.$url;

      if (isset($this->userId)) {
        $headers[] = self::HEADER_AUTHORIZATION.$this->securityToken;
      }

      if (is_array($args)) {
        $data = array();

        foreach ($args as $k => $v)
          $data[] = "$k=".urlencode($v);

        $data = implode("&", $data);
      } elseif (is_string($args)) {
        $data = $args;
      }

      curl_setopt($client, CURLOPT_URL, $url);
      curl_setopt($client, CURLOPT_CUSTOMREQUEST, $method);
      curl_setopt($client, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($client, CURLOPT_HEADER, false);
      curl_setopt($client, CURLOPT_COOKIEJAR, $this->lightifyCookie);
      curl_setopt($client, CURLOPT_COOKIEFILE, $this->lightifyCookie);

     if ($method == 'POST') {
        if (!isset($data)) {
          $error = "You need to specify \$data when sending a POST.";

          $this->SendDebug("<GATEWAY|CLOUDREQUEST:ERROR>", $error, 0);
          IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:ERROR>   ".$error);

          return false;
        }

        curl_setopt($client, CURLOPT_POST, true);
        curl_setopt($client, CURLOPT_POSTFIELDS, $data);
      }

      curl_setopt($client, CURLOPT_HTTPHEADER, $headers);
      curl_setopt($client, CURLOPT_CONNECTTIMEOUT, 5);
      curl_setopt($client, CURLOPT_TIMEOUT, 5);
      curl_setopt($client, CURLOPT_SSL_VERIFYPEER, true); //for security this should always be set to true.
      curl_setopt($client, CURLOPT_SSL_VERIFYHOST, 2);    //for security this should always be set to 2.
      curl_setopt($client, CURLOPT_SSLVERSION, 1);

      $response = curl_exec($client);
      $info = curl_getinfo($client);

      if ($info['http_code'] == 401 || (!$response && curl_errno($client) != 0)) {
        $error = "HTTP request returned an error: ".curl_error($client);

        $this->SendDebug("<GATEWAY|CLOUDREQUEST:ERROR>", $error, 0);
        IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:ERROR>   ".$error);

        return false;
      }

      $jsonResult = json_decode($response);
      curl_close($client);

      if (array_key_exists("errorCode", $jsonResult)) {
        $error = "HTTP ".$info['http_code']." ".$jsonResult->errorCode.":".$jsonResult->errorMessage;

        $this->SendDebug("<GATEWAY|CLOUDREQUEST:ERROR>", $error, 0);
        IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:ERROR>   ".$error);

        return false;
      }

      if (!is_object($jsonResult) && ($method == "GET" || $url == self::RESOURCE_SESSION)) {
        if (empty($response)) {
          $error = "Received empty response from HTTP request $url.";

          $this->SendDebug("<GATEWAY|CLOUDREQUEST:ERROR>", $error, 0);
          IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:ERROR>   ".$error);

          return false;
        }
      }

      if ($info['http_code'] == 400) {
        if (!is_object($jsonResult)) {
          $error = "HTTP 400 response: ".str_replace(array("
","\r"), '', $response);

          $this->SendDebug("<GATEWAY|CLOUDREQUEST:ERROR>", $error, 0);
          IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:ERROR>   ".$error);

          return false;
        }
      }

      if ($info['download_content_length'] == 0) {
        return $info['http_code'] == 200;
      }

      if ($this->debug % 2) {
        $this->SendDebug("<GATEWAY|CLOUDREQUEST:RESULT>", $response, 0);
      }

      if ($this->message) {
        IPS_LogMessage("SymconOSR", "<GATEWAY|CLOUDREQUEST:RESULT>   ".$response);
      }

      return $jsonResult;
    }

    return false;
  }

Hallo,

ich schaue mir das morgen mal an.
Vielleicht klappt es ja.

Grüße,
Kai

Hallo,

so nochmal ein wenig danach geguckt:


//Zugangsdaten
$username='E-Mail Adresse';
$password='Passwort';

$URL='https://api.sipgate.com/v2/numbers';

$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); //for security this should always be set to true.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);    //for security this should always be set to 2.
curl_setopt($ch, CURLOPT_SSLVERSION, 1);

$return = curl_exec($ch);

curl_close($ch);

var_dump($return);

Damit bekommst du jetzt alle Telefonnummern aufgelistet.
Ich habe jetzt noch nicht weiter geschaut, wie man Umleitungen erstellen würde. Danach schaue ich morgen nochmal.
Da ich selbst kein Sipgate nutze, weiß ich noch nicht mal wie man bei Sipgate die Rufumleitungen im Webinterface einrichtet.

Du könntest dir ja ml die API hier anschauen: sipgate API
Vielleicht findest du ja die Stelle, an der man die Umleitungen einrichtet.

Grüße,
Kai

Hallo,

WOW, mit so viel Resonaz habe ich gar nicht gerechnet und bedanke mich für Eure Unterstützung.

Werde mich dann wohl erst mal mit dem Code-Schnipsel von Kai herantasten und berichten.

Gruß
Dieter

Hallo Kai,

also Dein Code Schnipsel funktionert bei mir - ich erhalte:
string mit items wie id, number, localized, type, endpointid, endpointalias, endpointurl

Was ich wohl benötige ist in der Gruppe ‚phones‘ und wollte erst mal folgendes probieren:

Erst mal nur einen GET command

$URL=‚https://api.sipgate.com/v2/userId/phonelines/phonelineId/forwardings‘;

allerdings ist mir nicht klar, was ich für ‚userId‘ und ‚phonelineId‘ einsetzen muss.

Um Rufumleitungen zu setzen wird man wohl einen PUT command absetzen müssen in der Form:

$URL = https://api.sipgate.com/v2/userId/phonelines/phonelineId/forwardings
plus einem Object das ‚desination, timeout, actice‘ beinhaltet

ich habe allerdings keine Ahnung wie.

Hallo,

das ist das was ich meinte, ich kenne Sipgate zu wenig.
Anscheinend gibt es noch unterschiedliche User, denen Rufnummern zugewiesen sind.

$URL = 'https://api.sipgate.com/v2/users';

Damit könntest du alles User auflisten:

string(155) "{"items":[{"id":"w0","firstname":"Kai","lastname":"XXXX","email":"XXXX@XXX.XXX","defaultDevice":"e0","busyOnBusy":false,"admin":true}]}"

$URL = 'https://api.sipgate.com/v2/w0/devices';

Damit kannst du dann alle Devices auflisten, die dem User gehören darin findest du anscheinend die PhoneLineID:

string(424) "{"items":[{"id":"e0","alias":"Telefon","type":"REGISTER","online":false,"dnd":false,"activePhonelines":[{"id":"p0","alias":"Kai"}],"activeGroups":[],"credentials":{"username":"XXXXXXX","password":"XXXXXXX","sipServer":"sipgate.de","outboundProxy":"sipgate.de","sipServerWebsocketUrl":"XXXXXXX"},"registered":[],"emergencyAddressId":"XXXXXXX","addressUrl":"XXXXXXX"}]}"

Hilft dir das?

Ich habe einige Sachen mit X verändert, keine Ahnung ob diese Daten nur auf meinen Account bezogen sind oder nicht. Daher mal lieber zur Vorsicht ein paar X! :smiley:

Grüße,
Kai

Ah - Super, ich bin der Sache ein bisschen näher.

Mit $URL = 'https://api.sipgate.com/v2/w0/phonelines/p0/forwardings

werden mir die aktuellen Umleitungen (3) angezeigt, denn wir haben gar kein Telefon angeschlossen, da wir das nur für Weiterleitungen nutzen möchten.

Entsprechend der API-Referenz müsste ich folgendes per PUT command senden:

curl --request PUT
–url https://api.sipgate.com/v2/w0/phonelines/p0/forwardings
–data ‚{„forwardings“:[{„destination“:"+4961112345678",„timeout“:10,„active“:„true“},{„destination“:„061198765432“,„timeout“:10,„active“:„true“}]}‘

Hast Du einen Tipp für mich, wie ich das in Deinem Beispiel/Frame Work umsetzten kann?
Ich vermute mal --data ist dabei ein Array?

Hallo,

ich versuche es mal.


//Array mit Umleitungen erzeugen
$data = array();
$forwarding["destination"] =  "+4961112345678";
$forwarding["timeoute"] = 10;
$forwarding["active"] = "true";

$data["forwardings"][0] = $forwarding;

$forwarding["destination"] =  "061198765432";
$forwarding["timeoute"] = 10;
$forwarding["active"] = "true";

$data["forwardings"][1] = $forwarding;

//print_r($data);

//Array in JSON umwandeln
$json = json_encode($data);
//echo $json;

$username='E-Mail Adresse';
$password='Passwort';

$URL = 'https://api.sipgate.com/v2/w0/phonelines/p0/forwardings '

$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_USERPWD, $username . ":" . $password);
//Evtl. noch diese Zeile einkommentieren, kann es gerade nicht testen.
//curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_json))); 
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS,$json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); //for security this should always be set to true.
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);    //for security this should always be set to 2.
curl_setopt($ch, CURLOPT_SSLVERSION, 1);
$return = curl_exec($ch);

curl_close($ch);

var_dump($return);  

Wie gesagt, ich kann es gerade nicht testen.

Grüße,
Kai