مكتبة Python SIP لحلول VoIP المخصصة
PySIP هي مكتبة Python غير متزامنة مصممة لتبسيط العمل مع بروتوكول بدء الجلسة (SIP) لاتصالات VoIP. سواء كنت تقوم بإنشاء أنظمة مكالمات آلية، أو قوائم الاستجابة الصوتية التفاعلية (IVR)، أو أي تطبيق يستند إلى SIP، فإن PySIP يمنحك المرونة اللازمة لإنشاء حسابات SIP وإدارتها، والتعامل مع المكالمات، وتنفيذ المنطق المخصص بسهولة.
ميزة | وصف |
---|---|
إدارة حساب SIP كاملة | يمكنك إنشاء حسابات SIP وتسجيلها وإدارتها بسهولة. |
تدفقات المكالمات المخصصة | قم بكتابة البرامج النصية لأتمتة تدفقات المكالمات باستخدام منطق عملك الخاص. |
طبقة النقل UDP | نقل UDP غير متزامن وفعال لإرسال واستقبال رسائل SIP. |
التعامل المرن مع المكالمات | التعامل مع مكالمات SIP الواردة والصادرة، وتشغيل الرسائل، وجمع مدخلات المستخدم. |
قابلة للتوسعة بالكامل | يتضمن نموذجًا لروبوت لحجز المواعيد، ولكن يمكنك بسهولة كتابة أي أتمتة تعتمد على SIP تحتاجها. |
يمكنك تثبيت PySIP مباشرةً من PyPI باستخدام النقطة:
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 ()
يؤدي هذا إلى إرسال طلب REGISTER
SIP إلى الخادم لتنشيط الحساب. بمجرد التسجيل، يمكنك إجراء المكالمات أو الاستماع إلى المكالمات الواردة.
تقع فئة 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، فلا تتردد في فتح المشكلات أو إرسال طلبات السحب.
صنع بواسطة ❤️ موها عبدي