2016-11-14 2 views
3

Я начал программирование бота телеграммы, и у меня возникла проблема. когда я посылаю/запускаю команду, он отправляет мне приветственное сообщение (как я его запрограммировал), но он не отправляет его один раз! он продолжает посылать его бесконечно, как цикл! это источник:мой бот телеграммы продолжает отправлять сообщения бесконечно

<?php 
define('API_KEY','<token>'); 

function makereq($method,$datas=[]) 
{ 
    $url = "https://api.telegram.org/bot".API_KEY."/".$method; 
    $ch = curl_init(); 
    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($ch,CURLOPT_POSTFIELDS,http_build_query($datas)); 
    $res = curl_exec($ch); 
    if(curl_error($ch)){ 
     var_dump(curl_error($ch)); 
    }else{ 
     return json_decode($res); 
    } 
} 

$website = "https://api.telegram.org/bot".API_KEY; 

$update = json_decode(file_get_contents('php://input')); 

$chat_id = $update->message->chat->id; 
$message_id = $update->message->message_id; 
$from_id = $update->message->from->id; 
$name = $update->message->from->first_name; 
$username = $update->message->from->username; 
$textmessage = isset($update->message->text)?$update->message->text:''; 
$reply = $update->message->reply_to_message->forward_from->id; 
$stickerid = $update->message->reply_to_message->sticker->file_id; 
$messageEntity = $update->messageentity->type; 

function SendMessage($ChatId, $TextMsg) 
{ 
makereq('sendMessage',[ 
'chat_id'=>$ChatId, 
'text'=>$TextMsg, 
'parse_mode'=>"MarkDown"] 
); 
} 
if($textmessage == '/start') 
{ 
    SendMessage($chat_id,'<welcome message>'); 
} 

?> 

ответ

4

Возможно, вы используете webhook. Если вы не отвечаете с http-статусом 200, телеграмма bot api думает, что с вашим сервером что-то не так, и запрашивает снова каждые несколько секунд (как указано в документации api: «В случае неудачного запроса мы сдадимся после разумное количество попыток. "). Так что просто добавьте header("HTTP/1.1 200 OK"); к вашему скрипту и вуаля! (Если ваш PHP версии больше, чем 5,4 вы можете использовать http_response_code(200);)

+0

Я думаю, это сработало. благодаря –

1

Если вы polling с getUpdates, вам нужно, чтобы увеличить ваше смещение.

смещение = 1 + latest_update_id

Если вы используете WebHooks ... https://core.telegram.org/bots/api#updateupdate_id

Уникальный идентификатор Update в. Идентификаторы обновлений начинаются с определенного положительного числа и последовательно увеличиваются. Этот идентификатор становится особенно удобно, если вы используете Webhooks, так как она позволяет игнорирований повторил обновления или восстановить правильную последовательность обновления, они должны выйти из строя.

+1

Так как же код выглядит после редактирования? –

+0

Вы используете webhooks или вы проводите опрос? –

+0

Я использую webhooks –

0

Как Yoily L сказал, ты должен вернуть 200, прежде чем телеграмма считает запрос не удалось.

Вы можете использовать fastcgi_finish_request() для сброса данных ответа клиенту. http://php.net/manual/en/function.fastcgi-finish-request.php

http_response_code(200); 
fastcgi_finish_request(); 

// continue execution, send messages and whatever 

Кроме того, обратите внимание на то, что tuxrampage прокомментировал в документации:

Сценарий будет по-прежнему занимает процесс FPM после fastcgi_finish_request(). Поэтому использование чрезмерно для длительной работы задачи могут занимать все ваши потоки FPM до pm.max_children. Это будет приведет к ошибкам шлюза на веб-сервере.

Другая важная вещь - обработка сеанса. Сеансы заблокированы как долго, поскольку они активны (см. Документацию для session_write_close()). Это означает, что последующие запросы будут блокировать до закрытия сеанса.

Вы должны поэтому назвать session_write_close() как можно скорее (даже до fastcgi_finish_request()), чтобы последующие запросы и хороший пользовательский опыт.

Это относится также ко всем другим методам блокировки, например, к стаи или к замкам базы данных . Пока блокировка активна, последующие запросы могут быть загружены.

Вы, вероятно, хотите, чтобы проверить

if (is_callable('fastcgi_finish_request')) { 
    ... 
} 

Подробнее в связанный с этим вопрос: continue processing php after sending http response

Смежные вопросы