125 lines
7.1 KiB
Markdown
125 lines
7.1 KiB
Markdown
# Дифы для АТС (Asterisk 13.18.5) — автодозвон SuperSam
|
||
# Показываются Паше ДО применения. Все правки аддитивные, существующие звонки не трогают.
|
||
|
||
=====================================================================
|
||
## ПРАВКА 1 — Новый контекст диалплана `[SS-Autocall-Slot]`
|
||
=====================================================================
|
||
Файл: /etc/asterisk/extensions.conf (добавить в конец, после [mmedia-Incoming])
|
||
|
||
[SS-Autocall-Slot]
|
||
; Автодозвон SuperSam: робот (Vivienne) опрашивает клиента по DTMF.
|
||
; Вызывается из call-файла планировщика (Context: SS-Autocall-Slot).
|
||
; Переменные SCENARIO/CALLTYPE/GROUP_ID/ATTEMPT/API_URL/API_KEY/TEST_MODE
|
||
; приходят из call-файла через Setvar.
|
||
exten => s,1,NoOp(SS-Autocall-Slot: scenario=${SCENARIO} group=${GROUP_ID} attempt=${ATTEMPT})
|
||
same => n,Answer()
|
||
same => n,Wait(1)
|
||
same => n,AGI(ss-dialog.agi,${SCENARIO},${CALLTYPE})
|
||
same => n,Hangup()
|
||
|
||
; --- конец правки 1 ---
|
||
|
||
=====================================================================
|
||
## ПРАВКА 2 — curl результата в конец ss-dialog.agi
|
||
=====================================================================
|
||
Файл: /var/lib/asterisk/agi-bin/ss-dialog.agi
|
||
Вставляется ПОСЛЕ строки 160 (после `echo "finished_at=..." >> "$OUT"`),
|
||
ПЕРЕД `say "HANGUP"`. Не меняет логику диалога — только отправляет итог в БД.
|
||
|
||
# ─── отправка результата в БД (edge function autocall-result) ───────
|
||
# Переменные приходят из call-файла (Setvar). При потере сети звонок не
|
||
# валится: curl с таймаутом, результат всё равно остался в $OUT.
|
||
if [ -n "$API_URL" ] && [ -n "$API_KEY" ]; then
|
||
curl -s --max-time 5 -X POST "$API_URL" \
|
||
-H "Content-Type: application/json" \
|
||
-H "x-webhook-secret: $API_KEY" \
|
||
-d "{
|
||
\"asterisk_uniqueid\":\"$UNIQ\",
|
||
\"order_group_id\":\"${GROUP_ID:-}\",
|
||
\"campaign_type\":\"autocall_slot\",
|
||
\"customer_phone\":\"${CUSTOMER_PHONE:-}\",
|
||
\"attempt_no\":${ATTEMPT:-1},
|
||
\"scenario\":\"$SCENARIO\",
|
||
\"call_started_at\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
|
||
\"answered_at\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\",
|
||
\"duration_sec\":0,
|
||
\"sip_code\":200,
|
||
\"channel_state\":\"Up\",
|
||
\"dtmf_day\":${CONF_DAY:-null},
|
||
\"dtmf_half\":${CONF_HALF:-null},
|
||
\"changed\":\"$CHANGED\",
|
||
\"outcome\":\"$OUTCOME\",
|
||
\"was_test_mode\":${TEST_MODE:-0}
|
||
}" >/dev/null 2>&1 || echo "curl result failed (network?)" >> "$LOG"
|
||
fi
|
||
|
||
; --- конец правки 2 ---
|
||
|
||
=====================================================================
|
||
## ПРАВКА 3 — Автозагрузка pbx_spool.so и res_agi.so
|
||
=====================================================================
|
||
Файл: /etc/asterisk/modules.conf (в секцию Core/PBX добавить)
|
||
|
||
; --- в секцию "Core/PBX" ---
|
||
load = pbx_spool.so
|
||
load = res_agi.so
|
||
|
||
; --- конец правки 3 ---
|
||
; Это чинит ночной reboot 03:33: сейчас autoload=no, pbx_spool грузится
|
||
; вручную и после ребута слетает — автодозвон молча умирает.
|
||
|
||
=====================================================================
|
||
## ПРАВКА 4 — Запись разговоров автодозвона (MixMonitor)
|
||
=====================================================================
|
||
Зачем: в карточке заказа нужно послушать звонок робота — слышно, что клиент
|
||
говорит и нажимает ли кнопки. Плюс это основа для распознавания голосового
|
||
ответа (клиент называет день вместо кнопки).
|
||
|
||
Файл: /etc/asterisk/extensions.conf — в контекст [SS-Autocall-Slot]
|
||
|
||
В контексте УЖЕ есть готовый [sub-monitor] (папка по дате + mp3 через lame).
|
||
Вызываем его первым делом и останавливаем запись на завершении:
|
||
|
||
[SS-Autocall-Slot]
|
||
; Запись разговора: аргументы (1)=метка(order group), (2)=номер, (3)=тип
|
||
exten => s,1,GoSub(sub-monitor,s,1(${GROUP_ID},${CUSTOMER_PHONE},autocall))
|
||
; ВАЖНО: в [sub-monitor] MixMonitor включается с опцией «b» (писать только после
|
||
; соединения с абонентом). Для робота абонента-человека нет — файл получится пустым,
|
||
; поэтому при вызове из автодозвона нужен вариант без «b». Если оставлять общий
|
||
; [sub-monitor], просим убрать «b» только для этого вызова (например, отдельным
|
||
; [sub-monitor-robot] с той же логикой, но MixMonitor(${WAV}.wav,,${monopt})).
|
||
same => n,NoOp(SS-Autocall-Slot: scenario=${SCENARIO} group=${GROUP_ID} attempt=${ATTEMPT})
|
||
same => n,Answer()
|
||
same => n,Wait(1)
|
||
same => n,AGI(ss-dialog.agi,${SCENARIO},${CALLTYPE})
|
||
same => n,Hangup()
|
||
exten => h,1,StopMixMonitor()
|
||
|
||
Файл: /etc/asterisk/extensions.conf — альтернатива без правки [sub-monitor]
|
||
(если Паша не хочет трогать общий контекст):
|
||
|
||
[SS-Autocall-Slot]
|
||
same => n,Set(FNAME=${STRFTIME(${EPOCH},,%Y-%m-%d_%H-%M-%S)}_${CUSTOMER_PHONE}_${GROUP_ID})
|
||
same => n,Set(RECORDDIR=/var/spool/asterisk/monitor/${STRFTIME(${EPOCH},,%Y/%m/%d)})
|
||
same => n,Set(MONOPT=nice -n 19 mkdir -p ${RECORDDIR} && chmod 777 ${RECORDDIR} && /usr/bin/lame -b 32 --silent "${RECORDDIR}/${FNAME}.wav" "${RECORDDIR}/${FNAME}.mp3" && rm -f "${RECORDDIR}/${FNAME}.wav" && chmod o+r "${RECORDDIR}/${FNAME}.mp3")
|
||
same => n,MixMonitor(${RECORDDIR}/${FNAME}.wav,,${MONOPT})
|
||
...далее Answer/Wait/AGI как сейчас...
|
||
exten => h,1,StopMixMonitor()
|
||
|
||
Место: ~1.5 МБ на 2 минуты при 32 кбит/с; на диске 50 ГБ, занято 26 ГБ.
|
||
Разбор и выгрузку записей в карточку заказа делаем мы (по расписанию, вне АТС).
|
||
|
||
; --- конец правки 4 ---
|
||
|
||
=====================================================================
|
||
## ПРОВЕРКА ПОСЛЕ ПРИМЕНЕНИЯ (на АТС)
|
||
=====================================================================
|
||
asterisk -rx "dialplan reload"
|
||
asterisk -rx "module load pbx_spool.so"
|
||
asterisk -rx "module load res_agi.so"
|
||
asterisk -rx "dialplan show SS-Autocall-Slot" # должен показать контекст
|
||
asterisk -rx "module show like pbx_spool" # Running
|
||
asterisk -rx "module show like res_agi" # Running
|
||
# Тестовый звонок:
|
||
bash /tmp/ss-testcall3.sh A 09067029953
|