Сообщения бота 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);
//}

0 ответов

Другие вопросы по тегам