2016-11-14 10 views
3

Senden I Started ein Telegramm bot Programmierung und ich habe ein Problem. wenn ich den Befehl sende/starte, sendet er mir eine Willkommensnachricht (wie ich es programmiert habe), sendet sie aber nicht einmal! es sendet es endlos wie eine Schleife! dies ist die Quelle:mein Telegramm Bot hält Nachrichten endlos

<?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>'); 
} 

?> 

Antwort

4

Du bist wahrscheinlich Webhook verwenden. Wenn Sie nicht mit einem http-Status 200 antworten, denkt das Bot-Bot api, dass etwas mit Ihrem Server nicht stimmt und fordert alle paar Sekunden erneut an (wie in der api-Dokumentation erwähnt: "Im Falle einer erfolglosen Anfrage geben wir nach a angemessene Menge an Versuchen. "). So fügen Sie einfach header("HTTP/1.1 200 OK"); zu Ihrem Skript und voilà! (Wenn Sie Ihre PHP-Version größer als 5,4 ist, können Sie http_response_code(200); verwenden)

+0

Ich denke, es hat funktioniert. Vielen Dank –

1

Wenn Sie polling mit getUpdates, müssen Sie Ihre Offset erhöhen.

offset = 1 + latest_update_id

WENN Sie WebHooks verwenden ... https://core.telegram.org/bots/api#updateupdate_id

Die eindeutige Kennung des Update. Update Identifikatoren startet von einer bestimmten positiven Zahl und sequentiell erhöhen. Diese ID wird besonders praktisch, wenn Sie mit Webhooks, da es Ihnen zu ermöglicht Updates ignore wiederholt oder das richtige Update-Sequenz wiederherzustellen, sollten sie aus bestellen.

+1

Wie funktioniert der Code sieht aus wie nach der Bearbeitung? –

+0

verwenden Sie Webhooks oder pollen Sie? –

+0

Ich benutze Webhooks –

0

Als Yoily L sagte, musst du 200 zurück, bevor Telegramm denkt hat die Anforderung fehlgeschlagen.

können Sie fastcgi_finish_request() verwenden Antwortdaten an den Client zu spülen. http://php.net/manual/en/function.fastcgi-finish-request.php

http_response_code(200); 
fastcgi_finish_request(); 

// continue execution, send messages and whatever 

Beachten Sie auch, was tuxrampage in der Dokumentation kommentiert:

Das Skript wird nach wie vor ein FPM Prozess nach fastcgi_finish_request() besetzen. So verwenden sie übermäßig lange Aufgaben laufen alle Fäden Ihre FPM bis zu pm.max_children kann besetzen. Dies führt zu Gateway-Fehlern auf dem Webserver.

Eine weitere wichtige Sache ist Sitzungsbehandlung. Sitzungen sind als gesperrt, solange sie aktiv sind (siehe Dokumentation für session_write_close()). Dies bedeutet, dass nachfolgende Anfragen blockieren, bis die Sitzung geschlossen wird.

Sie sollten daher session_write_close() rufen so schnell wie möglich (noch vor fastcgi_finish_request()) nachfolgende Anforderungen und eine gute Nutzererfahrung zu ermöglichen.

Dies gilt auch für alle anderen Verschlusstechniken wie z. B. Flock oder Datenbanksperren. Solange eine Sperre aktiv ist, können nachfolgende Anfragen Anfragen blockieren.

Sie wollen wahrscheinlich

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

Mehr Informationen in Verbindung stehende Frage überprüfen: continue processing php after sending http response

Verwandte Themen