org make bot api ssl telegram-bot

api - make - telegram bot keyboard



Tengo problemas con el webhook a Telegram Bot API (7)

¿Por qué mi webhook no funciona? No obtengo ningún dato de la API de telegram bot. Aquí está la explicación detallada de mi problema:

Obtuve el certificado SSL de StartSSL , funciona bien en mi sitio web (de acuerdo con el verificador de SSL de GeoCerts ), pero parece que mi webhook a Telegram Bot API no funciona (a pesar de que dice que se configuró webhook no obtengo ningún dato) .

Estoy haciendo un webhook a mi script en mi sitio web de esta forma:

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

Recibo este texto en respuesta:

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

Así que debe estar funcionando, pero en realidad no funciona.

Aquí está mi código de script:

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

En realidad no recibo ningún dato para actualizar $. Así que el webhook no está funcionando. ¿Por qué?


Esto puede ayudar a quien trabaja con Laravel Telegram SDK. Tuve un problema con el webhook autofirmado en Laravel 5.3. Después de configurar y obtener el resultado correcto de Telegram con el mensaje "Webhook estaba configurado", no funcionó.
El problema estaba relacionado con la verificación CSRF. Así que agregué la url de webhook a las excepciones CSRF y ahora todo funciona como un encanto.


Esto se debe a que no está configurando el certificado de esta manera

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

Consulte este link sobre cómo configurar el certificado autofirmado de Telegram


Prueba este código. Si tiene un SSL válido en su servidor web y ha ejecutado correctamente el setWebhook, debería funcionar (lo hace por mí). Asegúrese de crear un archivo llamado "log.txt" y de darle permiso de escritura:

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



También tuve este problema, ya que de alguna manera el telegrama no ejecutó mi bot, así que intenté renovar el certificado y volver a configurar los enlaces web, pero nuevamente no funcionó, así que actualicé mi VPS (yum update) y luego renuevo Mi certificado y la configuración de los ganchos web de nuevo. Después de estos comenzó a funcionar de nuevo.


Tuve un problema similar. Ahora resuelto. El problema está posiblemente en un certificado público incorrecto. Por favor, siga con las instrucciones de atención que propongo en mi proyecto:

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"

La API de setWebhooks de Telegram no verifica los datos dentro de su certificado digital autofirmado, devolviendo "ok" incluso si, por ejemplo, no especifica un código CN válido. ¡Así que tenga cuidado de generar un certificado .pem público que contenga / CN = su_dominio correspondiente a su nombre de dominio REAL HOST!


Yo estaba con este problema. Trataba de buscar en todas partes y no podía encontrar la solución para mi problema, porque la gente siempre decía que el problema era el certificado SSL. Pero encontré el problema, y ​​faltaban muchas cosas en el código para interactuar con el API de telegrama webhook envolving curl y este tipo de cosas. Después de mirar en un ejemplo la documentación del bot de telegram, resolví mi problema. Mira este ejemplo 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"]); } ?>