カスタム VoIP ソリューション用の Python SIP ライブラリ
PySIP は、 VoIP 通信用のセッション開始プロトコル (SIP) の操作を簡素化するように設計された非同期 Python ライブラリです。自動通話システム、自動音声応答 (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()
メソッドは、UDP メッセージを SIP サーバーまたはピアに送信します。
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 の開発に貢献したい場合は、お気軽にイシューを開いたり、プル リクエストを送信したりしてください。
モハ・アブディによる❤️で作られました