Biblioteca SIP Python para soluções VoIP personalizadas
PySIP é uma biblioteca Python assíncrona projetada para simplificar o trabalho com o Session Initiation Protocol (SIP) para comunicação VoIP. Esteja você construindo sistemas de chamadas automatizados, menus interativos de resposta de voz (IVR) ou qualquer aplicativo baseado em SIP, o PySIP oferece flexibilidade para criar e gerenciar contas SIP, lidar com chamadas e implementar lógica personalizada com facilidade.
Recurso | Descrição |
---|---|
Gerenciamento completo de contas SIP | Crie, registre e gerencie facilmente contas SIP. |
Fluxos de chamada personalizados | Escreva scripts para automatizar fluxos de chamadas com sua própria lógica de negócios. |
Camada de Transporte UDP | Transporte UDP assíncrono e eficiente para envio e recebimento de mensagens SIP. |
Tratamento flexível de chamadas | Lide com chamadas SIP recebidas e efetuadas, reproduza mensagens e colete informações do usuário. |
Totalmente extensível | Inclui um bot de exemplo para agendamento de compromissos, mas você pode escrever facilmente qualquer automação baseada em SIP necessária. |
Você pode instalar o PySIP diretamente do PyPI usando pip:
pip install PySIPio
Cuidado
Observe que o nome do pacote no PyPI é PySIPio
e não PySIP
git clone https://github.com/moha-abdi/PySIP.git
cd PySIP
Certifique-se de ter o Python 3.8+ instalado. Instale as dependências necessárias usando:
pip install -r requirements.txt
O projeto está estruturado para fornecer uma separação clara entre a biblioteca SIP principal e quaisquer scripts personalizados que você deseja escrever. Aqui está uma visão geral do layout do projeto:
PySIP/
│
├── PySIP/ # Core library files
│ ├── sip_account.py # SIP account management
│ ├── sip_core.py # SIP message parsing and handling
│ ├── udp_handler.py # Asynchronous UDP transport for SIP
│
├── scripts/ # Example custom scripts
│ └── appointment_booking_bot.py # Example bot for appointment booking
│
├── test.py # Example usage of PySIP for testing
├── requirements.txt # Project dependencies
├── .env.example # Example environment configuration
└── README.md # Project documentation
Crie um arquivo .env
em seu diretório de trabalho para armazenar as credenciais da sua conta SIP e detalhes do servidor:
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
Uma conta SIP é essencial para lidar com chamadas. Para começar, você precisa criar uma instância da classe SipAccount
, que requer suas credenciais SIP (nome de usuário, senha e servidor). Veja como fazer isso:
from PySIP . sip_account import SipAccount
import os
from dotenv import load_dotenv
# Load SIP credentials from .env file
load_dotenv ()
account = SipAccount (
os . environ [ "SIP_USERNAME" ],
os . environ [ "SIP_PASSWORD" ],
os . environ [ "SIP_SERVER" ],
)
Uma vez criada a SipAccount
, o próximo passo é registrá-la no servidor SIP:
await account . register ()
Isso envia uma solicitação SIP REGISTER
ao servidor para ativar a conta. Uma vez registrado, você pode fazer chamadas ou ouvir chamadas recebidas.
A classe SipAccount
está no centro do PySIP. Ele lida com todas as tarefas relacionadas à conta, como registro, realização de chamadas e cancelamento de registro do servidor SIP.
account = SipAccount ( username , password , server )
Chame o método register()
para registrar a conta SIP no servidor:
await account . register ()
O método make_call(destination)
inicia uma chamada para o número de destino:
call = account . make_call ( "destination_number" )
Use o decorador on_incoming_call
para definir uma função que tratará as chamadas recebidas:
@ account . on_incoming_call
async def handle_incoming_call ( call : SipCall ):
await call . accept () # or call.reject() or call.busy()
await call . call_handler . say ( "Thank you for calling us!" )
await call . call_handler . hangup ()
Quando terminar, cancele o registro da conta para encerrar a sessão normalmente:
await account . unregister ()
O CallHandler
é responsável por lidar com o fluxo de chamadas. Ele permite que você diga mensagens, obtenha informações do chamador ou transfira a chamada.
await call_handler . say ( "Welcome to our service." )
Use gather()
para coletar informações do usuário, como pressionar um dígito:
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )
Você pode encaminhar a chamada para outro número:
await call_handler . transfer_to ( "1234567890" )
Para chamadas recebidas, você pode usar os seguintes métodos:
await call . accept () # Accept the incoming call
await call . reject () # Reject the incoming call
await call . busy () # Mark the line as busy for the incoming call
O UdpHandler
é um módulo interno que gerencia o envio e recebimento assíncrono de mensagens SIP pela rede.
O método send_message()
envia uma mensagem UDP para o servidor SIP ou peer:
self . transport . sendto ( message )
O método datagram_received()
trata as mensagens recebidas, colocando-as em uma fila para processamento:
self . data_q . put_nowait ( data )
Para demonstrar o PySIP em ação, fornecemos um exemplo básico de bot de agendamento de compromissos. Este bot permite que os chamadores marquem compromissos por meio de uma chamada telefônica.
import asyncio
from PySIP . sip_account import SipAccount
from scripts . appointment_booking_bot import appointment_booking_bot
from dotenv import load_dotenv
import os
# Load environment variables
load_dotenv ()
# Initialize SIP account with credentials from .env file
account = SipAccount (
os . environ [ "SIP_USERNAME" ],
os . environ [ "SIP_PASSWORD" ],
os . environ [ "SIP_SERVER" ],
)
@ account . on_incoming_call
async def handle_incoming_call ( call : SipCall ):
await call . accept ()
await call . call_handler . say ( "We have received your call successfully" )
async def main ():
# Register the SIP account
await account . register ()
# Make a call to a test number (e.g., '111')
call = account . make_call ( "111" )
call_task = asyncio . create_task ( call . start ())
# Run the appointment booking bot
await appointment_booking_bot ( call . call_handler , customer_name = "John" )
# Wait for the call to complete, then unregister
await call_task
await account . unregister ()
if __name__ == "__main__" :
asyncio . run ( main ())
Embora o bot de agendamento de compromissos seja apenas um exemplo, o PySIP foi projetado para permitir que você crie qualquer automação baseada em SIP ou script personalizado que atenda às suas necessidades.
Para criar seu próprio script:
scripts/
.CallHandler
para controlar o fluxo de chamada.SipAccount
para cadastrar e realizar ligações conforme demonstrado no script de exemplo. Contribuições são bem-vindas! Se você gostaria de contribuir para o desenvolvimento do PySIP, sinta-se à vontade para abrir problemas ou enviar solicitações pull.
Feito com ❤️ por Moha Abdi