├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── DESCRIPTION.rst ├── LICENSE ├── README.md ├── exemplos └── ura.py ├── setup.cfg ├── setup.py ├── tests ├── __init__.py ├── test_cliente.py └── test_helper.py └── totalvoice ├── __init__.py └── cliente ├── __init__.py └── api ├── __init__.py ├── audio.py ├── bina.py ├── central ├── __init__.py ├── ramal.py ├── ura.py └── webphone.py ├── chamada.py ├── composto.py ├── conferencia.py ├── conta.py ├── did.py ├── fila.py ├── helper ├── __init__.py ├── routes.py └── utils.py ├── minhaconta.py ├── sms.py ├── totalvoice.py └── tts.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .vscode/ 3 | Carlos.py 4 | Teste.py~ 5 | build/ 6 | setup.cfg~ 7 | teste.py 8 | dist/ 9 | totalvoice.egg-info/ 10 | testes/ -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - '2.7' 4 | - '3.4' 5 | - '3.5' 6 | - '3.6' 7 | install: 8 | - pip install requests 9 | - pip install -U pytest 10 | - pip install -U setuptools 11 | script: 12 | - py.test tests/ 13 | notifications: 14 | slack: 15 | rooms: 16 | secure: qtDNNTqz9ah+b1nyGQ1sRL9YWnyuLiHu+cbE+jH5IBCKuacstbbxLMfD5l7TTSPAxELRLagOTtBy4OScCpE/eiaj7hBRfjSgoXJt/USJVLte+quxJoSX++B11d853WqVwMdWqFQD0mXBxwmyCSZDCyVkcyhFrhjRZnM/SeS8f6jXCwiS3MDgDY3sMW2IxNHe+wtBi+BX8XzslePc/Lyfkq/X6MxiJJs1SnfXQUe7I6G3fmm134fwHgEYfyWu8mBTIhqQxiF8mE4CHDh3V//zPAiO1GAFdXJPIjqLlEdk4rMERTWJdscPaRc7D0Ffwzg/B41CcA41/WhARYc5+cztyM6rOteDaL6yIJoP6Jq4Q38jgZvmuWTH8b1FZPWctBShro4JIztj9cttQ7vyMQr1oVSrwAzHjP4MVDU9cAftrmfqsCXVrfEw6G2MO9PiJ8pFYsKfEoLC16JnybiEc//aUhjKaoqmw16v996zSLXu/lPDFdVSnhffNMT6VnsBxhu0u2icFJJYiqjSNQbaVkfQtUAdCdFrT7BRwFs+wq7TT8NYYKbQapjcQvooN7dAMHN0Po7tuP9ezvo2zxsZYGhS3W4l6Z2zsHidV+I4RzfLMoO3OVdFjZkdu/5GxXqNVa2PvE32a29kWfzubnbREQFLAdMx+TOT1VG/bhxnndiMGHU= 17 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribua com a biblioteca - Totalvoice 2 | 3 | ## Como contribuir 4 | 5 | Antes de mais nada, obrigado por contribuir com a comunidade! 6 | 7 | Antes de abrir uma nova Issue ou Pull Request, sempre procure pelo problema ou puxe a lista de Pull Requests - As chances são boas de que, se você encontrou um problema, outra pessoa também pode ter encontrado isso; 8 | 9 | Sempre verifique no branch **master** - para ver se o bug relatado ainda não foi corrigido. 10 | 11 | ## Issues 12 | 13 | Encontrou algum problema? Nós aceitamos suas sugestões ou relatos de bugs criados [aqui](https://github.com/totalvoice/totalvoice-python/issues). 14 | 15 | ## Pull Requests 16 | 17 | Todas as solicitações de melhoria serão muito bem vindas, se você deseja contribuir para que a biblioteca se torne cada vez melhor, abra um Pull Request [aqui](https://github.com/totalvoice/totalvoice-python/pulls). 18 | 19 | - Adição de testes unitários obrigatórios; 20 | - Atualização da documentação (atualize o README.md); 21 | - Crie branchs a partir do master para enviar o seu Pull Request (Pull Requests diretamente no master não serão aceitos); 22 | - 1 Pull Request por nova feature; 23 | - Seja coerente nos commits, facilita a conferência e o entendimento, com isso, a chance de ser aprovado será maior; 24 | 25 | ### Equipe Totalvoice :) -------------------------------------------------------------------------------- /DESCRIPTION.rst: -------------------------------------------------------------------------------- 1 | API da Totalvoice para realização de chamadas, envios de sms, composto, audios, uras em python. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Carlos Henrique 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Totalvoice-python 2 | Cliente em Python para API da Totalvoice 3 | 4 | [![Build Status](https://travis-ci.org/totalvoice/totalvoice-python.svg?branch=master)](https://travis-ci.org/totalvoice/totalvoice-python) 5 | 6 | ## Pré requisitos 7 | 8 | ``` 9 | $ pip install totalvoice 10 | ``` 11 | 12 | ## Como utilizar (how to) 13 | 14 | Segue abaixo a forma de utilização dos métodos da API da totalvoice! 15 | ###### Lembrete: A partir a versão `1.7.0` não é possível informar o `HOST` ao instanciar o Cliente. 16 | ### Chamadas 17 | Módulo responsável por criação de chamadas, relatórios de chamadas, url da gravação, etc. 18 | 19 | 20 | ```python 21 | from totalvoice.cliente import Cliente 22 | 23 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 24 | 25 | #Cria chamada 26 | numero_origem = "48999999999" 27 | numero_destino = "48900000000" 28 | response = cliente.chamada.enviar(numero_origem, numero_destino) 29 | print(response) 30 | 31 | #Get chamada 32 | id = "1958" 33 | response = cliente.chamada.get_by_id(id) 34 | print(response) 35 | 36 | #Get URL da chamada 37 | id = "1958" 38 | response = cliente.chamada.get_gravacao_chamada(id) 39 | print(response) 40 | 41 | #Relatório de chamada 42 | data_inicio = "2016-03-30T17:15:59-03:00" 43 | data_fim = "2016-03-30T17:15:59-03:00" 44 | response = cliente.chamada.get_relatorio(data_inicio, data_fim) 45 | print(response) 46 | 47 | #Escutar chamada (BETA) 48 | id_chamada = "1958" 49 | numero = "48999999999" 50 | modo = 1 #1=escuta, 2=sussurro, 3=conferência. 51 | response = cliente.chamada.escuta_chamada(id_chamada, numero, modo) 52 | print(response) 53 | 54 | #Deletar 55 | id = "1958" 56 | response = cliente.chamada.deletar(id) 57 | print(response) 58 | 59 | 60 | ``` 61 | 62 | ### SMS 63 | Módulo responsável por criação de SMS, relatórios. 64 | 65 | ```python 66 | from totalvoice.cliente import Cliente 67 | 68 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 69 | 70 | #Cria sms 71 | numero_destino = "48999999999" 72 | mensagem = "teste envio sms" 73 | response = cliente.sms.enviar(numero_destino, mensagem) 74 | print(response) 75 | 76 | #Get sms 77 | id = "1958" 78 | response = cliente.sms.get_by_id(id) 79 | print(response) 80 | 81 | #Relatório de sms 82 | data_inicio = "2016-03-30T17:15:59-03:00" 83 | data_fim = "2016-03-30T17:15:59-03:00" 84 | response = cliente.sms.get_relatorio(data_inicio, data_fim) 85 | print(response) 86 | 87 | ``` 88 | 89 | ### Audio 90 | Módulo responsável por criação de Audios. 91 | 92 | ```python 93 | from totalvoice.cliente import Cliente 94 | 95 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 96 | 97 | #Cria audio 98 | numero = "48999999999" 99 | url_audio = "http://fooo.bar" 100 | response = cliente.audio.enviar(numero, url_audio) 101 | print(response) 102 | 103 | #Get audio 104 | id = "1958" 105 | response = cliente.audio.get_by_id(id) 106 | print(response) 107 | 108 | #Relatório de audio 109 | data_inicio = "2016-03-30T17:15:59-03:00" 110 | data_fim = "2016-03-30T17:15:59-03:00" 111 | response = cliente.audio.get_relatorio(data_inicio, data_fim) 112 | print(response) 113 | 114 | ``` 115 | 116 | ### TTS 117 | Módulo responsável por criação de Audios. 118 | 119 | ```python 120 | from totalvoice.cliente import Cliente 121 | 122 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 123 | 124 | #Cria TTS 125 | numero_destino = "48999999999" 126 | mensagem = "Olá, esta mensagem será lida" 127 | response = cliente.tts.enviar(numero_destino, mensagem) 128 | print(response) 129 | 130 | #Get TTS 131 | id = "1958" 132 | response = cliente.tts.get_by_id(id) 133 | print(response) 134 | 135 | #Relatório de TTS 136 | data_inicio = "2016-03-30T17:15:59-03:00" 137 | data_fim = "2016-03-30T17:15:59-03:00" 138 | response = cliente.tts.get_relatorio(data_inicio, data_fim) 139 | print(response) 140 | 141 | ``` 142 | 143 | ### Conferência 144 | Módulo responsável por criação de Conferências. 145 | 146 | ```python 147 | from totalvoice.cliente import Cliente 148 | 149 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 150 | 151 | #Cria conferência 152 | response = cliente.conferencia.cria_conferencia() 153 | print(response) 154 | 155 | #Get conferência 156 | id = "1958" 157 | response = cliente.conferencia.get_by_id(id) 158 | print(response) 159 | 160 | #Add número na conferência 161 | id_conferencia = "15" 162 | numero = "48999999999" 163 | response = cliente.conferencia.add_numero_conferencia(id_conferencia, numero) 164 | print(response) 165 | 166 | ``` 167 | 168 | ### DID 169 | Módulo responsável pelo gerenciamento de did (números de telefone) 170 | 171 | ```python 172 | from totalvoice.cliente import Cliente 173 | 174 | cliente = Cliente("{{access-token}}", 'HOST') #ex: api.totalvoice.com.br 175 | 176 | #Lista todos os dids disponíveis em estoque 177 | response = cliente.did.get_estoque() 178 | print(response) 179 | 180 | #Compra did do estoque 181 | did_id = "1958" 182 | response = cliente.did.compra_estoque(did_id) 183 | print(response) 184 | 185 | #Lista todos os dids que a conta possuí 186 | response = cliente.did.get_my_dids() 187 | print(response) 188 | 189 | #Edita os dados do seu DID, podendo alterar o ramal id e a ura id 190 | did_id = "1" 191 | ramal_id = None 192 | ura_id = "10" 193 | response = cliente.did.editar(did_id, ura_id, ramal_id) 194 | print(response) 195 | 196 | #Remove o did da conta 197 | did_id = "1" 198 | response = cliente.did.deletar(did_id) 199 | print(response) 200 | 201 | #Lista os dados de uma chamada recebida 202 | chamada_id = "5599" 203 | response = cliente.did.get_chamada_recebida(chamada_id) 204 | print(response) 205 | 206 | ``` 207 | 208 | ## Licença 209 | 210 | MIT 211 | -------------------------------------------------------------------------------- /exemplos/ura.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from totalvoice.cliente import Cliente 3 | 4 | cliente = Cliente('SEU_TOKEN', 'api.totalvoice.com.br') #ex: api.totalvoice.com.br 5 | 6 | nome_ura = "Ura Diurna"; 7 | json_ura = "{'nome': 'Ura Dinamica','dados':[{'acao':'tts','opcao':'','menu': 'menu 1','acao_dados':{'mensagem': 'Olá, bem vindo a totalvoice, digite 1 para suporte, 2 para financeiro'}},{'acao':'transfer','opcao':'1','menu': 'menu 1','acao_dados':{'numero_telefone': '4000'}},{'acao':'transfer','opcao':'2','menu': 'menu 1','acao_dados':{'numero_telefone': '4010'}}]}'}"; 8 | response = cliente.ura.criar(nome_ura, json_ura) 9 | print (response) 10 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | universal=1 3 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # coding=UTF-8 2 | """A setuptools based setup module. 3 | See: 4 | https://packaging.python.org/en/latest/distributing.html 5 | https://github.com/pypa/sampleproject 6 | """ 7 | 8 | # Always prefer setuptools over distutils 9 | from setuptools import setup, find_packages 10 | # To use a consistent encoding 11 | from codecs import open 12 | from os import path 13 | 14 | here = path.abspath(path.dirname(__file__)) 15 | 16 | # Get the long description from the relevant file 17 | try: 18 | with open(path.join(here, 'DESCRIPTION.rst'), encoding='utf-8') as f: 19 | long_description = f.read() 20 | except: 21 | long_description = '' 22 | 23 | setup( 24 | # Ver PEP 426 (name) 25 | # Iniciar ou terminar com letra ou número 26 | name='totalvoice', 27 | 28 | # Ver PEP 440 29 | # O formato pode ser assim: 30 | 31 | # 1.2.0.dev1 # Development release 32 | # 1.2.0a1 Alpha Release 33 | # 1.2.0b1 Beta Release 34 | # 1.2.0rc1 Release Candidate 35 | # 1.2.0 Final Release 36 | # 1.2.0.post1 Post Release 37 | # 15.10 Date based release 38 | # 23 Serial release 39 | 40 | version='1.7.0', 41 | 42 | description='Biblioteca da Totalvoice em python', 43 | long_description=long_description, 44 | 45 | # A página do projeto 46 | url='https://github.com/totalvoice/totalvoice-python', 47 | 48 | # Detalhes do Autor 49 | author=u'Carlos Henrique dos Santos', 50 | author_email='carlos@totalvoice.com.br', 51 | 52 | # Choose your license 53 | license='MIT', 54 | 55 | # See https://pypi.python.org/pypi?%3Aaction=list_classifiers 56 | classifiers=[ 57 | # How mature is this project? Common values are 58 | # 3 - Alpha 59 | # 4 - Beta 60 | # 5 - Production/Stable 61 | 'Development Status :: 4 - Beta', 62 | 63 | # Indicate who your project is intended for 64 | 'Intended Audience :: Developers', 65 | 'Topic :: Education :: Testing', 66 | 67 | # Pick your license as you wish (should match "license" above) 68 | 'License :: OSI Approved :: MIT License', 69 | 70 | # Specify the Python versions you support here. In particular, ensure 71 | # that you indicate whether you support Python 2, Python 3 or both. 72 | 'Programming Language :: Python :: 3', 73 | 'Programming Language :: Python :: 3.2', 74 | 'Programming Language :: Python :: 3.3', 75 | 'Programming Language :: Python :: 3.4', 76 | ], 77 | 78 | # What does your project relate to? 79 | keywords='api rest totalvoice telefonia ligação', 80 | 81 | # You can just specify the packages manually here if your project is 82 | # simple. Or you can use find_packages(). 83 | packages=find_packages(exclude=['contrib', 'docs', 'tests*']), 84 | 85 | # List run-time dependencies here. These will be installed by pip when 86 | # your project is installed. For an analysis of "install_requires" vs pip's 87 | # requirements files see: 88 | # https://packaging.python.org/en/latest/requirements.html 89 | #install_requires=['sh>=1.11'], 90 | 91 | # List additional groups of dependencies here (e.g. development 92 | # dependencies). You can install these using the following syntax, 93 | # for example: 94 | # $ pip install -e .[dev,test] 95 | # extras_require={ 96 | # 'dev': ['check-manifest'], 97 | # 'test': ['coverage'], 98 | # }, 99 | 100 | # If there are data files included in your packages that need to be 101 | # installed, specify them here. If using Python 2.6 or less, then these 102 | # have to be included in MANIFEST.in as well. 103 | # package_data={ 104 | # 'data': ['dados.json'], 105 | # }, 106 | 107 | # Although 'package_data' is the preferred approach, in some case you may 108 | # need to place data files outside of your packages. See: 109 | # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa 110 | # In this case, 'data_file' will be installed into '/my_data' 111 | # data_files=[('python101', ['data/dados.json'])], 112 | 113 | # To provide executable scripts, use entry points in preference to the 114 | # "scripts" keyword. Entry points provide cross-platform support and allow 115 | # pip to create the appropriate form of executable for the target platform. 116 | # entry_points={ 117 | # 'console_scripts': [ 118 | # 'sample=sample:main', 119 | # ], 120 | # }, 121 | ) -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totalvoice/totalvoice-python/3dc80ef830f0ea78dbeffad7dc9153d45de4f0da/tests/__init__.py -------------------------------------------------------------------------------- /tests/test_cliente.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from totalvoice.cliente import Cliente 3 | from totalvoice.cliente.api import * 4 | 5 | class TestCliente(object): 6 | 7 | def setup(self): 8 | self.cliente = Cliente("token", "host") 9 | 10 | def test_cliente(self): 11 | assert self.cliente.host is not None 12 | assert self.cliente.host == "https://host" 13 | assert self.cliente.access_token is not None 14 | assert self.cliente.access_token == "token" 15 | 16 | def test_api(self): 17 | assert self.cliente.access_token is not None 18 | assert isinstance(self.cliente.api, Api) 19 | 20 | def test_api_chamada(self): 21 | assert self.cliente.api.chamada is not None 22 | assert isinstance(self.cliente.api.chamada, Chamada) 23 | 24 | def test_api_tts(self): 25 | assert self.cliente.api.tts is not None 26 | assert isinstance(self.cliente.api.tts, Tts) 27 | 28 | def test_api_audio(self): 29 | assert self.cliente.api.audio is not None 30 | assert isinstance(self.cliente.api.audio, Audio) 31 | 32 | def test_api_sms(self): 33 | assert self.cliente.api.sms is not None 34 | assert isinstance(self.cliente.api.sms, Sms) 35 | 36 | def test_api_composto(self): 37 | assert self.cliente.api.composto is not None 38 | assert isinstance(self.cliente.api.composto, Composto) 39 | 40 | def test_api_conferencia(self): 41 | assert self.cliente.api.conferencia is not None 42 | assert isinstance(self.cliente.api.conferencia, Conferencia) 43 | 44 | def test_api_minhaconta(self): 45 | assert self.cliente.api.minha_conta is not None 46 | assert isinstance(self.cliente.api.minha_conta, MinhaConta) 47 | 48 | def test_api_conta(self): 49 | assert self.cliente.api.conta is not None 50 | assert isinstance(self.cliente.api.conta, Conta) 51 | 52 | def test_api_bina(self): 53 | assert self.cliente.api.bina is not None 54 | assert isinstance(self.cliente.api.bina, Bina) 55 | 56 | def test_api_webphone(self): 57 | assert self.cliente.api.webphone is not None 58 | assert isinstance(self.cliente.api.webphone, Webphone) 59 | 60 | def test_api_ramal(self): 61 | assert self.cliente.api.ramal is not None 62 | assert isinstance(self.cliente.api.ramal, Ramal) 63 | 64 | def test_api_ura(self): 65 | assert self.cliente.api.ura is not None 66 | assert isinstance(self.cliente.api.ura, Ura) -------------------------------------------------------------------------------- /tests/test_helper.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from totalvoice.cliente.api.helper import utils 3 | 4 | 5 | class TestHelper(object): 6 | 7 | def test_header(self): 8 | header = utils.build_header("token") 9 | assert header is not None 10 | assert header['Content-Type'] == 'application/json' 11 | assert header['Accept'] == 'application/json' 12 | assert header['Access-Token'] == 'token' 13 | 14 | def test_host(self): 15 | host = utils.build_host("host") 16 | assert host is not None 17 | assert host == 'https://host' 18 | -------------------------------------------------------------------------------- /totalvoice/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totalvoice/totalvoice-python/3dc80ef830f0ea78dbeffad7dc9153d45de4f0da/totalvoice/__init__.py -------------------------------------------------------------------------------- /totalvoice/cliente/__init__.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from totalvoice.cliente.api.helper import utils 4 | 5 | class Cliente(object): 6 | 7 | def __init__(self, access_token, host = None): 8 | self.access_token = access_token 9 | self.host = utils.build_host() 10 | self._api = None 11 | 12 | @property 13 | def api(self): 14 | """ 15 | :Descrição: 16 | 17 | Acessa a API da Totalvoice 18 | 19 | :returns: 20 | 21 | API Totalvoice 22 | 23 | :rtype: 24 | 25 | totalvoice.cliente.api.Api 26 | """ 27 | if self._api is None: 28 | from totalvoice.cliente.api import Api 29 | self._api = Api(self) 30 | return self._api 31 | 32 | @property 33 | def chamada(self): 34 | """ 35 | :Descrição: 36 | 37 | Acessa Chamada da Totalvoice 38 | 39 | :returns: 40 | 41 | Chamada Totalvoice 42 | 43 | :rtype: 44 | 45 | totalvoice.cliente.api.chamada.Chamada 46 | """ 47 | return self.api.chamada 48 | 49 | @property 50 | def tts(self): 51 | """ 52 | :Descrição: 53 | 54 | Acessa TTS da Totalvoice 55 | 56 | :returns: 57 | 58 | TTS Totalvoice 59 | 60 | :rtype: 61 | 62 | totalvoice.cliente.api.tts.Tts 63 | """ 64 | return self.api.tts 65 | 66 | @property 67 | def audio(self): 68 | """ 69 | :Descrição: 70 | 71 | Acessa Audio da Totalvoice 72 | 73 | :returns: 74 | 75 | Audio Totalvoice 76 | 77 | :rtype: 78 | 79 | totalvoice.cliente.api.audio.Audio 80 | """ 81 | return self.api.audio 82 | 83 | @property 84 | def sms(self): 85 | """ 86 | :Descrição: 87 | 88 | Acessa SMS da Totalvoice 89 | 90 | :returns: 91 | 92 | SMS Totalvoice 93 | 94 | :rtype: 95 | 96 | totalvoice.cliente.api.sms.Sms 97 | """ 98 | return self.api.sms 99 | 100 | @property 101 | def conferencia(self): 102 | """ 103 | :Descrição: 104 | 105 | Acessa Conferência da Totalvoice 106 | 107 | :returns: 108 | 109 | Conferência Totalvoice 110 | 111 | :rtype: 112 | 113 | totalvoice.cliente.api.conferencia.Conferencia 114 | """ 115 | return self.api.conferencia 116 | 117 | @property 118 | def minha_conta(self): 119 | """ 120 | :Descrição: 121 | 122 | Acessa Minha Conta da Totalvoice 123 | 124 | :returns: 125 | 126 | MinhaConta Totalvoice 127 | 128 | :rtype: 129 | 130 | totalvoice.cliente.api.minhaconta.MinhaConta 131 | """ 132 | return self.api.minha_conta 133 | 134 | @property 135 | def composto(self): 136 | """ 137 | :Descrição: 138 | 139 | Acessa Composto da Totalvoice 140 | 141 | :returns: 142 | 143 | Composto Totalvoice 144 | 145 | :rtype: 146 | 147 | totalvoice.cliente.api.composto.Composto 148 | """ 149 | return self.api.composto 150 | 151 | @property 152 | def conta(self): 153 | """ 154 | :Descrição: 155 | 156 | Acessa Conta da Totalvoice 157 | 158 | :returns: 159 | 160 | Conta Totalvoice 161 | 162 | :rtype: 163 | 164 | totalvoice.cliente.api.conta.Conta 165 | """ 166 | return self.api.conta 167 | 168 | @property 169 | def bina(self): 170 | """ 171 | :Descrição: 172 | 173 | Acessa Bina da Totalvoice 174 | 175 | :returns: 176 | 177 | Bina Totalvoice 178 | 179 | :rtype: 180 | 181 | totalvoice.cliente.api.bina.Bina 182 | """ 183 | return self.api.bina 184 | 185 | @property 186 | def ramal(self): 187 | """ 188 | :Descrição: 189 | 190 | Acessa Ramal da Totalvoice 191 | 192 | :returns: 193 | 194 | Ramal Totalvoice 195 | 196 | :rtype: 197 | 198 | totalvoice.cliente.api.central.ramal.Ramal 199 | """ 200 | return self.api.ramal 201 | 202 | @property 203 | def ura(self): 204 | """ 205 | :Descrição: 206 | 207 | Acessa Ura da Totalvoice 208 | 209 | :returns: 210 | 211 | Ura Totalvoice 212 | 213 | :rtype: 214 | 215 | totalvoice.cliente.api.central.ura.Ura 216 | """ 217 | return self.api.ura 218 | 219 | @property 220 | def webphone(self): 221 | """ 222 | :Descrição: 223 | 224 | Acessa Webphone da Totalvoice 225 | 226 | :returns: 227 | 228 | Webphone Totalvoice 229 | 230 | :rtype: 231 | 232 | totalvoice.cliente.api.central.webphone.Webphone 233 | """ 234 | return self.api.webphone 235 | 236 | @property 237 | def did(self): 238 | """ 239 | :Descrição: 240 | 241 | Gerenciamento de Dids 242 | 243 | :returns: 244 | 245 | Did Totalvoice 246 | 247 | :rtype: 248 | 249 | totalvoice.cliente.api.did.Did 250 | """ 251 | return self.api.did 252 | 253 | @property 254 | def fila(self): 255 | """ 256 | :Descrição: 257 | 258 | Gerenciamento de Fila 259 | 260 | :returns: 261 | 262 | Fila Totalvoice 263 | 264 | :rtype: 265 | 266 | totalvoice.cliente.api.fila.Fila 267 | """ 268 | return self.api.fila 269 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/__init__.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from totalvoice.cliente.api.chamada import Chamada 4 | from totalvoice.cliente.api.tts import Tts 5 | from totalvoice.cliente.api.sms import Sms 6 | from totalvoice.cliente.api.audio import Audio 7 | from totalvoice.cliente.api.conferencia import Conferencia 8 | from totalvoice.cliente.api.minhaconta import MinhaConta 9 | from totalvoice.cliente.api.composto import Composto 10 | from totalvoice.cliente.api.conta import Conta 11 | from totalvoice.cliente.api.bina import Bina 12 | from totalvoice.cliente.api.central.webphone import Webphone 13 | from totalvoice.cliente.api.central.ramal import Ramal 14 | from totalvoice.cliente.api.central.ura import Ura 15 | from totalvoice.cliente.api.did import Did 16 | from totalvoice.cliente.api.fila import Fila 17 | 18 | class Api(object): 19 | 20 | def __init__(self, cliente): 21 | self._cliente = cliente 22 | self._chamada = None 23 | self._tts = None 24 | self._sms = None 25 | self._audio = None 26 | self._conferencia = None 27 | self._minha_conta = None 28 | self._composto = None 29 | self._conta = None 30 | self._bina = None 31 | self._webphone = None 32 | self._ramal = None 33 | self._ura = None 34 | self._did = None 35 | self._fila = None 36 | 37 | @property 38 | def chamada(self): 39 | """ 40 | :Descrição: 41 | Acessa Chamada da Totalvoice 42 | 43 | :returns: 44 | 45 | Chamada Totalvoice 46 | 47 | :rtype: 48 | 49 | totalvoice.cliente.api.chamada.Chamada 50 | """ 51 | if self._chamada is None: 52 | self._chamada = Chamada(self._cliente) 53 | return self._chamada 54 | 55 | @property 56 | def tts(self): 57 | """ 58 | :Descrição: 59 | 60 | Acessa TTS da Totalvoice 61 | 62 | :returns: 63 | 64 | TTS Totalvoice 65 | 66 | :rtype: 67 | 68 | totalvoice.cliente.api.tts.Tts 69 | """ 70 | if self._tts is None: 71 | self._tts = Tts(self._cliente) 72 | return self._tts 73 | 74 | @property 75 | def sms(self): 76 | """ 77 | :Descrição: 78 | 79 | Acessa SMS da Totalvoice 80 | 81 | :returns: 82 | 83 | SMS Totalvoice 84 | 85 | :rtype: 86 | 87 | totalvoice.cliente.api.sms.Sms 88 | """ 89 | if self._sms is None: 90 | self._sms = Sms(self._cliente) 91 | return self._sms 92 | 93 | @property 94 | def audio(self): 95 | """ 96 | :Descrição: 97 | 98 | Acessa Audio da Totalvoice 99 | 100 | :returns: 101 | 102 | Audio Totalvoice 103 | 104 | :rtype: 105 | 106 | totalvoice.cliente.api.audio.Audio 107 | """ 108 | if self._audio is None: 109 | self._audio = Audio(self._cliente) 110 | return self._audio 111 | 112 | @property 113 | def conferencia(self): 114 | """ 115 | :Descrição: 116 | 117 | Acessa Conferência da Totalvoice 118 | 119 | :returns: 120 | 121 | Conferência Totalvoice 122 | 123 | :rtype: 124 | 125 | totalvoice.cliente.api.conferencia.Conferencia 126 | """ 127 | if self._conferencia is None: 128 | self._conferencia = Conferencia(self._cliente) 129 | return self._conferencia 130 | 131 | @property 132 | def minha_conta(self): 133 | """ 134 | :Descrição: 135 | 136 | Acessa Minha Conta da Totalvoice 137 | 138 | :returns: 139 | 140 | MinhaConta Totalvoice 141 | 142 | :rtype: 143 | 144 | totalvoice.cliente.api.minhaconta.MinhaConta 145 | """ 146 | if self._minha_conta is None: 147 | self._minha_conta = MinhaConta(self._cliente) 148 | return self._minha_conta 149 | 150 | @property 151 | def composto(self): 152 | """ 153 | :Descrição: 154 | 155 | Acessa Composto da Totalvoice 156 | 157 | :returns: 158 | 159 | Composto Totalvoice 160 | 161 | :rtype: 162 | 163 | totalvoice.cliente.api.composto.Composto 164 | """ 165 | if self._composto is None: 166 | self._composto = Composto(self._cliente) 167 | return self._composto 168 | 169 | @property 170 | def conta(self): 171 | """ 172 | :Descrição: 173 | 174 | Acessa Conta da Totalvoice 175 | 176 | :returns: 177 | 178 | Conta Totalvoice 179 | 180 | :rtype: 181 | 182 | totalvoice.cliente.api.conta.Conta 183 | """ 184 | if self._conta is None: 185 | self._conta = Conta(self._cliente) 186 | return self._conta 187 | 188 | @property 189 | def bina(self): 190 | """ 191 | :Descrição: 192 | 193 | Acessa Bina da Totalvoice 194 | 195 | :returns: 196 | 197 | Bina Totalvoice 198 | 199 | :rtype: 200 | 201 | totalvoice.cliente.api.bina.Bina 202 | """ 203 | if self._bina is None: 204 | self._bina = Bina(self._cliente) 205 | return self._bina 206 | 207 | @property 208 | def webphone(self): 209 | """ 210 | :Descrição: 211 | 212 | Acessa Webphone da Totalvoice 213 | 214 | :returns: 215 | 216 | WEbphone Totalvoice 217 | 218 | :rtype: 219 | 220 | totalvoice.cliente.api.central.webphone.Webphone 221 | """ 222 | if self._webphone is None: 223 | self._webphone = Webphone(self._cliente) 224 | return self._webphone 225 | 226 | @property 227 | def ura(self): 228 | """ 229 | :Descrição: 230 | 231 | Acessa Ura da Totalvoice 232 | 233 | :returns: 234 | 235 | Ura Totalvoice 236 | 237 | :rtype: 238 | 239 | totalvoice.cliente.api.central.ura.Ura 240 | """ 241 | if self._ura is None: 242 | self._ura = Ura(self._cliente) 243 | return self._ura 244 | 245 | @property 246 | def ramal(self): 247 | """ 248 | :Descrição: 249 | 250 | Acessa Ramal da Totalvoice 251 | 252 | :returns: 253 | 254 | Ramal Totalvoice 255 | 256 | :rtype: 257 | 258 | totalvoice.cliente.api.central.ramal.Ramal 259 | """ 260 | if self._ramal is None: 261 | self._ramal = Ramal(self._cliente) 262 | return self._ramal 263 | 264 | @property 265 | def did(self): 266 | """ 267 | :Descrição: 268 | 269 | Gerenciamento de dids 270 | 271 | :returns: 272 | 273 | Did Totalvoice 274 | 275 | :rtype: 276 | 277 | totalvoice.cliente.api.did.Did 278 | """ 279 | if self._did is None: 280 | self._did = Did(self._cliente) 281 | return self._did 282 | 283 | @property 284 | def fila(self): 285 | """ 286 | :Descrição: 287 | 288 | Gerenciamento de filas 289 | 290 | :returns: 291 | 292 | Fila Totalvoice 293 | 294 | :rtype: 295 | 296 | totalvoice.cliente.api.fila.Fila 297 | """ 298 | if self._fila is None: 299 | self._fila = Fila(self._cliente) 300 | return self._fila 301 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/audio.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Audio(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Audio, self).__init__(cliente) 13 | 14 | def enviar(self, numero_destino, url_audio, resposta_usuario=None, bina=None, gravar_audio=None, detecta_caixa=None): 15 | """ 16 | :Descrição: 17 | 18 | Essa é uma função para enviar um áudio para um número destino. 19 | 20 | :Utilização: 21 | 22 | enviar(numero_destino, url_audio, resposta_usuario, bina) 23 | 24 | :Parâmetros: 25 | 26 | - numero_destino: 27 | Número do telefone destino. 28 | 29 | - url_audio: 30 | URL do áudio a ser enviado. 31 | 32 | - resposta_usuario: 33 | Booleano que informa se o usuário pode responder o áudio. 34 | 35 | - bina: 36 | Número de bina para a chamada de áudio. 37 | 38 | - gravar_audio: 39 | Opção para gravar áudio sim/não 40 | 41 | - detecta_caixa: 42 | Opção para detecção de caixa postal ao realizar a chamada 43 | """ 44 | host = self.build_host(self.cliente.host, Routes.AUDIO) 45 | data = self.__build_audio(numero_destino, url_audio, resposta_usuario, bina, gravar_audio, detecta_caixa) 46 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 47 | return response.content 48 | 49 | def get_by_id(self, id): 50 | """ 51 | :Descrição: 52 | 53 | Função para buscar as informações de um audio. 54 | 55 | :Utilização: 56 | 57 | get_by_id(id) 58 | 59 | :Parâmetros: 60 | 61 | - id: 62 | ID do audio. 63 | """ 64 | host = self.cliente.host + Routes.AUDIO + "/" + id 65 | return self.get_request(host) 66 | 67 | def get_relatorio(self, data_inicio, data_fim): 68 | """ 69 | :Descrição: 70 | 71 | Função para pegar o relatório de áudios. 72 | 73 | :Utilização: 74 | 75 | get_relatorio(data_inicio, data_fim) 76 | 77 | :Parâmetros: 78 | 79 | - data_inicio: 80 | Data início do relatório (2016-03-30T17:15:59-03:00) 81 | format UTC 82 | 83 | - data_fim: 84 | Data final do relatório (2016-03-30T17:15:59-03:00) 85 | format UTC 86 | 87 | """ 88 | host = self.build_host(self.cliente.host, Routes.AUDIO, ["relatorio"]) 89 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 90 | return self.get_request(host, params) 91 | 92 | def __build_audio(self, numero_destino, url_audio, resposta_usuario=None, bina=None, gravar_audio=None, detecta_caixa=None): 93 | data = {} 94 | data.update({"numero_destino": numero_destino}) 95 | data.update({"url_audio": url_audio}) 96 | data.update({"resposta_usuario": resposta_usuario}) 97 | data.update({"bina": bina}) 98 | data.update({"gravar_audio": gravar_audio}) 99 | data.update({"detecta_caixa": detecta_caixa}) 100 | return json.dumps(data) 101 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/bina.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Bina(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Bina, self).__init__(cliente) 13 | 14 | def enviar(self, telefone): 15 | """ 16 | :Descrição: 17 | 18 | Envia um número de telefone para que receba um código via SMS (celular) ou TSS (fixo) 19 | 20 | :Utilização: 21 | 22 | enviar(telefone) 23 | 24 | :Parâmetros: 25 | 26 | - telefone: 27 | Número do telefone que irá receber a Chamada(fixo) ou SMS(móvel) com o código para validação 28 | """ 29 | host = self.build_host(self.cliente.host, Routes.BINA) 30 | data = self.__build_bina(telefone) 31 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 32 | return response.content 33 | 34 | def validar(self, codigo, telefone): 35 | """ 36 | :Descrição: 37 | 38 | Você deve informar o código recebido no celular (SMS) ou telefone (TTS) informados no método POST, para realizarmos a validação 39 | 40 | :Utilização: 41 | 42 | validar(codigo, telefone) 43 | 44 | :Parâmetros: 45 | 46 | - codigo: 47 | Código que será validado. 48 | 49 | - telefone: 50 | Telefone que será validado. 51 | """ 52 | host = self.cliente.host + Routes.BINA 53 | params = (('codigo', codigo),('telefone', telefone),) 54 | return self.get_request(host, params) 55 | 56 | def excluir(self, telefone): 57 | """ 58 | :Descrição: 59 | 60 | Apaga o número de telefone (Bina) cadastrado na Conta 61 | 62 | :Utilização: 63 | 64 | excluir(telefone) 65 | 66 | :Parâmetros: 67 | 68 | - telefone: 69 | Telefone (bina) que será removido. 70 | """ 71 | host = self.build_host(self.cliente.host, Routes.BINA, [telefone]) 72 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 73 | return response.content 74 | 75 | def get_relatorio(self): 76 | """ 77 | :Descrição: 78 | 79 | Busca os telefones (Bina) cadastrados na Conta 80 | 81 | :Utilização: 82 | 83 | get_relatorio() 84 | 85 | """ 86 | host = self.build_host(self.cliente.host, Routes.BINA, ["relatorio"]) 87 | return self.get_request(host) 88 | 89 | def __build_bina(self, telefone): 90 | data = {} 91 | data.update({"telefone": telefone}) 92 | return json.dumps(data) 93 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/central/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totalvoice/totalvoice-python/3dc80ef830f0ea78dbeffad7dc9153d45de4f0da/totalvoice/cliente/api/central/__init__.py -------------------------------------------------------------------------------- /totalvoice/cliente/api/central/ramal.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from totalvoice.cliente.api.helper import utils 4 | from totalvoice.cliente.api.helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Ramal(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Ramal, self).__init__(cliente) 13 | 14 | def criar(self, dados): 15 | """ 16 | :Descrição: 17 | 18 | Função para criar um ramal. 19 | 20 | :Utilização: 21 | 22 | criar(dados) 23 | 24 | :Parâmetros: 25 | 26 | - dados: 27 | Array de dados do ramal. 28 | """ 29 | host = self.cliente.host + Routes.RAMAL 30 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(dados)) 31 | return response.content 32 | 33 | def deletar(self, id): 34 | """ 35 | :Descrição: 36 | 37 | Função para deletar um ramal. 38 | 39 | :Utilização: 40 | 41 | deletar(id) 42 | 43 | :Parâmetros: 44 | 45 | - id: 46 | ID do ramal. 47 | """ 48 | host = self.build_host(self.cliente.host, Routes.RAMAL, [id]) 49 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 50 | return response.content 51 | 52 | def get_by_id(self, id): 53 | """ 54 | :Descrição: 55 | 56 | Função para buscar as informações de um ramal. 57 | 58 | :Utilização: 59 | 60 | get_by_id(id) 61 | 62 | :Parâmetros: 63 | 64 | - id: 65 | ID do ramal. 66 | """ 67 | host = self.cliente.host + Routes.RAMAL + "/" + id 68 | return self.get_request(host) 69 | 70 | def editar(self, dados): 71 | """ 72 | :Descrição: 73 | 74 | Função para editar o ramal. 75 | 76 | :Utilização: 77 | 78 | editar(dados) 79 | 80 | :Parâmetros: 81 | 82 | - dados: 83 | Array de dados do ramal. 84 | """ 85 | host = self.build_host(self.cliente.host, Routes.RAMAL) 86 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(dados)) 87 | return response.content 88 | 89 | def get_relatorio(self): 90 | """ 91 | :Descrição: 92 | 93 | Função para pegar o relatório de ramais. 94 | 95 | :Utilização: 96 | 97 | get_relatorio() 98 | """ 99 | host = self.build_host(self.cliente.host, Routes.RAMAL, ["relatorio"]) 100 | return self.get_request(host) 101 | 102 | def editarRamalFila(self, id, dados): 103 | """ 104 | :Descrição: 105 | 106 | Função para editar o ramal na fila. 107 | 108 | :Utilização: 109 | 110 | editar(dados) 111 | 112 | :Parâmetros: 113 | 114 | - dados: 115 | Array de dados do ramal. 116 | """ 117 | host = self.cliente.host + Routes.RAMAL + "/" + str(id) + Routes.FILA 118 | print(host) 119 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(dados)) 120 | return response.content -------------------------------------------------------------------------------- /totalvoice/cliente/api/central/ura.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from totalvoice.cliente.api.helper import utils 4 | from totalvoice.cliente.api.helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Ura(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Ura, self).__init__(cliente) 13 | 14 | def criar(self, nome, dados): 15 | """ 16 | :Descrição: 17 | 18 | Função para criar uma ura. 19 | 20 | :Utilização: 21 | 22 | criar_ura() 23 | 24 | :Parâmetros: 25 | 26 | - nome: 27 | Nome para identificação 28 | 29 | - dados: 30 | Array de objetos com acao, opcao, menu e acao_dados. opção null = default. menu null = menu 1. Ação pode ser tts, audio, fila, transferir. 31 | """ 32 | host = self.cliente.host + Routes.URA 33 | data = self.__build_ura(nome, dados) 34 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 35 | return response.content 36 | 37 | def deletar(self, id): 38 | """ 39 | :Descrição: 40 | 41 | Função para deletar um ramal. 42 | 43 | :Utilização: 44 | 45 | deletar(id) 46 | 47 | :Parâmetros: 48 | 49 | - id: 50 | ID da ura. 51 | """ 52 | host = self.build_host(self.cliente.host, Routes.URA, [id]) 53 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 54 | return response.content 55 | 56 | def editar(self, id, nome, dados): 57 | """ 58 | :Descrição: 59 | 60 | Função para editar o ramal. 61 | 62 | :Utilização: 63 | 64 | editar(id, nome, dados) 65 | 66 | :Parâmetros: 67 | - id: 68 | ID da ura. 69 | 70 | - nome: 71 | Nome para identificação 72 | 73 | - dados: 74 | Array de objetos com acao, opcao, menu e acao_dados. opção null = default. menu null = menu 1. Ação pode ser tts, audio, fila, transferir. 75 | """ 76 | host = self.build_host(self.cliente.host, Routes.URA, [id]) 77 | data = self.__build_ura(nome, dados) 78 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=data) 79 | return response.content 80 | 81 | def __build_ura(self, nome, dados): 82 | data = {} 83 | data.update({"nome": nome}) 84 | data.update({"dados": dados}) 85 | return json.dumps(data) 86 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/central/webphone.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | 3 | from totalvoice.cliente.api.helper import utils 4 | from totalvoice.cliente.api.helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Webphone(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Webphone, self).__init__(cliente) 13 | 14 | def get_webphone(self, tipo="floating", id_ramal=None, ramal=None, ligar_para=None, fechar_fim=None): 15 | """ 16 | :Descrição: 17 | 18 | Função para pegar o relatório de ramais. 19 | 20 | :Utilização: 21 | 22 | get_webphone() 23 | 24 | :Parâmetros: 25 | - tipo: 26 | Embedded = embutido no site, floating = popup, hidden = sem interface e com funcoes de callback. veja documentacao de exemplo no blog. 27 | 28 | - id_ramal: 29 | ID do ramal para pré-configurar o widget 30 | 31 | - ramal: 32 | Número do ramal para pré-configurar o widget. 33 | 34 | - ligar_para: 35 | Abrir o webphone ligando para o número, formato DDD + Número exemplo: 4832830151. 36 | 37 | - fechar_fim: 38 | Fechar a janela do webphone quando a chamada for encerrada? 39 | """ 40 | host = self.build_host(self.cliente.host, Routes.WEBPHONE) 41 | params = (('tipo', tipo),('id_ramal', id_ramal), ('ramal', ramal), ('ligar_para', ligar_para), ('fechar_fim', fechar_fim)) 42 | return self.get_request(host, params) 43 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/chamada.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Chamada(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Chamada, self).__init__(cliente) 13 | 14 | def enviar(self, numero_origem, numero_destino, data_criacao=None, gravar_audio=False, bina_origem=None, bina_destino=None, tags=None, detecta_caixa=False): 15 | """ 16 | :Descrição: 17 | 18 | Essa é uma função para realizar uma chamada 19 | entre dois números de telefone. 20 | 21 | :Utilização: 22 | 23 | enviar(numero_origem, numero_destino, data_criacao, gravar_audio, bina_origem, bina_destino, tags, detecta_caixa) 24 | 25 | :Parâmetros: 26 | 27 | - numero_origem: 28 | Número do telefone de origem (Perna A). 29 | 30 | - numero_destino: 31 | Número do telefone destino (Perna B). 32 | 33 | - data_criacao: 34 | Data de criação da chamada, serve para 35 | disparar uma chamada na data e hora desejada. 36 | 37 | - gravar_audio: 38 | Grava o audio da chamada. 39 | 40 | - bina_origem: 41 | Número de bina que vai aparecer quando tocar o numero origem. 42 | 43 | - bina_destino: 44 | Número de bina que vai aparecer quando tocar o numero destino. 45 | 46 | - tags: 47 | Campo para passar informações para capturar em webhooks. 48 | 49 | - detecta_caixa: 50 | Opção para detecção de caixa postal ao realizar a chamada. 51 | """ 52 | host = self.build_host(self.cliente.host, Routes.CHAMADA) 53 | data = self.__build_chamada(numero_origem, numero_destino, data_criacao, gravar_audio, bina_origem, bina_destino, tags, detecta_caixa) 54 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 55 | return response.content 56 | 57 | def escuta_chamada(self, id, numero, modo): 58 | """ 59 | (BETA - EM TESTES) 60 | ---------- 61 | 62 | :Descrição: 63 | 64 | Função para escutar uma chamada, passa o id, número e modo e é possível escutar a chamada. 65 | 66 | :Utilização: 67 | 68 | escuta_chamada(id, numero, modo) 69 | 70 | :Parâmetros: 71 | 72 | - id: 73 | ID da chamada ativa. 74 | 75 | - numero: 76 | Número do seu telefone. 77 | 78 | - modo: 79 | Modo de escuta: 1=escuta, 2=sussurro, 3=conferência. 80 | """ 81 | host = self.build_host(self.cliente.host, Routes.CHAMADA, [id, "escuta"]) 82 | data = {} 83 | data.update({"numero" : numero}) 84 | data.update({"modo" : modo}) 85 | data = json.dumps(data) 86 | requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 87 | 88 | def transferir(self, id, numero, perna): 89 | """ 90 | (BETA - EM TESTES) 91 | ---------- 92 | 93 | :Descrição: 94 | 95 | Função para transferir uma chamada em andamento, passa o id, número e a perna. 96 | 97 | :Utilização: 98 | 99 | transferir(id, numero, perna) 100 | 101 | :Parâmetros: 102 | 103 | - id: 104 | ID da chamada ativa. 105 | 106 | - numero: 107 | Número do seu telefone. 108 | 109 | - perna: 110 | Perna da chamada atual que vai ser transferida, destino ou origem. 111 | """ 112 | host = self.build_host(self.cliente.host, Routes.CHAMADA, [id, "transfr"]) 113 | data = {} 114 | data.update({"numero": numero}) 115 | data.update({"perna": perna}) 116 | data = json.dumps(data) 117 | requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 118 | 119 | def avaliar(self, id, nota, comentario): 120 | """ 121 | (BETA - EM TESTES) 122 | ---------- 123 | 124 | :Descrição: 125 | 126 | Função para avaliar uma chamada em andamento, passa o id, nota e comentario. 127 | 128 | :Utilização: 129 | 130 | avaliar(id, nota, comentario) 131 | 132 | :Parâmetros: 133 | 134 | - id: 135 | ID da chamada ativa. 136 | 137 | - numero: 138 | Comentario da avaliação. 139 | 140 | - nota: 141 | Nota da avaliação. 142 | """ 143 | host = self.build_host(self.cliente.host, Routes.CHAMADA, [id, "avaliar"]) 144 | data = {} 145 | data.update({"nota": nota}) 146 | data.update({"comentario": comentario}) 147 | data = json.dumps(data) 148 | requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 149 | 150 | 151 | def deletar(self, id): 152 | """ 153 | :Descrição: 154 | 155 | Função para deletar uma chamada ativa. 156 | 157 | :Utilização: 158 | 159 | deletar(id) 160 | 161 | :Parâmetros: 162 | 163 | - id: 164 | ID da chamada ativa. 165 | """ 166 | host = self.build_host(self.cliente.host, Routes.CHAMADA, [id]) 167 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 168 | return response.content 169 | 170 | def get_by_id(self, id): 171 | """ 172 | :Descrição: 173 | 174 | Função para buscar as informações de uma chamada ativa. 175 | 176 | :Utilização: 177 | 178 | get_by_id(id) 179 | 180 | :Parâmetros: 181 | 182 | - id: 183 | ID da chamada ativa. 184 | """ 185 | host = self.cliente.host + Routes.CHAMADA + "/" + id 186 | return self.get_request(host) 187 | 188 | def get_gravacao_chamada(self, id): 189 | """ 190 | :Descrição: 191 | 192 | Função para pegar a URL de gravação da chamada. 193 | 194 | :Utilização: 195 | 196 | get_gravacao_chamada(id) 197 | 198 | :Parâmetros: 199 | 200 | - id: 201 | ID da chamada ativa. 202 | """ 203 | host = self.build_host(self.cliente.host, Routes.CHAMADA, [id, "gravacao"]) 204 | return self.get_request(host) 205 | 206 | def get_relatorio(self, data_inicio, data_fim): 207 | """ 208 | :Descrição: 209 | 210 | Função para pegar o relatório de chamadas. 211 | 212 | :Utilização: 213 | 214 | get_relatorio(data_inicio, data_fim) 215 | 216 | :Parâmetros: 217 | 218 | - data_inicio: 219 | Data início do relatório (2016-03-30T17:15:59-03:00) 220 | format UTC 221 | 222 | - data_fim: 223 | Data final do relatório (2016-03-30T17:15:59-03:00) 224 | format UTC 225 | 226 | """ 227 | host = self.build_host(self.cliente.host, Routes.CHAMADA, ["relatorio"]) 228 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 229 | return self.get_request(host, params) 230 | 231 | def __build_chamada(self, numero_origem, numero_destino, data_criacao, gravar_audio, bina_origem, bina_destino, tags, detecta_caixa): 232 | data = {} 233 | data.update({"numero_origem": numero_origem}) 234 | data.update({"numero_destino": numero_destino}) 235 | data.update({"data_criacao": data_criacao}) 236 | data.update({"gravar_audio": gravar_audio}) 237 | data.update({"bina_origem": bina_origem}) 238 | data.update({"bina_destino": bina_destino}) 239 | data.update({"tags": tags}) 240 | data.update({"detecta_caixa": detecta_caixa}) 241 | return json.dumps(data) 242 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/composto.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Composto(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Composto, self).__init__(cliente) 13 | 14 | def enviar(self, numero_destino, dados, bina=None, tags=None, gravar_audio=None, detecta_caixa=None): 15 | """ 16 | :Descrição: 17 | 18 | Essa é uma função para enviar um composto de dados para um número destino. 19 | 20 | :Utilização: 21 | 22 | enviar(numero_destino, dados, bina, tags) 23 | 24 | :Parâmetros: 25 | 26 | - numero_destino: 27 | Número do telefone destino. 28 | 29 | - dados: 30 | Array de objetos com acao e acao_dados , podendo ser TTS, Audio ou Transferir cada um deles. 31 | O campo opcao é opcional, se configurado, só aciona a ação se a opção tiver sido digitada - DTMF. 32 | 33 | - bina: 34 | Número e telefone que aparecerá no identificador de quem receber a chamada, formato 35 | DDD + Número exemplo: 4832830151 36 | 37 | - tags: 38 | Tags para uso geral 39 | 40 | - gravar_audio: 41 | Opção para gravar áudio sim/não 42 | 43 | - detecta_caixa: 44 | Opção para detecção de caixa postal ao realizar a chamada 45 | """ 46 | 47 | host = self.build_host(self.cliente.host, Routes.COMPOSTO) 48 | data = self.__build_composto(numero_destino, dados, bina, tags, gravar_audio, detecta_caixa) 49 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 50 | return response.content 51 | 52 | def get_by_id(self, id): 53 | """ 54 | :Descrição: 55 | 56 | Função para buscar as informações de um composto enviado. 57 | 58 | :Utilização: 59 | 60 | get_by_id(id) 61 | 62 | :Parâmetros: 63 | 64 | - id: 65 | ID do composto. 66 | """ 67 | host = self.cliente.host + Routes.COMPOSTO + "/" + id 68 | return self.get_request(host) 69 | 70 | def get_relatorio(self, data_inicio, data_fim): 71 | """ 72 | :Descrição: 73 | 74 | Função para pegar o relatório de compostos. 75 | 76 | :Utilização: 77 | 78 | get_relatorio(data_inicio, data_fim) 79 | 80 | :Parâmetros: 81 | 82 | - data_inicio: 83 | Data início do relatório (2016-03-30T17:15:59-03:00) 84 | format UTC 85 | 86 | - data_fim: 87 | Data final do relatório (2016-03-30T17:15:59-03:00) 88 | format UTC 89 | 90 | """ 91 | host = self.build_host(self.cliente.host, Routes.COMPOSTO, ["relatorio"]) 92 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 93 | return self.get_request(host, params) 94 | 95 | def __build_composto(self, numero_destino, dados, bina, tags, gravar_audio, detecta_caixa): 96 | data = {} 97 | data.update({"numero_destino": numero_destino}) 98 | data.update({"dados": dados}) 99 | data.update({"bina": bina}) 100 | data.update({"tags": tags}) 101 | data.update({"gravar_audio": gravar_audio}) 102 | data.update({"detecta_caixa": detecta_caixa}) 103 | return json.dumps(data) 104 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/conferencia.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Conferencia(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Conferencia, self).__init__(cliente) 13 | 14 | def cria_conferencia(self): 15 | """ 16 | :Descrição: 17 | 18 | Essa é uma função para postar uma conferência 19 | 20 | :Utilização: 21 | 22 | cria_conferencia() 23 | 24 | """ 25 | host = self.build_host(self.cliente.host, Routes.CONFERENCIA) 26 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token)) 27 | return response.content 28 | 29 | def get_by_id(self, id): 30 | """ 31 | :Descrição: 32 | 33 | Função para buscar as informações de uma conferência ativa. 34 | 35 | :Utilização: 36 | 37 | get_by_id(id) 38 | 39 | :Parâmetros: 40 | 41 | - id: 42 | ID da conferência ativa. 43 | """ 44 | host = self.cliente.host + Routes.CONFERENCIA + "/" + id 45 | return self.get_request(host) 46 | 47 | def add_numero_conferencia(self, id_onferencia, numero, bina=None, gravar_audio=None): 48 | """ 49 | :Descrição: 50 | 51 | Função para adicionar números de telefone na conferência ativa. 52 | 53 | :Utilização: 54 | 55 | add_numero_conferencia(idConferencia, numero, bina, gravar_audio) 56 | 57 | :Parâmetros: 58 | 59 | - idConferencia: 60 | ID da conferência ativa. 61 | 62 | - numero: 63 | Número do telefone que irá receber a chamada da conferência, formato DDD + Número exemplo: 4832830151 64 | 65 | - bina: 66 | Número e telefone que aparecerá no identificador de quem receber a chamada, formato DDD + Número exemplo: 4832830151 67 | 68 | - gravar_audio: 69 | Flag que indica se o áudio deve ser gravado 70 | """ 71 | host = self.cliente.host + Routes.CONFERENCIA + "/" + id_onferencia 72 | data = self.__buildConferencia(id_onferencia, numero, bina, gravar_audio) 73 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 74 | return response.content 75 | 76 | def deletar(self, id): 77 | """ 78 | :Descrição: 79 | 80 | Função para remover uma conferência ativa 81 | 82 | :Utilização: 83 | 84 | deletar(id) 85 | 86 | :Parâmetros: 87 | 88 | - id: 89 | ID da conferência. 90 | """ 91 | host = self.build_host(self.cliente.host, Routes.CONFERENCIA, [id]) 92 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 93 | return response.content 94 | 95 | def __buildConferencia(self, numero, bina, gravar_audio): 96 | """ 97 | :Descrição: 98 | 99 | Função privada para realizar o build dos dados. 100 | """ 101 | data = {} 102 | data.update({"numero": numero}) 103 | data.update({"bina": bina}) 104 | data.update({"gravar_audio": gravar_audio}) 105 | return json.dumps(data) 106 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/conta.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Conta(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Conta, self).__init__(cliente) 13 | 14 | def criar_conta(self, nome, login, senha, cpf_cnpj=None, preco_fixo=None, preco_cel=None, preco_ramal=None, email_financeiro=None, nome_fantasia=None, valor_aviso_saldo_baixo=None): 15 | """ 16 | :Descrição: 17 | 18 | Função para editar a sua conta. 19 | 20 | :Utilização: 21 | 22 | editar_conta() 23 | 24 | :Parâmetros: 25 | 26 | - nome: 27 | Nome da conta. 28 | 29 | - login: 30 | Login da conta. 31 | 32 | - senha: 33 | Senha da conta; 34 | 35 | - cpf_cnpj: 36 | CPF ou CNPJ da conta. 37 | 38 | - preco_fixo: 39 | Preço de chamadas para fixo da conta. 40 | 41 | - preco_cel: 42 | Preço de chamadas para celulares da conta. 43 | 44 | - preco_ramal: 45 | Preço para ramais da conta. 46 | 47 | - email_financeiro: 48 | E-mail responsável pelo financeiro da conta. 49 | 50 | - nome_fantasia 51 | Nome fantasia da conta 52 | 53 | - valor_aviso_saldo_baixo 54 | É necessário ser um valor inteiro, ex: 100 .Quando o saldo de créditos atingir ou ficar abaixo do valor determinado, você receberá um aviso no email do email_financeiro(caso este não tenha sido cadastrado você receberá no e-mail de login). 55 | 56 | """ 57 | host = self.cliente.host + Routes.CONTA 58 | data = self.__build_conta(nome, login, senha, cpf_cnpj, preco_fixo, preco_cel, preco_ramal, email_financeiro, nome_fantasia, valor_aviso_saldo_baixo) 59 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 60 | return response.content 61 | 62 | def deletar(self, id): 63 | """ 64 | :Descrição: 65 | 66 | Função para deletar uma conta. 67 | 68 | :Utilização: 69 | 70 | deletar(id) 71 | 72 | :Parâmetros: 73 | 74 | - id: 75 | ID da conta ativa. 76 | """ 77 | host = self.build_host(self.cliente.host, Routes.CONTA, [id]) 78 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 79 | return response.content 80 | 81 | def get_by_id(self, id): 82 | """ 83 | :Descrição: 84 | 85 | Função para buscar as informações de uma conta. 86 | 87 | :Utilização: 88 | 89 | get_by_id(id) 90 | 91 | :Parâmetros: 92 | 93 | - id: 94 | ID da conta ativa. 95 | """ 96 | host = self.cliente.host + Routes.CONTA + "/" + id 97 | return self.get_request(host) 98 | 99 | def editar_conta(self, nome, login, senha, cpf_cnpj=None, preco_fixo=None, preco_cel=None, preco_ramal=None, email_financeiro=None, nome_fantasia=None): 100 | """ 101 | :Descrição: 102 | 103 | Função para editar a sua conta. 104 | 105 | :Utilização: 106 | 107 | editar_conta() 108 | 109 | :Parâmetros: 110 | 111 | - nome: 112 | Nome da conta. 113 | 114 | - login: 115 | Login da conta. 116 | 117 | - senha: 118 | Senha da conta; 119 | 120 | - cpf_cnpj: 121 | CPF ou CNPJ da conta. 122 | 123 | - preco_fixo: 124 | Preço de chamadas para fixo da conta. 125 | 126 | - preco_cel: 127 | Preço de chamadas para celulares da conta. 128 | 129 | - preco_ramal: 130 | Preço para ramais da conta. 131 | 132 | - email_financeiro: 133 | E-mail responsável pelo financeiro da conta. 134 | 135 | - nome_fantasia 136 | Nome fantasia da conta 137 | """ 138 | host = self.build_host(self.cliente.host, Routes.CONTA) 139 | data = self.__build_conta(nome, login, senha, cpf_cnpj, preco_fixo, preco_cel, preco_ramal, email_financeiro, nome_fantasia) 140 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=data) 141 | return response.content 142 | 143 | def get_relatorio(self): 144 | """ 145 | :Descrição: 146 | 147 | Função para pegar o relatório de conta. 148 | 149 | :Utilização: 150 | 151 | get_relatorio() 152 | """ 153 | host = self.build_host(self.cliente.host, Routes.CONTA, ["relatorio"]) 154 | return self.get_request(host) 155 | 156 | def recarga_bonus(self, id, valor): 157 | """ 158 | :Descrição: 159 | 160 | Função para realizar recarga de bônus em uma conta filha 161 | 162 | :Utilização: 163 | 164 | recarga_bonus() 165 | 166 | :Parâmetros: 167 | 168 | - id: 169 | ID da conta filha. 170 | 171 | - valor: 172 | Valor a ser creditado como bônus. 173 | """ 174 | host = self.cliente.host + Routes.CONTA + "/" + id + "/bonus" 175 | data = json.dumps({"valor": valor}) 176 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 177 | return response.content 178 | 179 | def __build_conta(self, nome, login, senha, cpf_cnpj, preco_fixo, preco_cel, preco_ramal, email_financeiro, nome_fantasia, valor_aviso_saldo_baixo): 180 | data = {} 181 | data.update({"nome": nome}) 182 | data.update({"login": login}) 183 | data.update({"senha": senha}) 184 | data.update({"cpf_cnpj": cpf_cnpj}) 185 | data.update({"preco_fixo": preco_fixo}) 186 | data.update({"preco_cel": preco_cel}) 187 | data.update({"preco_ramal": preco_ramal}) 188 | data.update({"email_financeiro": email_financeiro}) 189 | data.update({"nome_fantasia": nome_fantasia}) 190 | data.update({"valor_aviso_saldo_baixo":valor_aviso_saldo_baixo}) 191 | return json.dumps(data) 192 | 193 | def get_webhook_default(self): 194 | """ 195 | :Descrição: 196 | 197 | Função para obter a lista webhook default da conta. 198 | 199 | :Utilização: 200 | 201 | get_webhook() 202 | """ 203 | host = self.build_host(self.cliente.host, Routes.WEBHOOK_DEFAULT) 204 | return self.get_request(host) 205 | 206 | def delete_webhook_default(self, nome_webhook): 207 | """ 208 | :Descrição: 209 | 210 | Função para deletar um webhook default. 211 | 212 | :Utilização: 213 | 214 | get_webhook(nome_webhook) 215 | 216 | :Parâmetros: 217 | 218 | - nome_webhook: 219 | Nome do webhook. 220 | """ 221 | host = self.build_host(self.cliente.host, Routes.WEBHOOK_DEFAULT, [nome_webhook]) 222 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 223 | return response.content 224 | 225 | def edit_webhook_default(self, nome_webhook, url): 226 | """ 227 | :Descrição: 228 | 229 | Função para deletar um webhook default. 230 | 231 | :Utilização: 232 | 233 | editar_webhook(nome_webhook, url) 234 | 235 | :Parâmetros: 236 | 237 | - nome_webhook: 238 | Nome do webhook. 239 | 240 | - url: 241 | Url do webhook 242 | """ 243 | host = self.build_host(self.cliente.host, Routes.WEBHOOK_DEFAULT, [nome_webhook]) 244 | data = {} 245 | data.update({"url" : url}) 246 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(data)) 247 | return response.content 248 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/did.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Did(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Did, self).__init__(cliente) 13 | 14 | def get_my_dids(self): 15 | """ 16 | :Descrição: 17 | 18 | Função para buscar todos os dids seus dids 19 | 20 | :Utilização: 21 | 22 | get_my_dids() 23 | 24 | """ 25 | host = self.build_host(self.cliente.host, Routes.DID) 26 | return self.get_request(host) 27 | 28 | def get_estoque(self): 29 | """ 30 | :Descrição: 31 | 32 | Função para buscar a lista de dids no estoque 33 | 34 | :Utilização: 35 | 36 | get_my_dids() 37 | 38 | """ 39 | host = self.build_host(self.cliente.host, Routes.DID_ESTOQUE) 40 | return self.get_request(host) 41 | 42 | def compra_estoque(self, did_id): 43 | """ 44 | :Descrição: 45 | 46 | Essa é uma função que compra um número (did) do estoque 47 | 48 | :Utilização: 49 | 50 | compra_estoque(did_id) 51 | 52 | :Parâmetros: 53 | 54 | - did_id: 55 | ID do did que deseja comprar 56 | """ 57 | host = self.build_host(self.cliente.host, Routes.DID_ESTOQUE) 58 | data = {} 59 | data.update({"did_id": did_id}) 60 | data = json.dumps(data) 61 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 62 | return response.content 63 | 64 | def editar(self, did_id, ura_id=None, ramal_id=None): 65 | """ 66 | :Descrição: 67 | 68 | Função para editar o seu did. 69 | 70 | :Utilização: 71 | 72 | editar(did_id, ura_id, ramal_id) 73 | 74 | :Parâmetros: 75 | 76 | - did_id: 77 | ID do did que deseja editar. 78 | 79 | - ura_id: 80 | Ura ID para atrlar ao did. 81 | 82 | - ramal_id: 83 | Ramal ID para atrlar ao did. 84 | """ 85 | data = {} 86 | data.update({"did_id": did_id}) 87 | data.update({"ura_id": ura_id}) 88 | data.update({"ramal_id": ramal_id}) 89 | host = self.build_host(self.cliente.host, Routes.DID) 90 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(data)) 91 | return response.content 92 | 93 | def deletar(self, id): 94 | """ 95 | :Descrição: 96 | 97 | Função para remover o did da conta. 98 | 99 | :Utilização: 100 | 101 | deletar(id) 102 | 103 | :Parâmetros: 104 | 105 | - id: 106 | ID do did. 107 | """ 108 | host = self.build_host(self.cliente.host, Routes.DID, [id]) 109 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 110 | return response.content 111 | 112 | def get_chamada_recebida(self, id): 113 | """ 114 | :Descrição: 115 | 116 | Função para buscar as informações de uma chamada recebida. 117 | 118 | :Utilização: 119 | 120 | get_chamada_recebida(id) 121 | 122 | :Parâmetros: 123 | 124 | - id: 125 | ID da chamada ativa. 126 | """ 127 | host = self.cliente.host + Routes.DID_CHAMADA + "/" + id 128 | return self.get_request(host) 129 | 130 | def get_relatorio(self, data_inicio, data_fim, id=None): 131 | """ 132 | :Descrição: 133 | 134 | Função para pegar o relatório de chamadas recebidas. 135 | 136 | :Utilização: 137 | 138 | get_relatorio(data_inicio, data_fim, id) 139 | 140 | :Parâmetros: 141 | 142 | - data_inicio: 143 | Data início do relatório (2016-03-30T17:15:59-03:00) 144 | format UTC 145 | 146 | - data_fim: 147 | Data final do relatório (2016-03-30T17:15:59-03:00) 148 | format UTC 149 | 150 | - id: 151 | Se preenchido busca os dados daquele número específico. 152 | 153 | """ 154 | host = self.build_host(self.cliente.host, Routes.DID, ["relatorio"]) 155 | if id is not None: 156 | host = host + id 157 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 158 | return self.get_request(host, params) -------------------------------------------------------------------------------- /totalvoice/cliente/api/fila.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Fila(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Fila, self).__init__(cliente) 13 | 14 | def get_fila(self, id): 15 | """ 16 | :Descrição: 17 | 18 | Função para buscar as informações de uma fila 19 | 20 | :Utilização: 21 | 22 | get_fila(id) 23 | 24 | :Parâmetros: 25 | 26 | - id: 27 | ID da fila. 28 | 29 | """ 30 | host = self.build_host(self.cliente.host, Routes.FILA, [id]) 31 | return self.get_request(host) 32 | 33 | def criar(self, nome, estrategia_ring, timeout_ring=None): 34 | """ 35 | :Descrição: 36 | 37 | Função para criar uma fila 38 | 39 | :Utilização: 40 | 41 | criar(nome, estrategia_ring, timeout_ring) 42 | 43 | :Parâmetros: 44 | 45 | - nome: 46 | Nome da fila a ser criada 47 | 48 | - estrategia_ring: 49 | Multiplo para tocar todos ao mesmo tempo ou Distribuidor para tocar um ramal por vez. 50 | 51 | - timeout_ring 52 | Número em segundos para derrubar a chamada da fila. 53 | 54 | """ 55 | host = self.build_host(self.cliente.host, Routes.FILA) 56 | data = self.__build_fila(nome, estrategia_ring, timeout_ring) 57 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 58 | return response.content 59 | 60 | def add_ramal(self, id_fila, ramal_id): 61 | """ 62 | :Descrição: 63 | 64 | Adiciona um ramal na fila 65 | 66 | :Utilização: 67 | 68 | add_ramal(id_fila, ramal_id) 69 | 70 | :Parâmetros: 71 | 72 | - id_fila: 73 | ID da fila 74 | 75 | - ramal_id: 76 | ID do ramal a ser adicionado na fila 77 | 78 | """ 79 | host = self.build_host(self.cliente.host, Routes.FILA, [id_fila]) 80 | data = {"ramal_id": ramal_id} 81 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(data)) 82 | return response.content 83 | 84 | def editar(self, id, nome=None, estrategia_ring=None, timeout_ring=None): 85 | """ 86 | :Descrição: 87 | 88 | Função para a fila. 89 | 90 | :Utilização: 91 | 92 | editar(nome, estrategia_ring, timeout_ring) 93 | 94 | :Parâmetros: 95 | 96 | - id: 97 | ID da fila a ser editada 98 | 99 | - nome: 100 | Nome da fila a ser criada 101 | 102 | - estrategia_ring: 103 | Multiplo para tocar todos ao mesmo tempo ou Distribuidor para tocar um ramal por vez. 104 | 105 | - timeout_ring 106 | Número em segundos para derrubar a chamada da fila. 107 | """ 108 | dados = self.__build_fila(nome, estrategia_ring, timeout_ring) 109 | host = self.build_host(self.cliente.host, Routes.FILA, [id]) 110 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=dados) 111 | return response.content 112 | 113 | def deleta_ramal(self, id, ramal_id): 114 | """ 115 | :Descrição: 116 | 117 | Deleta ramal de uma fila 118 | 119 | :Utilização: 120 | 121 | deleta_ramal(id, ramal_id) 122 | 123 | :Parâmetros: 124 | 125 | - id: 126 | ID da fila. 127 | 128 | - ramal_id: 129 | ID do ramal. 130 | """ 131 | host = self.build_host(self.cliente.host, Routes.FILA, [id, ramal_id]) 132 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token)) 133 | return response.content 134 | 135 | def get_fila_ramal(self, id, ramal_id): 136 | """ 137 | :Descrição: 138 | 139 | Função para buscar as informações de uma fila e o ramal 140 | 141 | :Utilização: 142 | 143 | get_fila(id, ramal_id) 144 | 145 | :Parâmetros: 146 | 147 | - id: 148 | ID da fila. 149 | 150 | - ramal_id: 151 | ID do ramal. 152 | 153 | """ 154 | host = self.build_host(self.cliente.host, Routes.FILA, [id, ramal_id]) 155 | return self.get_request(host) 156 | 157 | def __build_fila(self, nome, estrategia_ring, timeout_ring): 158 | data = {} 159 | data.update({"nome": nome}) 160 | data.update({"estrategia_ring": estrategia_ring}) 161 | data.update({"timeout_ring": timeout_ring}) 162 | return json.dumps(data) -------------------------------------------------------------------------------- /totalvoice/cliente/api/helper/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/totalvoice/totalvoice-python/3dc80ef830f0ea78dbeffad7dc9153d45de4f0da/totalvoice/cliente/api/helper/__init__.py -------------------------------------------------------------------------------- /totalvoice/cliente/api/helper/routes.py: -------------------------------------------------------------------------------- 1 | 2 | class Routes(object): 3 | CHAMADA = "/chamada" 4 | SMS = "/sms" 5 | AUDIO = "/audio" 6 | COMPOSTO = "/composto" 7 | CONFERENCIA = "/conferencia" 8 | URA = "/ura" 9 | RAMAL = "/ramal" 10 | TTS = "/tts" 11 | SALDO = "/saldo" 12 | CONTA = "/conta" 13 | CONTA_RECARGAS = "/conta/recargas" 14 | CONTA_URL_RECARGA = "/conta/urlrecarga" 15 | BINA = "/bina" 16 | WEBHOOK = "/webhook" 17 | WEBHOOK_DEFAULT = "/conta/webhook-default" 18 | WEBPHONE = "/webphone" 19 | DID = "/did" 20 | DID_ESTOQUE = "/did/estoque" 21 | DID_CHAMADA = "/did/chamada" 22 | FILA = "/fila" 23 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/helper/utils.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | 4 | def build_header(access_token): 5 | header = {} 6 | header.update({'Content-Type' :'application/json' }) 7 | header.update({'Accept' :'application/json' }) 8 | header.update({'Access-Token' : access_token }) 9 | header.update({'User-Agent': 'lib-python/1.7.0' }) 10 | return header 11 | 12 | def build_host(): 13 | return 'https://voice-api.zenvia.com' -------------------------------------------------------------------------------- /totalvoice/cliente/api/minhaconta.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class MinhaConta(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(MinhaConta, self).__init__(cliente) 13 | 14 | def get_saldo(self): 15 | """ 16 | :Descrição: 17 | 18 | Função para buscar saldo da sua conta. 19 | 20 | :Utilização: 21 | 22 | get_saldo() 23 | """ 24 | host = self.build_host(self.cliente.host, Routes.SALDO) 25 | return self.get_request(host) 26 | 27 | def get_conta(self): 28 | """ 29 | :Descrição: 30 | 31 | Função para buscar a sua conta. 32 | 33 | :Utilização: 34 | 35 | get_conta() 36 | """ 37 | host = self.build_host(self.cliente.host, Routes.CONTA) 38 | return self.get_request(host) 39 | 40 | def editar_conta(self, nome, login, senha, cpf_cnpj=None, preco_fixo=None, preco_cel=None, preco_ramal=None, email_financeiro=None, nome_fantasia=None): 41 | """ 42 | :Descrição: 43 | 44 | Função para editar a sua conta. 45 | 46 | :Utilização: 47 | 48 | editar_conta() 49 | 50 | :Parâmetros: 51 | 52 | - nome: 53 | Nome da conta. 54 | 55 | - login: 56 | Login da conta. 57 | 58 | - senha: 59 | Senha da conta; 60 | 61 | - cpf_cnpj: 62 | CPF ou CNPJ da conta. 63 | 64 | - preco_fixo: 65 | Preço de chamadas para fixo da conta. 66 | 67 | - preco_cel: 68 | Preço de chamadas para celulares da conta. 69 | 70 | - preco_ramal: 71 | Preço para ramais da conta. 72 | 73 | - email_financeiro: 74 | E-mail responsável pelo financeiro da conta. 75 | 76 | - nome_fantasia 77 | Nome fantasia da conta 78 | """ 79 | host = self.build_host(self.cliente.host, Routes.CONTA) 80 | data = self.__build_conta(nome, login, senha, cpf_cnpj, preco_fixo, preco_cel, preco_ramal, email_financeiro, nome_fantasia) 81 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=data) 82 | return response.content 83 | 84 | def get_recargas(self): 85 | """ 86 | :Descrição: 87 | 88 | Função para as recargas da conta. 89 | 90 | :Utilização: 91 | 92 | get_recargas() 93 | """ 94 | host = self.build_host(self.cliente.host, Routes.CONTA_RECARGAS) 95 | return self.get_request(host) 96 | 97 | def get_url_recarga(self, url_retorno): 98 | """ 99 | :Descrição: 100 | 101 | Função para obter a url de recarga da conta. 102 | 103 | :Utilização: 104 | 105 | get_url_recarga() 106 | 107 | :Parâmetros: 108 | 109 | - url_retorno: 110 | URL para retorno depois da recarga ou ao cancelar. 111 | """ 112 | data = {} 113 | data.update({"url_retorno": url_retorno}) 114 | host = self.build_host(self.cliente.host, Routes.CONTA_URL_RECARGA, data=data) 115 | return self.get_request(host) 116 | 117 | def get_webhook(self): 118 | """ 119 | :Descrição: 120 | 121 | Função para obter a lista webhook da conta. 122 | 123 | :Utilização: 124 | 125 | get_webhook() 126 | """ 127 | host = self.build_host(self.cliente.host, Routes.WEBHOOK) 128 | return self.get_request(host) 129 | 130 | def delete_webhook(self, nome_webhook): 131 | """ 132 | :Descrição: 133 | 134 | Função para deletar um webhook. 135 | 136 | :Utilização: 137 | 138 | get_webhook(nome_webhook) 139 | 140 | :Parâmetros: 141 | 142 | - nome_webhook: 143 | Nome do webhook. 144 | """ 145 | host = self.build_host(self.cliente.host, Routes.WEBHOOK, [nome_webhook]) 146 | response = requests.delete(host, headers=utils.build_header(self.cliente.access_token), data=None) 147 | return response.content 148 | 149 | def editar_webhook(self, nome_webhook, url): 150 | """ 151 | :Descrição: 152 | 153 | Função para deletar um webhook. 154 | 155 | :Utilização: 156 | 157 | editar_webhook(nome_webhook, url) 158 | 159 | :Parâmetros: 160 | 161 | - nome_webhook: 162 | Nome do webhook. 163 | 164 | - url: 165 | Url do webhook 166 | """ 167 | host = self.build_host(self.cliente.host, Routes.WEBHOOK, [nome_webhook]) 168 | data = {} 169 | data.update({"url" : url}) 170 | response = requests.put(host, headers=utils.build_header(self.cliente.access_token), data=json.dumps(data)) 171 | return response.content 172 | 173 | 174 | def __build_conta(self, nome, login, senha, cpf_cnpj, preco_fixo, preco_cel, preco_ramal, email_financeiro, nome_fantasia): 175 | data = {} 176 | data.update({"nome": nome}) 177 | data.update({"login": login}) 178 | data.update({"senha": senha}) 179 | data.update({"cpf_cnpj": cpf_cnpj}) 180 | data.update({"preco_fixo": preco_fixo}) 181 | data.update({"preco_cel": preco_cel}) 182 | data.update({"preco_ramal": preco_ramal}) 183 | data.update({"email_financeiro": email_financeiro}) 184 | data.update({"nome_fantasia": nome_fantasia}) 185 | return json.dumps(data) 186 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/sms.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Sms(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Sms, self).__init__(cliente) 13 | 14 | def enviar(self, numero_destino, mensagem, resposta_usuario=None, multi_sms=None, data_criacao=None): 15 | """ 16 | :Descrição: 17 | 18 | Função para enviar mensagens de texto. 19 | 20 | :Utilização: 21 | 22 | enviar(self, numero_destino, mensagem, resposta_usuario, multi_sms) 23 | 24 | :Parâmetros: 25 | 26 | - numero_destino: 27 | Número do telefone que irá receber a mensagem, formato DDD + Número exemplo: 4832830151 28 | 29 | - mensagem: 30 | Mensagem de texto para ser enviada, limite: 160 caracteres não aceita acentos 31 | 32 | - resposta_usuario: 33 | Aguardar uma resposta do destinatário. true ou false. (Opcional) 34 | 35 | - multi_sms: 36 | Aceita SMS com mais de 160 char - ate 16.000. Envia multiplos sms para o mesmo numero (um a cada 160 char) e retorna array de ids. Default false. (Opcional) 37 | 38 | """ 39 | host = self.build_host(self.cliente.host, Routes.SMS) 40 | data = self.__build_sms(numero_destino, mensagem, resposta_usuario, multi_sms, data_criacao) 41 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 42 | return response.content 43 | 44 | def get_by_id(self, id): 45 | """ 46 | :Descrição: 47 | 48 | Função para buscar informações de SMS e respostas. 49 | 50 | :Utilização: 51 | 52 | get_by_id(id) 53 | 54 | :Parâmetros: 55 | 56 | - id: 57 | ID do sms. 58 | """ 59 | host = self.build_host(self.cliente.host, Routes.SMS, [id]) 60 | return self.get_request(host) 61 | 62 | def get_relatorio(self, data_inicio, data_fim): 63 | """ 64 | :Descrição: 65 | 66 | Função para pegar o relatório de sms. 67 | 68 | :Utilização: 69 | 70 | get_relatorio(data_inicio, data_fim) 71 | 72 | :Parâmetros: 73 | 74 | - data_inicio: 75 | Data início do relatório (2016-03-30T17:15:59-03:00) 76 | format UTC 77 | 78 | - data_fim: 79 | Data final do relatório (2016-03-30T17:15:59-03:00) 80 | format UTC 81 | 82 | """ 83 | host = self.build_host(self.cliente.host, Routes.SMS, ["relatorio"]) 84 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 85 | return self.get_request(host, params) 86 | 87 | def __build_sms(self, numero_destino, mensagem, resposta_usuario, multi_sms, data_criacao): 88 | data = {} 89 | data.update({"numero_destino": numero_destino}) 90 | data.update({"mensagem": mensagem}) 91 | data.update({"resposta_usuario": resposta_usuario}) 92 | data.update({"multi_sms": multi_sms}) 93 | data.update({"data_criacao": data_criacao}) 94 | return json.dumps(data) 95 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/totalvoice.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | import requests 3 | from .helper import utils 4 | class Totalvoice(object): 5 | 6 | def __init__(self, cliente): 7 | self.cliente = cliente 8 | 9 | def enviar(self, *args): 10 | raise NotImplementedError 11 | 12 | def get_by_id(self, id): 13 | raise NotImplementedError 14 | 15 | def editar(self, *args): 16 | raise NotImplementedError 17 | 18 | def get_relatorio(self, *args): 19 | raise NotImplementedError 20 | 21 | def deletar(self, id): 22 | raise NotImplementedError 23 | 24 | def get_request(self, host, params = None): 25 | if params != None: 26 | response = requests.get(host, headers=utils.build_header(self.cliente.access_token), params=params) 27 | else: 28 | response = requests.get(host, headers=utils.build_header(self.cliente.access_token)) 29 | return response.content 30 | 31 | def build_host(self, host, route, values=None): 32 | host += route 33 | if values is not None: 34 | for val in values: 35 | host += "/" + val 36 | return host 37 | -------------------------------------------------------------------------------- /totalvoice/cliente/api/tts.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | from __future__ import absolute_import 3 | from .helper import utils 4 | from .helper.routes import Routes 5 | from totalvoice.cliente.api.totalvoice import Totalvoice 6 | import json, requests 7 | 8 | 9 | class Tts(Totalvoice): 10 | 11 | def __init__(self, cliente): 12 | super(Tts, self).__init__(cliente) 13 | 14 | def enviar(self, numero_destino, mensagem, velocidade=None, resposta_usuario=None, tipo_voz=None, bina=None, gravar_audio=None, detecta_caixa=None): 15 | """ 16 | :Descrição: 17 | 18 | Função para enviar TTS (Text-to-speech) 19 | 20 | :Utilização: 21 | 22 | enviar(self, numero_destino, mensagem, velocidade, resposta_usuario, tipo_voz, bina) 23 | 24 | :Parâmetros: 25 | 26 | - numero_destino: 27 | Número do telefone que irá receber a mensagem, formato DDD + Número exemplo: 4832830151. 28 | 29 | - mensagem: 30 | Mensagem que será lida para o destinatário. 31 | 32 | - valocidade 33 | De -10 a 10. Onde -10=muito lento, 0=normal e 10=muito rápido. 34 | 35 | - resposta_usuario: 36 | Aguardar uma resposta do destinatário. true ou false. 37 | 38 | - tipo_voz: 39 | Informe a sigla do idioma concatenado ao nome do personagem que vai falar. Ex: br-Ricardo, br-Vitoria. 40 | 41 | - bina: 42 | Número e telefone que aparecerá no identificador de quem receber a chamada, formato DDD + Número exemplo: 4832830151. 43 | 44 | - gravar_audio: 45 | Opção para gravar áudio sim/não 46 | 47 | - detecta_caixa: 48 | Opção para detecção de caixa postal ao realizar a chamada 49 | """ 50 | host = self.build_host(self.cliente.host, Routes.TTS) 51 | data = self.__build_tts(numero_destino, mensagem, velocidade, resposta_usuario, tipo_voz, bina, gravar_audio, detecta_caixa) 52 | response = requests.post(host, headers=utils.build_header(self.cliente.access_token), data=data) 53 | return response.content 54 | 55 | def get_by_id(self, id): 56 | """ 57 | :Descrição: 58 | 59 | Função para buscar informações de TTS e respostas. 60 | 61 | :Utilização: 62 | 63 | get_by_id(id) 64 | 65 | :Parâmetros: 66 | 67 | - id: 68 | ID do tts. 69 | """ 70 | host = self.build_host(self.cliente.host, Routes.TTS, [id]) 71 | return self.get_request(host) 72 | 73 | def get_relatorio(self, data_inicio, data_fim): 74 | """ 75 | :Descrição: 76 | 77 | Função para pegar o relatório de tts. 78 | 79 | :Utilização: 80 | 81 | get_relatorio(data_inicio, data_fim) 82 | 83 | :Parâmetros: 84 | 85 | - data_inicio: 86 | Data início do relatório (2016-03-30T17:15:59-03:00) 87 | format UTC 88 | 89 | - data_fim: 90 | Data final do relatório (2016-03-30T17:15:59-03:00) 91 | format UTC 92 | 93 | """ 94 | host = self.build_host(self.cliente.host, Routes.TTS, ["relatorio"]) 95 | params = (('data_inicio', data_inicio),('data_fim', data_fim),) 96 | return self.get_request(host, params) 97 | 98 | def __build_tts(self, numero_destino, mensagem, velocidade, resposta_usuario, tipo_voz, bina, gravar_audio, detecta_caixa): 99 | data = {} 100 | data.update({"numero_destino": numero_destino}) 101 | data.update({"mensagem": mensagem}) 102 | data.update({"velocidade": velocidade}) 103 | data.update({"resposta_usuario": resposta_usuario}) 104 | data.update({"tipo_voz": tipo_voz}) 105 | data.update({"bina": bina}) 106 | data.update({"gravar_audio": gravar_audio}) 107 | data.update({"detecta_caixa": detecta_caixa}) 108 | return json.dumps(data) 109 | --------------------------------------------------------------------------------