我正在尝试建立一个电报机器人,但麻烦与更新的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行。
如果您遇到此问题,请帮助我。 谢谢。
答案 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上,窍门似乎有两件事: