Telegram BOT Api: ¿cómo enviar una foto usando PHP?

El comando sendPhoto requiere una photo argumento definida como InputFile or String .

El doc API dice:

 Photo to send. You can either pass a file_id as String to resend a photo that is already on the Telegram servers, or upload a new photo using multipart/form-data. 

Y

 InputFile This object represents the contents of a file to be uploaded. Must be posted using multipart/form-data in the usual way that files are uploaded via the browser. 

Así que probé este método

  $bot_url = "https://api.telegram.org/bot/"; $url = $bot_url . "sendPhoto?chat_id=" . $chat_id; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type:multipart/form-data" )); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array( "photo" => "@/path/to/image.png", )); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/root/dev/fe_new.png")); $output = curl_exec($ch); 

Los rizos se ejecutan, pero Telegram me responde esto:

 Error: Bad Request: Wrong persistent file_id specified: contains wrong characters or have wrong length 

También traté de reemplazar @/path... con un file_get_contents , pero en este caso Telegram me da una respuesta vacía (y curl_error está vacío!).

¿De qué manera enviar una foto a un telegtwig usando php + curl?

Esta es mi solución de trabajo, pero requiere PHP 5.5:

 $bot_url = "https://api.telegram.org/bot/"; $url = $bot_url . "sendPhoto?chat_id=" . $chat_id ; $post_fields = array('chat_id' => $chat_id, 'photo' => new CURLFile(realpath("/path/to/image.png")) ); $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type:multipart/form-data" )); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields); $output = curl_exec($ch); 

Este código me ayuda mucho que obtengo del sitio web de php.net aquí

Visite http://php.net/manual/en/class.curlfile.php#115161 (Vote este código en el sitio web de php) .

Solo cambio los encabezados de este código para que el bot de telegtwigs envíe imágenes solo copie esta función

 function curl_custom_postfields($ch, array $assoc = array(), array $files = array()) { // invalid characters for "name" and "filename" static $disallow = array("\0", "\"", "\r", "\n"); // build normal parameters foreach ($assoc as $k => $v) { $k = str_replace($disallow, "_", $k); $body[] = implode("\r\n", array( "Content-Disposition: form-data; name=\"{$k}\"", "", filter_var($v), )); } // build file parameters foreach ($files as $k => $v) { switch (true) { case false === $v = realpath(filter_var($v)): case !is_file($v): case !is_readable($v): continue; // or return false, throw new InvalidArgumentException } $data = file_get_contents($v); $v = call_user_func("end", explode(DIRECTORY_SEPARATOR, $v)); $k = str_replace($disallow, "_", $k); $v = str_replace($disallow, "_", $v); $body[] = implode("\r\n", array( "Content-Disposition: form-data; name=\"{$k}\"; filename=\"{$v}\"", "Content-Type: image/jpeg", "", $data, )); } // generate safe boundary do { $boundary = "---------------------" . md5(mt_rand() . microtime()); } while (preg_grep("/{$boundary}/", $body)); // add boundary for each parameters array_walk($body, function (&$part) use ($boundary) { $part = "--{$boundary}\r\n{$part}"; }); // add final boundary $body[] = "--{$boundary}--"; $body[] = ""; // set options return @curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_POSTFIELDS => implode("\r\n", $body), CURLOPT_HTTPHEADER => array( "Expect: 100-continue", "Content-Type: multipart/form-data; boundary={$boundary}", // change Content-Type ), )); } 

Prueba Básica: Ahora solo use este código enviando el nombre de la foto con la ruta y la identificación de chat aquí es cómo: –

 $array1=array('chat_id'=>); $array2=array('photo'=>'index.jpg') //path $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"https://api.telegram.org//sendPhoto"); curl_custom_postfields($ch,$array1,$array2);//above custom function $output=curl_exec($ch); close($ch); 

Para enviar png u otros métodos, cambie la función curl_custom según su necesidad.

Busqué mucho en línea, pero no encontré la respuesta. Pero tu pregunta resolvió mi problema … Cambié tu código y eso lo resolvió por mí … Cambié tu código a este:

 $chat_id=chat Id Here; $bot_url = "https://api.telegram.org/botYOUR_BOT_TOKEN/"; $url = $bot_url . "sendPhoto?chat_id=" . $chat_id; $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array( "Content-Type:multipart/form-data" )); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array( "photo" => "@path/to/image.png", )); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("path/to/image.png")); $output = curl_exec($ch); print$output; 

Puede usar esta API: https://github.com/mgp25/Telegram-Bot-API

ejemplo:

 $tg->sendPhoto($chat_id, $image, $caption); 

Puede usar una imagen almacenada o una URL.

Esta es una mala idea, pero puedes usar algo así:

 #!/bin/bash set -x set -e BDIR=/tmp/${RANDOM} TG_TOKEN="" TG_CHAT_ID= mkdir -p ${BDIR} chmod -R 777 ${BDIR} su postgres -c "pg_dumpall -f ${BDIR}/postgre.sql" tar czf ${BDIR}/${HOSTNAME}.tar.gz /var/lib/grafana/ /etc/grafana/ ${BDIR}/postgre.sql curl -F caption="$(date)" -F chat_id="${TG_CHAT_ID}" -F document=@"${BDIR}/${HOSTNAME}.tar.gz" https://api.telegram.org/bot${TG_TOKEN}/sendDocument rm -rf ${DBIR}