supersam/docs/ats-diffs-for-pasha.md

125 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Дифы для АТС (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