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

7.1 KiB
Raw Permalink Blame History

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