Библиотека Python SIP для индивидуальных решений VoIP
PySIP — это асинхронная библиотека Python, предназначенная для упрощения работы с протоколом инициации сеанса (SIP) для связи VoIP. Независимо от того, создаете ли вы автоматизированные системы вызовов, меню интерактивного голосового ответа (IVR) или любое приложение на основе SIP, PySIP дает вам гибкость для создания и управления учетными записями SIP, обработки вызовов и с легкостью реализации пользовательской логики.
Особенность | Описание |
---|---|
Полное управление учетной записью SIP | Легко создавайте, регистрируйте и управляйте учетными записями SIP. |
Пользовательские потоки вызовов | Напишите сценарии для автоматизации потоков вызовов с помощью собственной бизнес-логики. |
Транспортный уровень UDP | Асинхронный, эффективный транспорт UDP для отправки и получения сообщений SIP. |
Гибкая обработка вызовов | Обрабатывайте входящие и исходящие вызовы SIP, воспроизводите сообщения и собирайте данные пользователей. |
Полностью расширяемый | Включает пример бота для записи на прием, но вы можете легко написать любую необходимую автоматизацию на основе SIP. |
Вы можете установить PySIP непосредственно из PyPI, используя pip:
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/
.CallHandler
для управления потоком вызовов.SipAccount
для регистрации и совершения звонков, как показано в примере сценария. Вклады приветствуются! Если вы хотите внести свой вклад в разработку PySIP, не стесняйтесь открывать проблемы или отправлять запросы на включение.
Сделано с ❤️ Мохой Абди