sendPhoto上传照片无法正常工作

时间:2015-11-05 03:46:02

标签: php curl telegram php-5.6 telegram-bot

我正在尝试建立一个电报机器人,但麻烦与更新的PHP 5.6的PHP功能的变化有关。

下面是我找到的基本代码,适应了php 5.6中的更改。

      #$filePhoto = curl_file_create($filepath, 'image/jpg', 'heInternet');  //**LINE 39**
      $filePhoto = new CURLFile($filepath, 'image/jpg', 'heInternet');  //**LINE 40**
      //$texto = $_POST['msg'];
      $content = array(
          'chat_id' => "@BugTheInternet",
          'photo' => $filePhoto
      );

      //curl required to post
      $ch = curl_init();

      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); // required as of PHP 5.6.0
      curl_setopt($ch, CURLOPT_POSTFIELDS, $filePhoto);  //**LINE 53**
      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data'));
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //fix http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/

      // receive server response ...
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

      $server_output = curl_exec ($ch);

以下是我得到的错误:

  

不推荐使用:curl_setopt():文件的@filename API的用法   不推荐上传。请改用CURLFile类   第53行的C:\ xampp somewhere \ somefile.php

当我在第53行将$ content更改为$ filePhoto时。它运行并且Telegram服务器以JSON格式发送消息。 服务器回复:

"{"ok":false,"error_code":400,"description":"Error: Bad Request: there is no photo in request"}"

我在互联网上搜索了几个小时,找到了解决方案。 BTW,我使用的PHP 5.6建议的两种方式,它在第39,40行。

如果您遇到此问题,请帮助我。 谢谢。

3 个答案:

答案 0 :(得分:0)

你有没有试过这样发送 hardcore 的方式?

$ch = curl_init("https://api.telegram.org/bot<token>/sendPhoto&chat_id=<chatID>&photo=<path/to/your/image>");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_exec($ch);
curl_close ($ch);

首先,我在发送消息时也使用 POSTFIELDS 和其他正确的东西用于cURL,但它对我不起作用。所以我 hardcored 就像上面的例子一样,它只是起作用。

答案 1 :(得分:0)

你应该删除

'chat_id' => "@BugTheInternet",
<$>来自$ content并添加chat_id以卷曲网址,因为

  

PHP的cURL库死了,返回错误消息&#34;创建失败   formpost data&#34;尝试使用包含值的数组时   从&#39; @&#39;开始。如果数组更改为URL编码格式的字符串,则   问题不会发生。参考:https://bugs.php.net/bug.php?id=50060

答案 2 :(得分:0)

在这篇文章发表多年之后,我自己在此上浪费了一个小时,我正在分享我的工作方式:

  function json($url, array $fields) {
    $ch = curl_init($url);
    $ok = 1;
    $ok &= curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
    $ok &= curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $ok &= curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    $ok &= curl_setopt($ch, CURLOPT_TIMEOUT, 120);
    $ok &= curl_setopt($ch, CURLOPT_HTTPHEADER, [
      "Accept: application/json"
    ]);
    $ok &= curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $ok &= curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    $ok &= curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
    if ($ok !== 1) {
      user_error("curl_setopt failed");
    }

    $res = curl_exec($ch);
    if ($res === false) {
      var_dump($res);
      user_error(curl_error($ch));
    }
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    if ($res === false) {
      user_error('curl_exec fail');
    }

    $json = json_decode($res, true);
    if (! is_array($json)) {
      print_r($res);
      user_error("http_json::failed decoding");
    }
    return $json;
}

$f = new \CurlFile("/path/to/file.jpg", 'image/jpeg', 'filename.jpg');

$args = [
  "photo" => $f,
  "chat_id" => $group,
  "caption" => "Hello world"
];
$url = "https://api.telegram.org/bot$token/sendPhoto";
var_dump( json($url, $args) );

这是在PHP7上,窍门似乎有两件事:

  • Content-Type:multipart / form-data
  • 使用\ CurlFile