从表单输入上传照片和文本并使用 php 发送到电报机器人

Posted

技术标签:

【中文标题】从表单输入上传照片和文本并使用 php 发送到电报机器人【英文标题】:upload photo and text from form input and sending to telegram bot with php 【发布时间】:2020-04-18 09:52:00 【问题描述】:

html代码:

<form action="process.php">
     <input type="text" name="name">
 <input type="file" name="photo">
 <input type="submit" value="Submit">
</form>  

进程.php:

define ('url',"https://api.telegram.org/bot****/");

$name = $_GET['name'];
$img=$_FILES['photo']['name'];
$chat_id = '****';
$message = urlencode("Name:".$name);
file_get_contents(url."sendmessage?text=".$message."&chat_id=".$chat_id."&parse_mode=HTML");

我收到短信但没有照片。我不知道如何使用“sendPoto”方法发送照片。

【问题讨论】:

【参考方案1】:

首先你必须保存上传的文件。

在您的 html 代码中,您有错误。您必须添加enctype='multipart/form-data' 以支持file input

所以你的html 代码必须是这样的:

<form action="process.php" method="post" enctype="multipart/form-data">
    <input type="text" name="name">
    <input type="file" name="photo">
    <input type="submit" value="Submit">
</form>

在您的php 文件中,您必须先保存上传的文件。

define ('url',"https://api.telegram.org/bot****/");

$info = pathinfo($_FILES['photo']['name']);
$ext = $info['extension']; // get the extension of the file
$newname = "newname.".$ext;

$target = 'images/'.$newname; // the path you want to upload your file
move_uploaded_file( $_FILES['photo']['tmp_name'], $target);

之后,您可以将此文件发送到电报 api。

$chat_id = '123456'; // telegram user id
$url = url."sendPhoto?chat_id=$chat_id";

$params = [
    'chat_id'=>$chat_id,
    'photo'=>'Your site address/'.$target,
    'caption'=>$_POST['name'],
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$server_output = curl_exec($ch);
curl_close($ch);

echo $server_output;

【讨论】:

'caption'=>$_POST['name'], and 'chat_id'=>$user_id, 为什么需要cos "Undefined variable" 还有这个问题: 注意:Undefined variable: HTTPHEADER in C :\xampp\htdocs\tg\process.php 第 25 行警告:curl_setopt():您必须在第 25 行的 C:\xampp\htdocs\tg\process.php 中传递带有 CURLOPT_HTTPHEADER 参数的对象或数组 "ok":false,"error_code":404,"description":"未找到" 是的,我编辑了但是:"ok":false,"error_code":404,"description":"Not Found" 是否可以在 localhost 中进行 'photo'=>'images/'.$target " ? "ok":false,"error_code":404,"description":"Not Found" 我检查了两次,但又出现了这个错误。并且还闯入了活着的网站。【参考方案2】:

您应该将图像保存在您的服务器中,然后将直接下载链接传递给电报。像这样:

//TODO save uploded photo on myfiles/avatar1.png

// send to telegram
file_get_contents("https://api.telegram.org/bot****/sendPhoto?chat_id=1245763214&photo=http://example.com/myfiles/avatar1.png");

注意:通过 URL 发送时,目标文件必须具有正确的 MIME 类型(例如,用于 sendAudio 的音频/mpeg 等)。

阅读sendPhoto文档here

【讨论】:

这现在不起作用,我不知道为什么。也许电报 API 会改变一些东西

以上是关于从表单输入上传照片和文本并使用 php 发送到电报机器人的主要内容,如果未能解决你的问题,请参考以下文章

在vue.js中上传照片和其他表单内容一起使用。

Python远程机器人脚本(每分钟拍一张照片并发送至电报)

表单不会使用 PHP 将带有文件上传的文本输入发布到 SQL 表

如何使用 PHP 每分钟向电报机器人发送通知?

提交带有上传图片选项的表单时出错。 PHP 代码点火器

AJAX上传文件和文本不起作用