2016-11-14 20 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はあなたのサーバに何か問題があると思って、数秒ごとに再度リクエストします(apiのドキュメントに記載されているように: "リクエストが失敗した場合、合理的な試行回数」)。 スクリプトにheader("HTTP/1.1 200 OK");を追加してください。 (PHPのバージョンが5.4以上である場合は、http_response_code(200);を使用することができます)

+0

私はそれが働いたと思います。ありがとう –

1

あなたはgetUpdatespollingしている場合、あなたはあなたのオフセットをインクリメントする必要があります。

は、オフセット= 1 + latest_update_id

あなたがWebHooksを使用している場合... update_id

アップデートの一意の識別子https://core.telegram.org/bots/api#update。更新識別子は から始まり、特定の正の数で始まり、順番に増加します。 あなたがウェブフックを、使用している場合、それは にあなたを可能にするため、このIDは 特に便利になりは は、彼らがオーダーから抜け出す必要があり、繰り返しの更新にまたは正しい更新順序を復元するを無視します。

+1

を、どのようにコードを編集した後のように見えるのでしょうか? –

+0

ウェブフックを使用していますか、またはポーリングしていますか? –

+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に気づくドキュメントにコメント:

をスクリプトはまだ fastcgi_finish_request()後にFPMプロセスを占有します。だから、長時間実行するために余分に使用すると、 タスクはすべてpm.max_childrenまでのFPMスレッドを占有する可能性があります。これにより、 がWebサーバー上のゲートウェイエラーにつながります。

もう1つ重要なことは、セッション処理です。セッションは、アクティブである限り、 としてロックされます( session_write_close()のドキュメントを参照)。これは、セッションが終了するまで、後続の要求がブロック を意味することを意味します。

そのため、後続の要求 と優れたユーザーエクスペリエンスを可能にし、すぐに(でもfastcgi_finish_request()前) できるだけsession_write_close()を呼び出す必要があります。

これは、flockまたは などの他のすべてのロック方法にも当てはまります。後でロックが有効である限り、 リクエストが発生する可能性があります。

はおそらく、関連する質問に

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

詳細情報をチェックしたいと思う:continue processing php after sending http response

関連する問題