Python-SIP-Bibliothek für benutzerdefinierte VoIP-Lösungen
PySIP ist eine asynchrone Python-Bibliothek, die die Arbeit mit dem Session Initiation Protocol (SIP) für die VoIP-Kommunikation vereinfacht. Unabhängig davon, ob Sie automatisierte Anrufsysteme, interaktive Sprachantwortmenüs (IVR) oder eine beliebige SIP-basierte Anwendung erstellen, bietet Ihnen PySIP die Flexibilität, SIP-Konten zu erstellen und zu verwalten, Anrufe abzuwickeln und benutzerdefinierte Logik problemlos zu implementieren.
Besonderheit | Beschreibung |
---|---|
Komplette SIP-Kontoverwaltung | Erstellen, registrieren und verwalten Sie ganz einfach SIP-Konten. |
Benutzerdefinierte Anrufverläufe | Schreiben Sie Skripte, um Anrufabläufe mit Ihrer eigenen Geschäftslogik zu automatisieren. |
UDP-Transportschicht | Asynchroner, effizienter UDP-Transport zum Senden und Empfangen von SIP-Nachrichten. |
Flexible Anrufbearbeitung | Verarbeiten Sie eingehende und ausgehende SIP-Anrufe, spielen Sie Nachrichten ab und sammeln Sie Benutzereingaben. |
Vollständig erweiterbar | Enthält einen Beispiel-Bot für die Terminbuchung, aber Sie können ganz einfach jede SIP-basierte Automatisierung schreiben, die Sie benötigen. |
Sie können PySIP direkt von PyPI mit pip installieren:
pip install PySIPio
Vorsicht
Beachten Sie, dass der Paketname auf PyPI PySIPio
und nicht PySIP
ist
git clone https://github.com/moha-abdi/PySIP.git
cd PySIP
Stellen Sie sicher, dass Python 3.8+ installiert ist. Installieren Sie die erforderlichen Abhängigkeiten mit:
pip install -r requirements.txt
Das Projekt ist so strukturiert, dass eine saubere Trennung zwischen der SIP-Kernbibliothek und allen benutzerdefinierten Skripten gewährleistet ist, die Sie schreiben möchten. Hier ein Überblick über den Projektaufbau:
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
Erstellen Sie eine .env
Datei in Ihrem Arbeitsverzeichnis, um Ihre SIP-Kontoanmeldeinformationen und Serverdetails zu speichern:
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
Für die Abwicklung von Anrufen ist ein SIP-Konto unerlässlich. Um zu beginnen, müssen Sie eine Instanz der SipAccount
-Klasse erstellen, die Ihre SIP-Anmeldeinformationen (Benutzername, Passwort und Server) erfordert. So geht's:
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" ],
)
Sobald der SipAccount
erstellt ist, besteht der nächste Schritt darin, ihn beim SIP-Server zu registrieren:
await account . register ()
Dadurch wird eine SIP- REGISTER
Anfrage an den Server gesendet, um das Konto zu aktivieren. Nach der Registrierung können Sie Anrufe tätigen oder auf eingehende Anrufe warten.
Die SipAccount
-Klasse ist das Herzstück von PySIP. Es übernimmt alle kontobezogenen Aufgaben wie die Registrierung, das Tätigen von Anrufen und die Abmeldung vom SIP-Server.
account = SipAccount ( username , password , server )
Rufen Sie die Methode register()
auf, um das SIP-Konto beim Server zu registrieren:
await account . register ()
Die Methode make_call(destination)
initiiert einen Anruf an die Zielnummer:
call = account . make_call ( "destination_number" )
Verwenden Sie den Dekorator on_incoming_call
, um eine Funktion zu definieren, die eingehende Anrufe verarbeitet:
@ 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 ()
Wenn Sie fertig sind, heben Sie die Registrierung des Kontos auf, um die Sitzung ordnungsgemäß zu schließen:
await account . unregister ()
Der CallHandler
ist für die Abwicklung des Anrufablaufs verantwortlich. Sie können damit Nachrichten sagen, Eingaben vom Anrufer einholen oder den Anruf weiterleiten.
await call_handler . say ( "Welcome to our service." )
Verwenden Sie gather()
, um Eingaben vom Benutzer zu sammeln, z. B. das Drücken einer Ziffer:
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )
Sie können den Anruf an eine andere Nummer weiterleiten:
await call_handler . transfer_to ( "1234567890" )
Für eingehende Anrufe können Sie die folgenden Methoden verwenden:
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
Der UdpHandler
ist ein internes Modul, das das asynchrone Senden und Empfangen von SIP-Nachrichten über das Netzwerk verwaltet.
Die Methode send_message()
sendet eine UDP-Nachricht an den SIP-Server oder Peer:
self . transport . sendto ( message )
Die Methode datagram_received()
verarbeitet eingehende Nachrichten und stellt sie zur Verarbeitung in eine Warteschlange:
self . data_q . put_nowait ( data )
Um PySIP in Aktion zu demonstrieren, haben wir ein einfaches Beispiel eines Terminbuchungs-Bots bereitgestellt. Dieser Bot ermöglicht es Anrufern, Termine per Telefonanruf zu buchen.
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 ())
Während der Terminbuchungs-Bot nur ein Beispiel ist, ist PySIP so konzipiert, dass Sie jede SIP-basierte Automatisierung oder jedes benutzerdefinierte Skript erstellen können, das Ihren Anforderungen entspricht.
So erstellen Sie Ihr eigenes Skript:
scripts/
.CallHandler
-Klasse, um den Anrufablauf zu steuern.SipAccount
zum Registrieren und Tätigen von Anrufen, wie im Beispielskript gezeigt. Beiträge sind willkommen! Wenn Sie zur Entwicklung von PySIP beitragen möchten, können Sie gerne Issues eröffnen oder Pull-Requests einreichen.
Hergestellt mit ❤️ von Moha Abdi