Bibliothèque SIP Python pour les solutions VoIP personnalisées
PySIP est une bibliothèque Python asynchrone conçue pour simplifier l'utilisation du protocole d'initiation de session (SIP) pour la communication VoIP. Que vous créiez des systèmes d'appel automatisés, des menus de réponse vocale interactive (IVR) ou toute autre application basée sur SIP, PySIP vous offre la flexibilité nécessaire pour créer et gérer des comptes SIP, gérer les appels et mettre en œuvre facilement une logique personnalisée.
Fonctionnalité | Description |
---|---|
Gestion complète du compte SIP | Créez, enregistrez et gérez facilement des comptes SIP. |
Flux d'appels personnalisés | Écrivez des scripts pour automatiser les flux d'appels avec votre propre logique métier. |
Couche de transport UDP | Transport UDP asynchrone et efficace pour l'envoi et la réception de messages SIP. |
Gestion flexible des appels | Gérez les appels SIP entrants et sortants, diffusez des messages et recueillez les commentaires des utilisateurs. |
Entièrement extensible | Comprend un exemple de bot pour la prise de rendez-vous, mais vous pouvez facilement écrire toute automatisation basée sur SIP dont vous avez besoin. |
Vous pouvez installer PySIP directement depuis PyPI en utilisant pip :
pip install PySIPio
Prudence
Notez que le nom du package sur PyPI est PySIPio
et non PySIP
git clone https://github.com/moha-abdi/PySIP.git
cd PySIP
Assurez-vous que Python 3.8+ est installé. Installez les dépendances requises en utilisant :
pip install -r requirements.txt
Le projet est structuré pour fournir une séparation nette entre la bibliothèque SIP principale et tous les scripts personnalisés que vous souhaitez écrire. Voici un aperçu de la disposition du projet :
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
Créez un fichier .env
dans votre répertoire de travail pour stocker les informations d'identification de votre compte SIP et les détails du serveur :
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
Un compte SIP est indispensable pour gérer les appels. Pour commencer, vous devez créer une instance de la classe SipAccount
, qui nécessite vos informations d'identification SIP (nom d'utilisateur, mot de passe et serveur). Voici comment procéder :
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" ],
)
Une fois le SipAccount
créé, l'étape suivante consiste à l'enregistrer auprès du serveur SIP :
await account . register ()
Cela envoie une requête SIP REGISTER
au serveur pour activer le compte. Une fois inscrit, vous pouvez passer des appels ou écouter les appels entrants.
La classe SipAccount
est au cœur de PySIP. Il gère toutes les tâches liées au compte telles que l'enregistrement, les appels et la désinscription du serveur SIP.
account = SipAccount ( username , password , server )
Appelez la méthode register()
pour enregistrer le compte SIP auprès du serveur :
await account . register ()
La méthode make_call(destination)
lance un appel vers le numéro de destination :
call = account . make_call ( "destination_number" )
Utilisez le décorateur on_incoming_call
pour définir une fonction qui gérera les appels entrants :
@ 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 ()
Lorsque vous avez terminé, désenregistrez le compte pour fermer la session en douceur :
await account . unregister ()
Le CallHandler
est responsable de la gestion du flux d’appels. Il vous permet de prononcer des messages, de recueillir les commentaires de l'appelant ou de transférer l'appel.
await call_handler . say ( "Welcome to our service." )
Utilisez gather()
pour recueillir les entrées de l'utilisateur, par exemple en appuyant sur un chiffre :
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )
Vous pouvez renvoyer l'appel vers un autre numéro :
await call_handler . transfer_to ( "1234567890" )
Pour les appels entrants, vous pouvez utiliser les méthodes suivantes :
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
L' UdpHandler
est un module interne qui gère l'envoi et la réception asynchrones de messages SIP sur le réseau.
La méthode send_message()
envoie un message UDP au serveur ou homologue SIP :
self . transport . sendto ( message )
La méthode datagram_received()
gère les messages entrants, en les plaçant dans une file d'attente pour traitement :
self . data_q . put_nowait ( data )
Pour démontrer PySIP en action, nous avons fourni un exemple de base de robot de prise de rendez-vous. Ce bot permet aux appelants de prendre rendez-vous via un appel téléphonique.
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 ())
Bien que le robot de prise de rendez-vous ne soit qu'un exemple, PySIP est conçu pour vous permettre de créer n'importe quelle automatisation basée sur SIP ou script personnalisé qui répond à vos besoins.
Pour créer votre propre script :
scripts/
.CallHandler
pour contrôler le flux d'appels.SipAccount
pour vous inscrire et passer des appels comme illustré dans l'exemple de script. Les contributions sont les bienvenues ! Si vous souhaitez contribuer au développement de PySIP, n'hésitez pas à ouvrir des tickets ou à soumettre des pull request.
Réalisé avec ❤️ par Moha Abdi