Сообщения бота Viber срабатывают несколько раз при отправке в цикле for через REST API
Большое спасибо за чтение.
У меня есть бот с открытым исходным кодом, который каждый день представляет расписание школы. Дни выбираются с клавиатуры Viber:
function createWeekdayMenu()
{
$keyboard_array['Type']='keyboard';
$keyboard_array['DefaultHeight']=false;
$keyboard_array['BgColor']="#FFFFFF";
$keyboard=$keyboard_array;
$weekdays_title = ['Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή'];
$weekdays_payload = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];
$keyboard_components = ["Columns", "Rows", "BgColor","TextVAlign","TextHAlign","TextOpacity","Text","TextSize","ActionType","ActionBody"];
for ($i = 0; $i < count($weekdays_title); $i++) {
$values_to_combine = array('2','2', "#2db9b9",'center','center','100', $weekdays_title[$i],'regular','reply', $weekdays_payload[$i]);
$keyboard['Buttons'][]= array_combine($keyboard_components, $values_to_combine);
}
return $keyboard;
}
Нажатие кнопки дня создает набор данных из запроса SQL, содержащий классы выбранного дня, сохраненный в массиве.
while ($row = $result->fetch_assoc()) {
$greekName = $row['greekName'];
$hourStart = $row['hoursStart'];
$description = $row['description'];
$classCode = $row['code'];
$place = $row['placeName'];
$teacherName = $row['surname'];
$mandatory = $row['mandatory'];
$semesterName = $row['semesterName'];
$comments = $row['comments'];
$result_to_send = '' . $greekName . chr(10) . '⌚' . $hourStart . ':00' . chr(10) . ''
. $description . chr(10) . '' . $classCode . chr(10) . '' . $teacherName . chr(10) . 'Αίθουσα: ' . $place . chr(10) .
$print_status . chr(10) . $lex . $semesterName . chr(10) . '' . $comments ;
$result_array[] = $result_to_send;
}
Затем создается ответ Viber со следующим циклом for и отправляется в Viber через REST API:
for ($i = 0; $i < count($result_array); $i++) {
$data['receiver'] = $senderId;
$data['type'] = 'text';
$data['text']=$result_array[$i];
send_to_viber($data);
}
function send_to_viber($response)
{
$ch = curl_init("https://chatapi.viber.com/pa/send_message");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($response));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json','charset=utf-8','X-Viber-Auth-Token:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx']);
$result = curl_exec($ch);
curl_close($ch);
}
Проблема возникает из-за того, что каждая строка отправляется как сообщение дважды - не два раза подряд, а с перемежением, то есть сначала, второй, третий, первый, четвертый больше похожи на случайные, и, возможно, третий раз через минуту или около того.
Посмотрев журнал ngrok, я вижу, что есть две или три записи, содержащие одну и ту же временную метку, и кажется, что, например, кнопка понедельника нажата дважды, хотя этого не произошло.
First entry:
{
"event": "message",
"timestamp": 1601307724076,
"chat_hostname": "SN-CHAT-02_",
"message_token": 5491392294943973000,
"sender": {
"id": "xxxxxxxxxxxxxxxxxxxxxxxx",
"name": " xxxxxxxxxxxxxxxxxxxxxx",
"language": "el-GR",
"country": "GR",
"api_version": 8
},
"message": {
"text": "monday",
"type": "text"
},
"silent": false
}
Entry after lets say 5 seconds:
{
"event": "message",
"timestamp": 1601307724076,
"chat_hostname": "SN-CHAT-02_",
"message_token": 5491392294943973000,
"sender": {
"id": "xxxxxxxxxxxxxxxxxxxxxx",
"name": "xxxxxxxxxxxxxxxxxxxxxx",
"language": "el-GR",
"country": "GR",
"api_version": 8
},
"message": {
"text": "monday",
"type": "text"
},
"silent": false
}
Есть идеи?
ОБНОВЛЕНИЕ: объединив содержимое массива в одно сообщение Viber, проблема исчезнет. т.е.
$result_array = sendDayProgram($senderId, $text);
//for ($i = 0; $i < count($result_array); $i++) {
$data['receiver'] = $senderId;
$data['type'] = 'text';
$data['text']= implode(chr(10),$result_array);//($result_array[$i];
send_to_viber($data);
//}