2016-11-14 129 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迴應,那麼電報機器人會認爲您的服務器出現問題,並且每隔幾秒再請求一次(正如api文檔中所述:「如果請求失敗,我們會放棄合理的嘗試次數「)。 因此,只需將header("HTTP/1.1 200 OK");添加到您的腳本中即可! (如果你的PHP版本大於5.4,你可以使用http_response_code(200);

+0

我想它的工作。謝謝 –

1

如果你是pollinggetUpdates,你需要增加你的偏移量。

偏移= 1 + latest_update_id

如果您正在使用WebHooks ...... https://core.telegram.org/bots/api#updateupdate_id

更新的唯一標識符。更新標識符從 某個正數開始,然後依次遞增。 如果你使用網絡掛接,因爲它可以讓你 忽略重複更新或以恢復正確的更新序列, 他們應該得到無序此ID變成 特別方便。

+1

那麼如何代碼看起來像編輯後? –

+0

你使用webhooks還是你在投票? –

+0

我使用webhooks –

0

由於Yoily大號說,你得回到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()的文檔)。這意味着後續請求將阻止 ,直到會話關閉。

因此,應該儘快 (甚至fastcgi_finish_request()之前)調用session_write_close()允許後續請求 和良好的用戶體驗。

這也適用於所有其他鎖定技術,例如數據庫鎖或數據庫鎖。只要鎖定處於活動狀態,隨後的請求可能會失敗。

你可能要檢查

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

更多信息相關的問題:continue processing php after sending http response

相關問題