Скрипт (н-р, на Python) учета телефонных звонков
В аттаче картинка с схемой реализации учета звонков.
Описание таблицы базы данных:
Базу данных заполняет SIP сервер (asterisk)
TABLE cdr (
calldate timestamp with time zone DEFAULT now() NOT NULL,
clid character varying(80) DEFAULT ''::character varying NOT NULL,
src character varying(80) DEFAULT ''::character varying NOT NULL,
dst character varying(80) DEFAULT ''::character varying NOT NULL,
dcontext character varying(80) DEFAULT ''::character varying NOT NULL,
channel character varying(80) DEFAULT ''::character varying NOT NULL,
dstchannel character varying(80) DEFAULT ''::character varying NOT NULL,
lastapp character varying(80) DEFAULT ''::character varying NOT NULL,
lastdata character varying(80) DEFAULT ''::character varying NOT NULL,
duration bigint DEFAULT (0)::bigint NOT NULL,
billsec bigint DEFAULT (0)::bigint NOT NULL,
disposition character varying(45) DEFAULT ''::character varying NOT NULL,
amaflags bigint DEFAULT (0)::bigint NOT NULL,
accountcode character varying(20) DEFAULT ''::character varying NOT NULL,
uniqueid character varying(150) DEFAULT ''::character varying NOT NULL,
userfield character varying(255) DEFAULT ''::character varying NOT NULL
);
описание:
clid - на какой номер был вызов (абонент)
dst = 100 - звонок во время статьи дня
billsec - длительность звонка
-------------
Добавка:
dst = 103 - звонок во время утреннего урока
Уточнение:
Деньги считает оператор SIP телефонии, мы можем считать только время, например лимит 360 минут, это два урока, по деньгам это 10-12 долларов.
Сейчас ситема реализована так, что позвонить может каждый желающий, блокировка производится вручную при помощи файла blocked.lst вида:
74956996652
74956996578
В случае превышения установленного лимита минут добавляем номер абонента в этот файл.
В случае если администратор убирает блокировку - удаляем номер из этого файла.
В принципе ничего не мешает реализовать тот же алгоритм используя базу данных, при помощи python скрипта
Сейчас скрипты работают так:
Принимаем входящий звонок
Определяем номер звонящего
Проверяем есть ли этот номер в списке заблокированных
Если номер не заблокирован - перезваниваем.
Система перезванивает при создании файла вида:
NUMBER=$1 #берем номер абонента из командной строки
echo "Channel: SIP/$NUMBER@sipmarket
MaxRetries: 1
RetryTime: 30
WaitTime: 120
Context: lesson-out
Extension: 103
Priority: 2
AlwaysDelete: Yes
Callerid: $NUMBER" >/var/spool/asterisk/tmp/$NUMBER.call # помещаем файл вызова во временную папку
sleep 10 #даем человеку время повесить трубку
cp /var/spool/asterisk/tmp/$NUMBER.call /var/spool/asterisk/outgoing/$NUMBER.call #копируем файл для отрабатывания системы
файл в папке /var/spool/asterisk/tmp/ оставляем для контроля, кто пользовался услугой.
нынешние скрипты написаны на шелле :)
база - posgresql
-------------
По сути, надо только собрать номера телефонов и сколько кто проговорил, чтобы отсеять те, у которых деньги кончились (видимо только по номеру телефона - где организован и как список абонентов), чтобы им больше не звонить.
Можно сделать наоборот, писать в файл только разрешенные номера.
-------------
Будут уточняющие вопросы, спрашивайте!
А так жду сроков и стоимостей исполнения.