Project

General

Profile

Test Appel avec REST API Calls

Added by Guillaume PODGORSKI 4 months ago

Bonjour,

Je cherche à faire un appel car le REST API de wazo mais j'ai des difficultés à comprendre son fonctionnement.

J'arrive à générer un token :

root@prod-xivo1:~# curl -k -i -X POST -H 'Content-Type: application/json' -u "xivo-auth:XXXXXXXXX" "https://localhost:9497/0.1/token" -d '{"backend": "xivo_service", "expiration": 3600}'                      
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 422
Access-Control-Allow-Origin: *
Date: Wed, 12 Jul 2017 07:56:51 GMT
Server: prod-xivo1

{"data": {"token": "936545f5-df79-4209-beb8-d76067a2e636", "acls": ["confd.users.read", "ctid-ng.calls.read"], "utc_expires_at": "2017-07-12T08:56:51.354359", "xivo_uuid": "d91d5eaa-13bc-4e4d-908c-89e74e8bc5c6", "issued_at": "2017-07-12T09:56:51.354359", "utc_issued_at": "2017-07-12T07:56:51.354359", "auth_id": "7e25260a-81fc-4ba7-8beb-f52afa4c378b", "expires_at": "2017-07-12T10:56:51.354359", "xivo_user_uuid": null}}

Par contre je ne comprends pas comment effectuer un appel :

root@prod-xivo1:~# curl -k -i -X POST -H 'Content-Type: application/json' -u "xivo-auth:XXXXXXXXXXXXX" "https://localhost:9500/1.0/calls" -d '{                                               
  "items": [
    {
      "bridges": [
        "string" 
      ],
      "call_id": "string",
      "caller_id_name": "string",
      "caller_id_number": "string",
      "creation_time": "2017-07-11T13:59:45.057Z",
      "is_caller": true,
      "on_hold": true,
      "peer_caller_id_name": "string",
      "peer_caller_id_number": "string",
      "status": "string",
      "talking_to": {
        "{channel_id}": "string" 
      },
      "user_uuid": "string" 
    }
  ]
}'

Je cherche à pouvoir générer un appel depuis un formulaire sur mon site web. Un genre de call back pour les visiteurs de notre site web.

Merci par avance.

Guillaume


Replies (20)

RE: Test Appel avec REST API Calls - Added by Pascal Cadotte-Michaud 4 months ago

Bonjour,

lors de la création du token, tu as utilisé l'authentification du service xivo-auth. Il faut créer un nouvel utilisateur web service pour ton service.

Tu as également ajouter une ACL à l'utilisateur web service xivo-auth. (ctid-ng.calls.read) cet acl permet de lister les appels en cours. xivo-auth ne devrait pas avoir cette permission.

Pour créer un appel ton nouvel utilisateur devra avoir l'ACL "ctid-ng.calls.create"

Les paramêtres du POST sont les suivant:

{
  "destination": {
    "context": "string",
    "extension": "string",
    "priority": 0
  },
  "source": {
    "user": "string" 
  }
}

Le token doit également être dans le header X-Auth-Token

Voici un exemple avec curl

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Auth-Token: <token>' -d '{ \ 
   "destination": { \ 
     "context": "default", \ 
     "extension": "5555551234", \ 
     "priority": 0 \ 
   }, \ 
   "source": { \ 
     "user": "<user-uuid>" \ 
   }
 }' "https://localhost:9500/1.0/calls" 

Pour faire des tests avec les API tu peux utiliser http://&lt;wazo&gt;/api ton token peut être récupérer sur auth.wazo.community et coller dans la case à gauche du bouton "Explore". Quand tu cliques sur "Try it out" depuis la doc la commande curl équivalente est affiché.

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 4 months ago

Bonjour Pascal,

Merci pour les infos, j'ai un peu avancé.

Je voulais savoir où récupérer le <user-uuid> dans l'exemple que tu l'as fourni ?

Lorsque je teste maintenant j'ai :

{
  "timestamp": 1499860585.135244,
  "message": "Invalid extension",
  "error_id": "invalid-extension",
  "details": {
    "exten": "111",
    "context": "default" 
  }
}

avec comme requete :

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Auth-Token: ca5d7db9-cf91-40ce-9823-cf3420316e63' -d '{ \ 
   "destination": { \ 
     "context": "default", \ 
     "extension": "111", \ 
     "priority": 1 \ 
   }, \ 
   "source": { \ 
     "user": "string" \ 
   } \ 
 }' 'https://192.168.10.9:9500/1.0/calls'

Merci par avance.

Guillaume

RE: Test Appel avec REST API Calls - Added by Dominique Da Fonseca 4 months ago

Bonjour
le user-uuid doit correspondre a l'utilisateur qui émet l'appel, le 111 est bien une extension valide ?

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 4 months ago

Oui, c'est le poste de mon collègue.

Quand tu dis utilisateur c'est son extension style 212 ou son identifiant ligne sip : genre un truc comme ça : SIP/3sb7ca3x

Merci

Guillaume

RE: Test Appel avec REST API Calls - Added by julien dutilleul 4 months ago

hello,

le user-uuid n'est pas l'extention de l'utilisateur.

tu peux le retrouver avec une requête comme:

curl -X GET --header 'Accept: application/json' --header 'Authorization: Basic eGl2by1hcGk6eGl2by1hcGk=' 'https://ton-wazo.community:9486/1.1/users?search=111'

et dans le champ uuid, tu auras l'uuid de l'utilisateur, et ainsi, avoir toutes les infos de l’utilisateur avec:

curl -X GET --header 'Accept: application/json' --header 'Authorization: Basic eGl2by1hcGk6eGl2by1hcGk=' 'https://ton-wazo.community:9486/1.1/users/<user-uuid>'

ça sous-entend que ton visiteur de site web possède un compte ... où alors, tu en utilise un générique (du coup, le <user-uuid>. reste le même.

euh, question bête .. je suis visiteur sur ton site, je clique pour appeler, il se passe quoi concrètement ?
je peux raccrocher ? je dois autoriser mon navigateur web à capter l'audio d'une de mes sources audio ??

bon courage !

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 4 months ago

Bonjour,

Merci pour les infos.

Alors concrètement :

Tu es visiteur sur mon site tu veux être rappeler.
Tu cliques sur le bouton CallBack, il t'est demandé de saisir ton numéro de téléphone.

Et derrière une action doit faire lancer un appel entre le poste d'un commercial vers ce numéro saisi par le visiteur.

Guillaume

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 4 months ago

D'après l'erreur, l'extension 111@default n'est pas joignable par personne, alors même si tu obtiens le bon user-uuid tu ne pourras pas passer ton appel. Que dit asterisk -rx 'dialplan show 111@default'?

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 4 months ago

Salut,

Voici le résultat de la commande.

Il s'agit d'un groupe :

root@prod-xivo1:~# asterisk -rx 'dialplan show 111@default'
[ Context 'default' created by 'pbx_config' ]
  '111' =>          1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(group,s,1(17,))                      [pbx_config]
[ Included context 'default' created by 'pbx_config' ]
  '111' =>          1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(group,s,1(17,))                      [pbx_config]

Voici l'utilisateur associé :

root@prod-xivo1:~# asterisk -rx 'dialplan show 211@default'
[ Context 'default' created by 'pbx_config' ]
  '211' =>          hint: SIP/xwozjo                              [pbx_config]
                    1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(user,s,1(5,,42))                     [pbx_config]
[ Included context 'default' created by 'pbx_config' ]
  '211' =>          hint: SIP/xwozjo                              [pbx_config]
                    1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(user,s,1(5,,42))                     [pbx_config]


J'ai le même résultat si j'essaie d'appeler l'extension de l'utilisateur (211) à la place de son groupe (111)

Merci

Guillaume

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 4 months ago

Y'a un truc étrange dans le retour de la commande: le contexte default est inclus dans le contexte default... tu dois avoir une boucle d'inclusion de contextes, par exemple default inclut to-extern qui lui-même inclut default ?

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

Bonjour,

Désolé pour la réponse tardive mais j'ai du passer à autre chose.

Du coup j'avais un context inclu dans un autre. J'ai corrigé. Maintenant ça donne :

root@prod-xivo1:/etc# asterisk -rx 'dialplan show 111@default'
[ Context 'default' created by 'pbx_config' ]
  '111' =>          1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(group,s,1(17,))                      [pbx_config]

-= 1 extension (3 priorities) in 1 context. =-

J'ai mis à jour Wazo entre temps avec la dernière version.

Le problème persiste :

Requête :

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Auth-Token: 869f9648-2006-4c73-8764-8cbefeae5868' -d '{ \ 
   "destination": { \ 
     "context": "default", \ 
     "extension": "112", \ 
     "priority": 1 \ 
   }, \ 
   "source": { \ 
     "from_mobile": false, \ 
     "line_id": 0, \ 
     "user": "Callback" \ 
   }, \ 
   "variables": {} \ 
 }' 'https://192.168.10.9:9500/1.0/calls'

Résultat :

{
  "timestamp": 1502264197.060123,
  "message": "Invalid extension",
  "error_id": "invalid-extension",
  "details": {
    "exten": "112",
    "context": "default" 
  }
}

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 3 months ago

Et 112 est un autre groupe?
Que dit asterisk -rx 'dialplan show 112@default'?

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

Voici le résultat :

root@prod-xivo1:~# asterisk -rx 'dialplan show 112@default' 
[ Context 'default' created by 'pbx_config' ]
  '112' =>          1. Set(XIVO_BASE_CONTEXT=${CONTEXT})          [pbx_config]
                    2. Set(XIVO_BASE_EXTEN=${EXTEN})              [pbx_config]
                    3. GoSub(group,s,1(40,))                      [pbx_config]

-= 1 extension (3 priorities) in 1 context. =-

J'ai essayé la même chose avec un utilisateur et non un groupe. Idem
J'ai même réussi à récupérer les UUID.

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'X-Auth-Token: 4b6b5a93-701f-48c4-aa4f-012af37c7755' -d '{ \ 
   "destination": { \ 
     "context": "default", \ 
     "extension": "203", \ 
     "priority": 1 \ 
   }, \ 
   "source": { \ 
     "from_mobile": false, \ 
     "line_id": 11, \ 
     "user": "90dd86c2-859d-4f1c-b6b6-b164f5f1dcb4" \ 
   }, \ 
   "variables": {} \ 
 }' 'https://192.168.10.9:9500/1.0/calls'

Résultat identique

{
  "timestamp": 1502269519.070253,
  "message": "Invalid extension",
  "error_id": "invalid-extension",
  "details": {
    "exten": "203",
    "context": "default" 
  }
}

Fichier de log :

root@prod-xivo1:~# tail -10f /var/log/xivo-ctid-ng.log 
2017-08-09 11:01:32,318 [23383] (INFO) (xivo_ctid_ng): (192.168.2.100) OPTIONS https://192.168.10.9:9500/1.0/calls 200
2017-08-09 11:01:32,414 [23383] (ERROR) (xivo.rest_api_helpers): Invalid extension: {'exten': u'203', 'context': u'default'}
2017-08-09 11:01:32,415 [23383] (INFO) (xivo_ctid_ng): (192.168.2.100) POST https://192.168.10.9:9500/1.0/calls 400
2017-08-09 11:05:18,971 [23383] (INFO) (xivo_ctid_ng): (192.168.2.100) OPTIONS https://192.168.10.9:9500/1.0/calls 200
2017-08-09 11:05:19,070 [23383] (ERROR) (xivo.rest_api_helpers): Invalid extension: {'exten': u'203', 'context': u'default'}

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 3 months ago

Y'a vraiment un truc qui m'échappe, ça devrait fonctionner, d'après ce que je vois.
Alors on va aller creuser un peu plus loin: pour savoir si une extension existe, xivo-ctid-ng va demander à xivo-amid de demander à l'AJAM d'Asterisk. On va reproduire cette requête, pour voir ce que xivo-amid renvoie.
Je te joins un petit script Python qui reproduit la requête. Celui-ci prend 2 arguments : l'extension et le contexte à tester.Tu devrais voir un truc du genre:

root@sd-skaro:~# python /tmp/amid.py 101 default
[{u'EventList': u'start',                       
  u'Message': u'DialPlan list will follow',     
  u'Response': u'Success'},                     
 {u'Application': u'SCCP/101',                  
  u'Context': u'default',                       
  u'Event': u'ListDialplan',                    
  u'Extension': u'101',                         
  u'Priority': u'hint',                         
  u'Registrar': u'pbx_config'},                 
 {u'AppData': u'XIVO_BASE_CONTEXT=${CONTEXT}',  
  u'Application': u'Set',                       
  u'Context': u'default',                       
  u'Event': u'ListDialplan',                    
  u'Extension': u'101',                         
  u'Priority': u'1',                            
  u'Registrar': u'pbx_config'},                 
 {u'AppData': u'XIVO_BASE_EXTEN=${EXTEN}',      
  u'Application': u'Set',                       
  u'Context': u'default',                       
  u'Event': u'ListDialplan',                    
  u'Extension': u'101',                         
  u'Priority': u'2',                            
  u'Registrar': u'pbx_config'},                 
 {u'AppData': u'user,s,1(413,,3560)',           
  u'Application': u'GoSub',                     
  u'Context': u'default',                       
  u'Event': u'ListDialplan',                    
  u'Extension': u'101',                         
  u'Priority': u'3',                            
  u'Registrar': u'pbx_config'},                 
 {u'Event': u'ShowDialPlanComplete',            
  u'EventList': u'Complete',                    
  u'ListContexts': u'6',                        
  u'ListExtensions': u'1',                      
  u'ListItems': u'4',                           
  u'ListPriorities': u'4'}]                     

Peux-tu nous donner la sortie de ce script?

amid.py View (712 Bytes)

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

J'ai une erreur SSL.

Peut-être à l'origine de tous mes soucis.

root@prod-xivo1:~# python /root/amid.py 203 default
Traceback (most recent call last):
  File "/root/amid.py", line 22, in <module>
    'Extension': exten})
  File "/usr/lib/python2.7/dist-packages/xivo_amid_client/commands/action.py", line 27, in __call__
    r = self.session.post(url, json=params, params=kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 500, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 457, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 569, in send
    r = adapter.send(request, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/adapters.py", line 420, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 3 months ago

Pardon, j'ai raté une étape, le script précédent essaye de vérifier que le certificat autosigné est trusté, alors qu'il ne l'est pas. La nouvelle version que je joins n'a pas ce problème.

amid.py View (737 Bytes)

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

J'ai une Permission denied.

root@prod-xivo1:~# python /root/amid.py 203 default
[{u'Message': u'Permission denied', u'Response': u'Error'}]

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 3 months ago

OK, ça veut dire que l'utilisateur AMI xivo_amid n'a pas les droits pour utiliser l'AMI/AJAM, tu vois quoi dans /etc/asterisk/manager.conf? et dans /etc/asterisk/manager.d/01-xivo.conf?

Dans /etc/asterisk/manager.conf, j'ai:

#include manager.d/*

Dans /etc/asterisk/manager.d/01-xivo.conf:

[xivo_amid]                                  
secret = ***                         
deny=0.0.0.0/0.0.0.0                         
permit=127.0.0.1/255.255.255.0               
read = system,call,agent,user,config,dialplan
write = all                                  

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

Alors :

moi j'ai tout dans /etc/asterisk/manager.conf :


[general]
enabled = yes
webenabled = yes
port = 5038
bindaddr = 0.0.0.0

[xivo_agent]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
write = agent,system,user
;read =system,call,command,agent,user,config,dialplan,originate

[xivo_amid]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,agent,user,config,dialplan
write = all

[xivo_cti_user]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read =system,call,command,agent,user,config,dialplan,originate
write = system,call,command,agent,user,config,dialplan,originate
writetimeout = 2000
eventfilter = !Event: Newexten

[xivo_munin_user]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user,dtmf
write = system,call,log,verbose,command,agent,user,dtmf

[xivo_monit_user]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
write = system

[xivo_provd]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
write = system

[xivouser]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all
write = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all

[SQMonitor]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=0.0.0.0/0.0.0.0
read = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all
write = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all

[benoit]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=0.0.0.0/0.0.0.0
read = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all
write = system,call,log,verbose,command,agent,user,config,dtmf,reporting,dialplan,originate,agi,cc,aoc,all

RE: Test Appel avec REST API Calls - Added by Guillaume PODGORSKI 3 months ago

Salut,

Le problème est réglé.

J'ai rajouté la ligne : write = all -> qui n'existait pas dans la config [xivo_amid]

/etc/asterisk/manager.conf

[xivo_amid]
secret = **************
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = system,call,agent,user,config,dialplan
*write = all*

Il a fallu restart le service de Wazo complètement pour que la modification s'applique.

Mes problèmes d'appels avec le Xivo-Client ont été résolu aussi. Du coup c'est la fête :-)

Merci beaucoup.

Bonne fin de journée.

Guillaume

RE: Test Appel avec REST API Calls - Added by Sébastien Duthil 3 months ago

Je ne comprends pas trop pourquoi cette ligne aurait disparu... Et puis elle était là quand tu nous a collé le contenu de /etc/asterisk/manager.conf. Alors j'ai pas compris :)

Sinon, tu devrais avoir un fichier /etc/asterisk/manager.conf.dpkg-dist ou quelque chose du genre, qui contient:

#include manager.d/*

Tu devrais:
1. extraire la config custom de manager.conf dans manager.d/custom.conf (les sections xivouser, SQMonitor, benoit)
2. remplacer manager.conf par manager.conf.dpkg-dist

Ça te permettra de pas avoir à gérer les diff de configuration si tu mets à jour ton Wazo et que la mise à jour veut changer la config de l'AMI: la mise à jour changera manager.d/01-xivo.conf et ne touchera pas à manager.conf ni manager.d/custom.conf

    (1-20/20)