Telegram BOT Api: how to send a photo using PHP?

后端 未结 6 1823
臣服心动
臣服心动 2020-12-24 09:32

The sendPhoto command require an argument photo defined as InputFile or String.

The API doc tells:

Photo to send. You can          


        
6条回答
  •  伪装坚强ぢ
    2020-12-24 10:04

    This code helps me alot which I get from php.net website here

    Visit http://php.net/manual/en/class.curlfile.php#115161 (Vote Up this code in php website).

    I just change headers in this code for telegram bot to send image just copy this function

    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:Now just use this code by sending photo name with path and chat id here is it how:-

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

    For sending png or other methods change curl_custom function according to your need.

提交回复
热议问题