2015-10-23 9 views
17

Warum funktioniert mein Webhook nicht? Ich bekomme keine Daten von der Telegramm-Bot-API. Hier ist die detaillierte Erklärung meines Problems:Probleme mit Webhook zu Telegram Bot API

Ich habe SSL-Zertifikat von StartSSL, funktioniert es auf meiner Website in Ordnung (nach GeoCerts SSL checker), scheint aber immer noch wie mein Webhook zu Telegramm Bietet API funktioniert nicht (trotz es sagt, dass webhook eingestellt wurde, bekomme ich keine Daten).

Ich bin ein Webhook meinem Skript auf meiner Website in dieser Form machen:

https://api.telegram.org/bot<token>/setWebhook?url=https://mywebsite.com/path/to/giveawaysbot.php 

ich diesen Text als Antwort:

{"ok":true,"result":true,"description":"Webhook was set"} 

So muss es funktioniert, aber es doesn tatsächlich t.

Hier ist mein Script-Code:

<?php 

ini_set('error_reporting', E_ALL); 

$botToken = "<token>"; 
$website = "https://api.telegram.org/bot".$botToken; 

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

print_r($update); // this is made to check if i get any data or not 

$chatId = $update["message"]["chat"]["id"]; 
$message = $update["message"]["text"]; 


switch ($message) { 
    case "/test": 
     sendMessage($chatId,"test complete"); 
     break; 
    case "/hi": 
     sendMessage($chatId,"hey there"); 
     break; 
    default: 
     sendMessage($chatId,"nono i dont understand you"); 
} 


function sendMessage ($chatId, $message) { 
    $url = $GLOBALS[website]."/sendMessage?chat_id=".$chatId."&text=".urlencode($message); 
    file_get_contents($url); 
} 

?> 

ich tatsächlich keine Daten auf $ Update erhalten. Also funktioniert der Webhook nicht. Warum?

+1

Vielleicht im Zusammenhang mit keine Daten zu bekommen, sollten Sie 'json_decode ($ update, true)' tun, um Daten als ein Array zu erhalten, anstatt eine 'stdClass'. – ixchi

+0

ixchi, 'json_decode ($ update, true)' hat nichts geändert, funktioniert immer noch nicht: \ – markelov

+0

Sind Sie sicher, dass Sie tatsächlich den Webhook erhalten? Es funktioniert richtig für mich. – ixchi

Antwort

3

Ich hatte ähnliches Problem. Jetzt gelöst. Das Problem liegt möglicherweise in einem falschen öffentlichen Zertifikat. Bitte beachten Sie mit Aufmerksamkeit Anweisungen Ich schlage vor, in meinem Projekt:

https://github.com/solyaris/BOTServer/blob/master/wiki/usage.md#step-4-create-self-signed-certificate

openssl req -newkey rsa:2048 -sha256 -nodes -keyout /your_home/BOTServer/ssl/PRIVATE.key -x509 -days 365 -out /your_home/BOTServer/ssl/PUBLIC.pem -subj "/C=IT/ST=state/L=location/O=description/CN=your_domain.com" 

Telegramm setWebhooks API nicht überprüft Daten in Ihrem selbst signierten digitalen Zertifikat, „ok“, auch wenn durch das Beispiel der Rückkehr Sie tun Gib kein gültiges/CN an! Seien Sie also vorsichtig, wenn Sie ein öffentliches .pem-Zertifikat erstellen, das /CN = Ihre_Domäne enthält, die Ihrem Real-Domain-Namen entspricht!

4

Ich war mit diesem Problem. Ich habe versucht, überall hinzuschauen und konnte keine Lösung für mein Problem finden, weil die Leute die ganze Zeit sagten, dass das Problem das SSL-Zertifikat sei. Aber ich fand das Problem, und das waren eine Menge Dinge, die auf den Code fehlten, um mit dem Telegramm API Webhook Envelving Curl und diese Art von Zeug zu interagieren. Nachdem ich mir in der Telegramm-Bot-Dokumentation ein Beispiel angesehen habe, habe ich mein Problem gelöst. Sehen Sie dieses Beispiel https://core.telegram.org/bots/samples/hellobot

<?php 
//telegram example 
define('BOT_TOKEN', '12345678:replace-me-with-real-token'); 
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/'); 

function apiRequestWebhook($method, $parameters) { 
    if (!is_string($method)) { 
    error_log("Method name must be a string\n"); 
    return false; 
    } 

    if (!$parameters) { 
    $parameters = array(); 
    } else if (!is_array($parameters)) { 
    error_log("Parameters must be an array\n"); 
    return false; 
    } 

    $parameters["method"] = $method; 

    header("Content-Type: application/json"); 
    echo json_encode($parameters); 
    return true; 
} 

function exec_curl_request($handle) { 
    $response = curl_exec($handle); 

    if ($response === false) { 
    $errno = curl_errno($handle); 
    $error = curl_error($handle); 
    error_log("Curl returned error $errno: $error\n"); 
    curl_close($handle); 
    return false; 
    } 

    $http_code = intval(curl_getinfo($handle, CURLINFO_HTTP_CODE)); 
    curl_close($handle); 

    if ($http_code >= 500) { 
    // do not wat to DDOS server if something goes wrong 
    sleep(10); 
    return false; 
    } else if ($http_code != 200) { 
    $response = json_decode($response, true); 
    error_log("Request has failed with error {$response['error_code']}: {$response['description']}\n"); 
    if ($http_code == 401) { 
     throw new Exception('Invalid access token provided'); 
    } 
    return false; 
    } else { 
    $response = json_decode($response, true); 
    if (isset($response['description'])) { 
     error_log("Request was successfull: {$response['description']}\n"); 
    } 
    $response = $response['result']; 
    } 

    return $response; 
} 

function apiRequest($method, $parameters) { 
    if (!is_string($method)) { 
    error_log("Method name must be a string\n"); 
    return false; 
    } 

    if (!$parameters) { 
    $parameters = array(); 
    } else if (!is_array($parameters)) { 
    error_log("Parameters must be an array\n"); 
    return false; 
    } 

    foreach ($parameters as $key => &$val) { 
    // encoding to JSON array parameters, for example reply_markup 
    if (!is_numeric($val) && !is_string($val)) { 
     $val = json_encode($val); 
    } 
    } 
    $url = API_URL.$method.'?'.http_build_query($parameters); 

    $handle = curl_init($url); 
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($handle, CURLOPT_TIMEOUT, 60); 

    return exec_curl_request($handle); 
} 

function apiRequestJson($method, $parameters) { 
    if (!is_string($method)) { 
    error_log("Method name must be a string\n"); 
    return false; 
    } 

    if (!$parameters) { 
    $parameters = array(); 
    } else if (!is_array($parameters)) { 
    error_log("Parameters must be an array\n"); 
    return false; 
    } 

    $parameters["method"] = $method; 

    $handle = curl_init(API_URL); 
    curl_setopt($handle, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($handle, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($handle, CURLOPT_TIMEOUT, 60); 
    curl_setopt($handle, CURLOPT_POSTFIELDS, json_encode($parameters)); 
    curl_setopt($handle, CURLOPT_HTTPHEADER, array("Content-Type: application/json")); 

    return exec_curl_request($handle); 
} 

function processMessage($message) { 
    // process incoming message 
    $message_id = $message['message_id']; 
    $chat_id = $message['chat']['id']; 
    if (isset($message['text'])) { 
    // incoming text message 
    $text = $message['text']; 

    if (strpos($text, "/start") === 0) { 
     apiRequestJson("sendMessage", array('chat_id' => $chat_id, "text" => 'Hello', 'reply_markup' => array(
     'keyboard' => array(array('Hello', 'Hi')), 
     'one_time_keyboard' => true, 
     'resize_keyboard' => true))); 
    } else if ($text === "Hello" || $text === "Hi") { 
     apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'Nice to meet you')); 
    } else if (strpos($text, "/stop") === 0) { 
     // stop now 
    } else { 
     apiRequestWebhook("sendMessage", array('chat_id' => $chat_id, "reply_to_message_id" => $message_id, "text" => 'Cool')); 
    } 
    } else { 
    apiRequest("sendMessage", array('chat_id' => $chat_id, "text" => 'I understand only text messages')); 
    } 
} 


define('WEBHOOK_URL', 'https://my-site.example.com/secret-path-for-webhooks/'); 

if (php_sapi_name() == 'cli') { 
    // if run from console, set or delete webhook 
    apiRequest('setWebhook', array('url' => isset($argv[1]) && $argv[1] == 'delete' ? '' : WEBHOOK_URL)); 
    exit; 
} 


$content = file_get_contents("php://input"); 
$update = json_decode($content, true); 

if (!$update) { 
    // receive wrong update, must not happen 
    exit; 
} 

if (isset($update["message"])) { 
    processMessage($update["message"]); 
} 
?> 
+0

Ich habe an so vielen Stellen gelesen, dass das Problem meine Bescheinigung war. Als ich dieses Beispiel versuchte, funktionierte es tadellos. Vielen Dank, dass Sie darauf hingewiesen haben. – ddz

-1

Dies ist, weil Sie nicht das Zertifikat wie diese prüfen

curl -F "url=https://bot.sapamatech.com/tg" -F "[email protected]/etc/apache2/ssl/bot.pem" https://api.telegram.org/bot265033849:AAHAs6vKVlY7UyqWFUHoE7Toe2TsGvu0sf4/setWebhook 

Einstellung dieses link wie Telegramm Selbst Unterzeichnung einstellen Zertifikat

0

Dies kann helfen, die arbeitet mit Laravel Telegramm SDK. Ich hatte ein Problem mit selbst signierten Webhook in Laravel 5.3. Nach der Einrichtung und OK-Ergebnis von Telegram mit "Webhook wurde eingestellt" Nachricht, hat es nicht funktioniert.
Das Problem wurde mit der CSRF-Überprüfung in Verbindung gebracht.Also habe ich die Webhook-URL zu CSRF-Ausnahmen hinzugefügt und nun funktioniert alles wie ein Zauber.

0

Versuchen Sie diesen Code. Wenn Sie ein gültiges SSL auf Ihrem Webhost haben und Sie den SetWebhook ordnungsgemäß ausgeführt haben, sollte es funktionieren (tut für mich). Stellen Sie sicher, dass Sie eine Datei namens „log.txt“ und gibt die Schreibberechtigung für sie:

<?php 
define('BOT_TOKEN', '????'); 
define('API_URL', 'https://api.telegram.org/bot'.BOT_TOKEN.'/'); 

// read incoming info and grab the chatID 
$content = file_get_contents("php://input"); 
$update  = json_decode($content, true); 
$chatID  = $update["message"]["chat"]["id"]; 
$message = $update["message"]["text"]; 

// compose reply 
$reply =""; 
switch ($message) { 
    case "/start": 
     $reply = "Welcome to Siamaks's bot. Type /help to see commands"; 
     break; 
    case "/test": 
     $reply = "test complete"; 
     break; 
    case "/hi": 
     $reply = "hey there"; 
     break; 
    case "/help": 
     $reply = "commands: /start , /test , /hi , /help "; 
     break; 
    default: 
     $reply = "NoNo, I don't understand you"; 
} 

// send reply 
$sendto =API_URL."sendmessage?chat_id=".$chatID."&text=".$reply; 
file_get_contents($sendto); 

// Create a debug log.txt to check the response/repy from Telegram in JSON format. 
// You can disable it by commenting checkJSON. 
checkJSON($chatID,$update); 
function checkJSON($chatID,$update){ 

    $myFile = "log.txt"; 
    $updateArray = print_r($update,TRUE); 
    $fh = fopen($myFile, 'a') or die("can't open file"); 
    fwrite($fh, $chatID ."nn"); 
    fwrite($fh, $updateArray."nn"); 
    fclose($fh); 
} 
1

ich auch dieses Problem hatte, nachdem irgendwie das Telegramm nicht meine Bot laufen, also habe ich versucht, das Zertifikat zu erneuern und setze Web Hooks wieder, aber wieder hat es nicht funktioniert, also habe ich mein VPS aktualisiert (yum update) und dann mein Zertifikat erneuert und Web Hooks neu gesetzt. Nach diesen fing es wieder an zu arbeiten.

Verwandte Themen