咨询:从HTML页面向Telegram发消息及模态框内容分享方案
解决方案:从网页分享内容到Telegram(适配你的PHP Bot场景)
嘿,我来帮你搞定这两个问题——尤其是你已经在Heroku部署了PHP Telegram Bot,咱们结合你的场景一步步来:
一、从HTML页面向Telegram发送消息的两种核心方式
方式1:用Telegram内置分享链接(零后端成本,快速上线)
这是最省心的前端方案,直接用Telegram官方提供的分享链接,让用户自己选择聊天对象发送内容:
- 原理是构造一个Telegram的跳转链接,把要分享的内容编码后带进去,用户点击后会打开Telegram的分享界面。
- 前端JS示例代码:
// 假设模态框里的名称存在id为lucky-name的元素,GIF地址是lucky-gif的src function shareViaTelegram() { const luckyName = document.getElementById('lucky-name').textContent; const gifLink = document.getElementById('lucky-gif').src; // 把要发送的文本编码,避免特殊字符问题 const shareText = encodeURIComponent(`🎉 抽到的幸运儿:${luckyName}\n动图链接:${gifLink}`); // 打开Telegram分享界面 window.open(`https://t.me/share/url?text=${shareText}`, '_blank'); }
- 优点:不用碰后端,5分钟就能搞定;用户可以自由选择发送给好友、群组还是频道。
- 缺点:依赖用户本地有Telegram客户端(或网页版),无法自动发送到指定聊天。
方式2:通过你的PHP Bot发送(后端驱动,可控性拉满)
既然你已经有了自己的Bot,这种方式更适合你——可以自动把内容推送到指定的聊天(比如你的私人号、官方群组),或者让用户触发后通过Bot发送给自己。
第一步:先拿到目标聊天的ID
要让Bot发消息,必须知道要发给谁的聊天ID。最简单的方法是:让目标用户(比如你自己)给Bot发一条随便的消息,然后调用Bot的getUpdates接口获取ID:
// PHP代码,运行一次拿到聊天ID就行 $botToken = '你的Bot Token'; $apiUrl = "https://api.telegram.org/bot{$botToken}/getUpdates"; $response = file_get_contents($apiUrl); $updateData = json_decode($response, true); if (!empty($updateData['result'])) { // 取最近一条消息的聊天ID $chatId = $updateData['result'][count($updateData['result'])-1]['message']['chat']['id']; echo "你的聊天ID是:{$chatId},把它存在你的配置里哦"; }
第二步:前端把模态框内容传给后端
当用户点击分享按钮时,前端把抽到的名称和GIF地址发送到你Heroku上的PHP接口:
// 给分享按钮绑定点击事件 document.querySelector('.share-btn').addEventListener('click', async () => { const name = document.getElementById('lucky-name').textContent; const gifUrl = document.getElementById('lucky-gif').src; try { const response = await fetch('/api/share-to-telegram', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, gifUrl }) }); const result = await response.json(); if (result.success) { alert('内容已经通过Bot发送到Telegram啦!'); } else { alert(`发送失败:${result.error}`); } } catch (err) { alert('网络出错啦,请稍后重试'); } });
第三步:后端调用Telegram API发送内容
在你的PHP后端接口里,处理前端的请求,调用Telegram的sendPhoto接口(支持GIF动图),把名称作为图片的说明文字:
<?php // /api/share-to-telegram 接口 header('Content-Type: application/json'); // 配置你的Bot信息 $botToken = '你的Bot Token'; $targetChatId = '你刚才拿到的聊天ID'; // 比如你的私人聊天ID // 获取前端传过来的数据 $input = json_decode(file_get_contents('php://input'), true); if (empty($input['name']) || empty($input['gifUrl'])) { echo json_encode(['success' => false, 'error' => '缺少必要参数']); exit; } $luckyName = $input['name']; $gifUrl = $input['gifUrl']; // 构造要发送的内容 $caption = "🎉 今日幸运儿:{$luckyName}"; // 调用Telegram API发送GIF和说明 $apiUrl = "https://api.telegram.org/bot{$botToken}/sendPhoto"; $postData = [ 'chat_id' => $targetChatId, 'photo' => $gifUrl, 'caption' => $caption, 'parse_mode' => 'Markdown' // 可选,支持加粗、斜体等格式 ]; // 发送POST请求 $options = [ 'http' => [ 'method' => 'POST', 'header' => 'Content-Type: application/x-www-form-urlencoded', 'content' => http_build_query($postData) ] ]; $context = stream_context_create($options); $apiResponse = file_get_contents($apiUrl, false, $context); $responseData = json_decode($apiResponse, true); // 返回结果给前端 if ($responseData['ok']) { echo json_encode(['success' => true]); } else { echo json_encode(['success' => false, 'error' => $responseData['description']]); } ?>
针对你场景的小优化
- 如果想让用户把内容发送到自己的Telegram,可以让用户先给Bot发消息获取自己的聊天ID,然后前端把这个ID一起传给后端,替换掉
targetChatId。 - 如果
sendPhoto显示的GIF是静态的,换成sendDocument接口,把photo参数改成document即可,Telegram会正确识别动图。 - 在Heroku上部署的话,记得把Bot Token和Chat ID存在环境变量里,不要硬编码在代码里(安全第一!)。
内容的提问来源于stack exchange,提问作者Leon
相关产品推荐
相关产品推荐

