Perpustakaan SIP Python untuk Solusi VoIP Khusus
PySIP adalah pustaka Python asinkron yang dirancang untuk menyederhanakan pekerjaan dengan Session Initiation Protocol (SIP) untuk komunikasi VoIP. Baik Anda membuat sistem panggilan otomatis, menu respons suara interaktif (IVR), atau aplikasi berbasis SIP apa pun, PySIP memberi Anda fleksibilitas untuk membuat dan mengelola akun SIP, menangani panggilan, dan menerapkan logika khusus dengan mudah.
Fitur | Keterangan |
---|---|
Manajemen Akun SIP Lengkap | Membuat, mendaftarkan, dan mengelola akun SIP dengan mudah. |
Alur Panggilan Khusus | Tulis skrip untuk mengotomatiskan alur panggilan dengan logika bisnis Anda sendiri. |
Lapisan Transportasi UDP | Transportasi UDP yang asinkron dan efisien untuk mengirim dan menerima pesan SIP. |
Penanganan Panggilan Fleksibel | Menangani panggilan SIP masuk dan keluar, memutar pesan, dan mengumpulkan masukan pengguna. |
Sepenuhnya Dapat Diperluas | Termasuk contoh bot untuk pemesanan janji temu, tetapi Anda dapat dengan mudah menulis otomatisasi berbasis SIP apa pun yang Anda perlukan. |
Anda dapat menginstal PySIP langsung dari PyPI menggunakan pip:
pip install PySIPio
Peringatan
Perhatikan bahwa nama paket di PyPI adalah PySIPio
dan bukan PySIP
git clone https://github.com/moha-abdi/PySIP.git
cd PySIP
Pastikan Anda telah menginstal Python 3.8+. Instal dependensi yang diperlukan menggunakan:
pip install -r requirements.txt
Proyek ini disusun untuk memberikan pemisahan yang bersih antara perpustakaan SIP inti dan skrip khusus apa pun yang ingin Anda tulis. Berikut ikhtisar tata letak proyek:
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
Buat file .env
di direktori kerja Anda untuk menyimpan kredensial akun SIP dan detail server Anda:
SIP_USERNAME=your_sip_username
SIP_PASSWORD=your_sip_password
SIP_SERVER=your_sip_server
Akun SIP sangat penting untuk menangani panggilan. Untuk memulai, Anda perlu membuat instance kelas SipAccount
, yang memerlukan kredensial SIP Anda (nama pengguna, kata sandi, dan server). Berikut cara melakukannya:
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" ],
)
Setelah SipAccount
dibuat, langkah selanjutnya adalah mendaftarkannya ke server SIP:
await account . register ()
Ini mengirimkan permintaan REGISTER
SIP ke server untuk mengaktifkan akun. Setelah terdaftar, Anda dapat melakukan panggilan atau mendengarkan panggilan masuk.
Kelas SipAccount
adalah inti dari PySIP. Ini menangani semua tugas terkait akun seperti registrasi, melakukan panggilan, dan membatalkan registrasi dari server SIP.
account = SipAccount ( username , password , server )
Panggil metode register()
untuk mendaftarkan akun SIP ke server:
await account . register ()
Metode make_call(destination)
memulai panggilan ke nomor tujuan:
call = account . make_call ( "destination_number" )
Gunakan dekorator on_incoming_call
untuk mendefinisikan fungsi yang akan menangani panggilan masuk:
@ 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 ()
Setelah selesai, batalkan pendaftaran akun untuk menutup sesi dengan baik:
await account . unregister ()
CallHandler
bertanggung jawab untuk menangani aliran panggilan. Ini memungkinkan Anda mengucapkan pesan, mengumpulkan masukan dari penelepon, atau mentransfer panggilan.
await call_handler . say ( "Welcome to our service." )
Gunakan gather()
untuk mengumpulkan masukan dari pengguna, seperti menekan satu digit:
dtmf_key = await call_handler . gather ( length = 1 , timeout = 5 )
Anda dapat meneruskan panggilan ke nomor lain:
await call_handler . transfer_to ( "1234567890" )
Untuk panggilan masuk, Anda dapat menggunakan cara berikut:
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
adalah modul internal yang mengelola pengiriman dan penerimaan pesan SIP secara asinkron melalui jaringan.
Metode send_message()
mengirimkan pesan UDP ke server SIP atau rekan:
self . transport . sendto ( message )
Metode datagram_received()
menangani pesan masuk, menempatkannya dalam antrian untuk diproses:
self . data_q . put_nowait ( data )
Untuk mendemonstrasikan cara kerja PySIP, kami telah memberikan contoh dasar bot pemesanan janji temu. Bot ini memungkinkan penelepon untuk membuat janji temu melalui panggilan telepon.
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 ())
Meskipun bot pemesanan janji temu hanyalah salah satu contoh, PySIP dirancang untuk memungkinkan Anda membuat otomatisasi berbasis SIP atau skrip khusus yang sesuai dengan kebutuhan Anda.
Untuk membuat skrip Anda sendiri:
scripts/
.CallHandler
untuk mengontrol aliran panggilan.SipAccount
untuk mendaftar dan melakukan panggilan seperti yang ditunjukkan dalam contoh skrip. Kontribusi dipersilahkan! Jika Anda ingin berkontribusi pada pengembangan PySIP, silakan buka terbitan atau kirimkan permintaan penarikan.
Dibuat dengan ❤️ oleh Moha Abdi