맞춤형 VoIP 솔루션을 위한 Python SIP 라이브러리
PySIP 는 VoIP 통신을 위한 SIP(Session Initiation Protocol) 작업을 단순화하도록 설계된 비동기식 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
SIP 계정 자격 증명 및 서버 세부 정보를 저장하려면 작업 디렉터리에 .env
파일을 만듭니다.
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
통화를 처리하려면 SIP 계정이 필수적입니다. 시작하려면 SIP 자격 증명(사용자 이름, 비밀번호 및 서버)이 필요한 SipAccount
클래스의 인스턴스를 생성해야 합니다. 수행 방법은 다음과 같습니다.
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의 ❤️으로 제작됨