Python SIP Library สำหรับโซลูชัน VoIP แบบกำหนดเอง
PySIP เป็นไลบรารี Python แบบอะซิงโครนัสที่ออกแบบมาเพื่อลดความซับซ้อนในการทำงานกับ Session Initiation Protocol (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 โปรดเปิดประเด็นหรือส่งคำขอดึงข้อมูล
ทำด้วย❤️โดย Moha Abdi