用于自定义 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 用 ❤️ 制作