Biblioteca SIP de Python para soluciones VoIP personalizadas
PySIP es una biblioteca de Python asincrónica diseñada para simplificar el trabajo con el Protocolo de inicio de sesión (SIP) para la comunicación VoIP. Ya sea que esté creando sistemas de llamadas automatizados, menús de respuesta de voz interactiva (IVR) o cualquier aplicación basada en SIP, PySIP le brinda la flexibilidad de crear y administrar cuentas SIP, manejar llamadas e implementar lógica personalizada con facilidad.
| Característica | Descripción |
|---|---|
| Gestión completa de cuentas SIP | Cree, registre y administre fácilmente cuentas SIP. |
| Flujos de llamadas personalizados | Escriba scripts para automatizar los flujos de llamadas con su propia lógica empresarial. |
| Capa de transporte UDP | Transporte UDP asincrónico y eficiente para enviar y recibir mensajes SIP. |
| Manejo flexible de llamadas | Maneje llamadas SIP entrantes y salientes, reproduzca mensajes y recopile entradas de usuarios. |
| Totalmente extensible | Incluye un bot de ejemplo para reservar citas, pero puede escribir fácilmente cualquier automatización basada en SIP que necesite. |
Puede instalar PySIP directamente desde PyPI usando pip:
pip install PySIPioPrecaución
Tenga en cuenta que el nombre del paquete en PyPI es PySIPio y no PySIP
git clone https://github.com/moha-abdi/PySIP.git
cd PySIPAsegúrese de tener Python 3.8+ instalado. Instale las dependencias requeridas usando:
pip install -r requirements.txtEl proyecto está estructurado para proporcionar una separación clara entre la biblioteca SIP principal y cualquier script personalizado que desee escribir. Aquí hay una descripción general del diseño del proyecto:
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
Cree un archivo .env en su directorio de trabajo para almacenar las credenciales de su cuenta SIP y los detalles del servidor:
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server Una cuenta SIP es esencial para manejar llamadas. Para comenzar, necesita crear una instancia de la clase SipAccount , que requiere sus credenciales SIP (nombre de usuario, contraseña y servidor). He aquí cómo hacerlo:
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" ],
) Una vez creada la SipAccount , el siguiente paso es registrarla en el servidor SIP:
await account . register () Esto envía una solicitud REGISTER SIP al servidor para activar la cuenta. Una vez registrado, podrá realizar llamadas o escuchar llamadas entrantes.
La clase SipAccount es el núcleo de PySIP. Maneja todas las tareas relacionadas con la cuenta, como el registro, la realización de llamadas y la cancelación del registro del servidor SIP.
account = SipAccount ( username , password , server ) Llame al método register() para registrar la cuenta SIP con el servidor:
await account . register () El método make_call(destination) inicia una llamada al número de destino:
call = account . make_call ( "destination_number" ) Utilice el decorador on_incoming_call para definir una función que manejará las llamadas entrantes:
@ 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 ()Cuando haya terminado, cancele el registro de la cuenta para cerrar la sesión correctamente:
await account . unregister () CallHandler es responsable de manejar el flujo de llamadas. Le permite decir mensajes, recopilar información de la persona que llama o transferir la llamada.
await call_handler . say ( "Welcome to our service." ) Utilice gather() para recopilar información del usuario, como presionar un dígito:
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )Puedes desviar la llamada a otro número:
await call_handler . transfer_to ( "1234567890" )Para llamadas entrantes, puede utilizar los siguientes 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 UdpHandler es un módulo interno que gestiona el envío y recepción asincrónica de mensajes SIP a través de la red.
El método send_message() envía un mensaje UDP al servidor SIP o par:
self . transport . sendto ( message ) El método datagram_received() maneja los mensajes entrantes y los coloca en una cola para su procesamiento:
self . data_q . put_nowait ( data )Para demostrar PySIP en acción, proporcionamos un ejemplo básico de un bot de reserva de citas. Este bot permite a las personas que llaman reservar citas mediante una llamada 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 ())Si bien el robot de reserva de citas es solo un ejemplo, PySIP está diseñado para permitirle crear cualquier automatización basada en SIP o script personalizado que se adapte a sus necesidades.
Para crear su propio script:
scripts/ .CallHandler para controlar el flujo de llamadas.SipAccount para registrarse y realizar llamadas como se muestra en el script de ejemplo. ¡Las contribuciones son bienvenidas! Si desea contribuir al desarrollo de PySIP, no dude en abrir incidencias o enviar solicitudes de extracción.
Hecho con ❤️ por Moha Abdi