Fuentes: https://atareao.es/tutorial/crea-tu-propio-bot-para-telegram/un-bot-de-telegram-con-php/ ====== Crear el bot ====== Buscamos @botfather en Telegram Escribimos /newbot Nos contesta que ahora le tenemos que poner un nombre. El nombre puede ser largo y tener espacios: Alright, a new bot. How are we going to call it? Please choose a name for your bot. Ponemos el nombre: Bot de pruebas Nos contesta: Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot. El username no puede tener espacios y tiene que acaba con la palabra **bot**:Le ponemos: jurjurbot Nos dice que está creado y nos da el token del bot que debemos guardar. Done! Congratulations on your new bot. You will find it at t.me/jurjurbot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this. Use this token to access the HTTP API: 2144753637:AAHX3BhhasddifNTDbJSvhLlYp-dGvnTxmPtk Keep your token secure and store it safely, it can be used by anyone to control your bot. For a description of the Bot API, see this page: https://core.telegram.org/bots/api Metemos usuario en un grupo. Escribimos /start en el grupo. y sacamos el nombre del grupo con el comando: curl -X GET https://api.telegram.org/bot/getUpdates|jq Por ejemplo: curl -X GET https://api.telegram.org/bot2345053637:AAHX3BhheADTFDTDbJSvhLlYp-dGvnTxmPtk/getUpdates|jq Nos devuelve: "update_id": 151787201, "message": { "message_id": 11, "from": { "id": 123123123, "is_bot": false, "first_name": "Mi usuario telegram", "username": "UsuarioTelegram", "language_code": "en" }, "chat": { "id": -648234144, "title": "Nombre del grupo", "type": "group", "all_members_are_administrators": true }, El ID del grupo es: -648234144 Puedo enviar un mensaje con el comando: curl -s -X POST https://api.telegram.org/bot/sendMessage -d chat_id= -d text="prueba" Por ejemplo: curl -s -X POST https://api.telegram.org/bot2143367637:AAHX3BhgThifNTDbJSvhLlYp-dGvnTxmPtk/sendMessage -d chat_id=-648234144 -d text="prueba" Podemos hacer el script: #!/bin/bash TOKEN="2143367637:AAHX3BhgThifNTDbJSvhLlYp-dGvnTxmPtk" CHAT_ID="-648234144" URL="https://api.telegram.org/bot$TOKEN/sendMessage" curl -s -X POST $URL -d chat_id=$CHAT_ID -d text="$1" ====== Interactuar BOT ====== Podemos ver las actualizaciones del bot con la API getUpdates como hemos visto antes: curl -X GET https://api.telegram.org/bot/getUpdates|jq Pero vamos a añadir un webhook para que que haga PUSH en vez de PULL, así cada vez que escribamos algo, lo leerá y no tenemos que estar constantemente leyendo los Updates. El webhook tiene que apuntar a un fichero que esté en un servidor con https. En este caso usaremos php. Para añadir el webhook: curl -X GET https://api.telegram.org/bot/setWebhook?url=https:/// Por ejemplo: curl -X GET https://api.telegram.org/bot2115178200:AAElT1wG2T18bf8cZMo_X_LggLfAcIOaiHY/setWebhook?url=https://api.midominio.com/bot.php Nos responderá esto: { "ok": true, "result": true, "description": "Webhook was set" } Para comprobar que esté bien lanzamos este comando. Suele fallar por el certificado. curl -X GET https://api.telegram.org/bot2115178200:AAElT1wG2T18ZMo_X_LggLfAcIOaiHY/getWebhookInfo Si está bien, aunque el fichero esté vacio, luego lo creamos bien, dará esto: { "ok": true, "result": { "url": "https://api.midominio.com/bot.php", "has_custom_certificate": false, "pending_update_count": 0, "max_connections": 40, "ip_address": "87.217.220.23" } } Creamos el fichero bot.php así. Cambiamos el TOKEN por el nuestro: Cositas de PHP: * Ponemos urlencode para poder poner \n y escribir un salto de línea * Usamos trim para quitar una _ que aparece al leer una url como si fuera un salto de línea trim(file_get_contents("https://api.midominio.com/fichero.txt"), "\r\n") ====== Menus con botfather ====== Desde el bot @botfather podemos añadir los menús para que aparezcan los comandos. ====== API en PHP ====== El webhook de telegram lanza peticiones a la API de PHP de este tipo con todas las acciones que pasan. Metiendo el bot @RawDataBot se pueden sacar de cada grupo. Va bien para saber el chatID por ejemplo: { "update_id": 816025253, "message": { "message_id": 974009, "from": { "id": 4982505, "is_bot": false, "first_name": "I Want to be Freak", "username": "IWantToBeFreak" }, "chat": { "id": -699088581, "title": "Jur123 group", "type": "group", "all_members_are_administrators": true }, "date": 1638376574, "new_chat_participant": { "id": 211246197, "is_bot": true, "first_name": "Telegram Bot Raw", "username": "RawDataBot" }, "new_chat_member": { "id": 211246197, "is_bot": true, "first_name": "Telegram Bot Raw", "username": "RawDataBot" }, "new_chat_members": [ { "id": 211246197, "is_bot": true, "first_name": "Telegram Bot Raw", "username": "RawDataBot" } ] } } A nosotros solo nos interesa uno como este { "message":{ "chat": { "id": -699088581 }, "text":"/consulta2" } } Si lo lanzamos a la API de PHP haría el comando **/consulta2** El chat id tiene que ser el de la API curl -X POST -d@peticion.json "https://api.midominio.com/bot.php" ====== ERRORES ====== El bot no da respuesta y en nginx da 499 curl -s -X GET https://api.telegram.org/bot2143053637:AAHX3BhheQifNTDbJSvhLlYp-dGvnTxmPtk/getWebhookInfo |jq Da error "Read timeout expired", { "ok": true, "result": { "url": "https://apitelegram.lobo99.info/bot.php", "has_custom_certificate": false, "pending_update_count": 37, "last_error_date": 1639677248, "last_error_message": "Read timeout expired", "max_connections": 40, "ip_address": "87.217.220.23" } } Era un problema de DNS pero para vaciar los mensajes pendientes he puesto en el fichero bot.php $update = json_decode(file_get_contents('php://input')); if(isset($update->message) || isset($update->edited_message)) { if(time()-((@$update->message->date)?:(@$update->edited_message->date)) > 59) { exit('Update Time Out !'); # print json update } }