用於自訂 VoIP 解決方案的 Python SIP 函式庫
PySIP是一個非同步 Python 函式庫,旨在簡化 VoIP 通訊的會話啟動協定 (SIP) 的使用。無論您是建立自動呼叫系統、互動式語音應答 (IVR) 選單還是任何基於 SIP 的應用程序,PySIP 都可以讓您靈活地建立和管理 SIP 帳戶、處理呼叫以及輕鬆實現自訂邏輯。
特徵 | 描述 |
---|---|
完整的 SIP 帳號管理 | 輕鬆建立、註冊和管理 SIP 帳戶。 |
自訂呼叫流程 | 編寫腳本以使用您自己的業務邏輯自動執行通話流程。 |
UDP傳輸層 | 用於發送和接收 SIP 訊息的非同步、高效 UDP 傳輸。 |
靈活的呼叫處理 | 處理傳入和傳出 SIP 通話、播放訊息並收集使用者輸入。 |
完全可擴展 | 包括用於預約預訂的範例機器人,但您可以輕鬆編寫所需的任何基於 SIP 的自動化。 |
您可以使用 pip 直接從 PyPI 安裝 PySIP:
pip install PySIPio
警告
請注意,PyPI 上的套件名稱是PySIPio
而不是PySIP
git clone https://github.com/moha-abdi/PySIP.git
cd PySIP
確保您已安裝 Python 3.8+。使用以下命令安裝所需的依賴項:
pip install -r requirements.txt
該專案的結構是為了在核心 SIP 庫和您想要編寫的任何自訂腳本之間提供清晰的分離。以下是專案佈局的概述:
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
在工作目錄中建立一個.env
檔案來儲存您的 SIP 帳戶憑證和伺服器詳細資料:
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
SIP 帳戶對於處理通話至關重要。首先,您需要建立SipAccount
類別的實例,這需要您的 SIP 憑證(使用者名稱、密碼和伺服器)。操作方法如下:
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" ],
)
建立SipAccount
後,下一步是將其註冊到 SIP 伺服器:
await account . register ()
這將向伺服器發送 SIP REGISTER
請求以啟動帳戶。註冊後,您可以撥打電話或接聽來電。
SipAccount
類別是 PySIP 的核心。它處理所有與帳戶相關的任務,例如註冊、撥打電話以及從 SIP 伺服器取消註冊。
account = SipAccount ( username , password , server )
呼叫register()
方法向伺服器註冊SIP帳號:
await account . register ()
make_call(destination)
方法發起目的地號碼的呼叫:
call = account . make_call ( "destination_number" )
使用on_incoming_call
裝飾器定義一個處理傳入呼叫的函數:
@ 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 ()
完成後,取消註冊帳戶以正常關閉會話:
await account . unregister ()
CallHandler
負責處理呼叫流程。它允許您說出訊息、收集呼叫者的輸入或轉接呼叫。
await call_handler . say ( "Welcome to our service." )
使用gather()
收集使用者的輸入,例如按數字:
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )
您可以將通話轉接到另一個號碼:
await call_handler . transfer_to ( "1234567890" )
對於來電,您可以使用以下方法:
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
是一個內部模組,用於管理透過網路非同步傳送和接收 SIP 訊息。
send_message()
方法向 SIP 伺服器或對等方傳送 UDP 訊息:
self . transport . sendto ( message )
datagram_received()
方法處理傳入訊息,將它們放入佇列中處理:
self . data_q . put_nowait ( data )
為了展示 PySIP 的實際應用,我們提供了一個預約機器人的基本範例。該機器人允許呼叫者透過電話進行預約。
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 ())
雖然預約機器人只是一個範例,但 PySIP旨在讓您創建任何適合您需求的基於 SIP 的自動化或自訂腳本。
若要建立您自己的腳本:
scripts/
目錄中建立一個 Python 檔案。CallHandler
類別編寫自訂呼叫邏輯來控制呼叫流程。SipAccount
註冊並撥打電話,如範例腳本中所示。 歡迎貢獻!如果您想為 PySIP 的開發做出貢獻,請隨時提出問題或提交拉取請求。
由 Moha Abdi 用 ❤️ 製作