Telegram BOT Api: как отправить фотографию с помощью PHP?

Команде sendPhoto требуется photo аргумента, определенная как InputFile or String .

API doc сообщает:

 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. 

А также

 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. 

Поэтому я пробовал этот метод

  $bot_url = "https://api.telegram.org/bot<bot_id>/"; $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); 

Кудри выполнены, но Telegram ответит мне на это:

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

Я также попытался заменить @/path... на file_get_contents , но в этом случае Telegram дал мне пустой ответ (и curl_error пуст!).

Каким способом отправить фотографию в телеграмму с помощью php + curl?

Это мое рабочее решение, но для него требуется PHP 5.5:

 $bot_url = "https://api.telegram.org/bot<bot_id>/"; $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); 

Этот код помогает мне многого, что я получаю с сайта php.net здесь

Посетите http://php.net/manual/en/class.curlfile.php#115161 (проголосуйте за этот код на веб-сайте php) .

Я просто изменяю заголовки в этом коде для бота телеграммы, чтобы отправить изображение, просто скопируйте эту функцию

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

Basic Try: теперь просто используйте этот код, отправив имя фотографии с идентификатором пути и чата, вот как это сделать:

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

Для отправки png или других методов измените функцию curl_custom в соответствии с вашими потребностями.

Я много раз искал в Интернете, но не нашел ответа. Но, ваш вопрос решил мою проблему … Я только что изменил свой код и ответил на него для меня … Я изменил код на это:

 $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; 

Вы можете использовать этот API: https://github.com/mgp25/Telegram-Bot-API

пример:

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

Вы можете использовать либо сохраненное изображение, либо URL.

Это плохая идея, но вы можете использовать некоторые такие:

 #!/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} 

Я реализовал его следующим образом, и он работает. Ошибка, которую вы получаете, может быть из-за пути к файлу, который вы предоставляете.

Кроме того, вы можете увидеть примеры всех других методов телеграммы бота api из следующего репозитория, который я в настоящее время разрабатываю Telegram Bot Client в PHP

  // initialise variables here $chat_id = 1231231231; // path to the picture, $photo = 'pic.jpg'; $caption = 'caption goes here'; // following ones are optional, so could be set as null $reply_to_message_id = null; $reply_markup = null; $data = array( 'chat_id' => urlencode($chat_id), // make sure you do NOT forget @ sign 'photo' => '@'.$photo, 'caption' => urlencode($caption), 'reply_to_message_id' => urlencode($reply_to_message_id), 'reply_markup' => urlencode($reply_markup) ); $url = https://api.telegram.org/YOUR_TOKEN_GOES_HERE/sendPhoto; // open connection $ch = curl_init(); // set the url curl_setopt($ch, CURLOPT_URL, $url); // number of POST vars curl_setopt($ch, CURLOPT_POST, count($fields)); // POST data curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); // To display result of curl curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // execute post $result = curl_exec($ch); // close connection curl_close($ch);