Discuz x! 3.5 增加 Telegram 新帖通知的方式
[*]创建一个电报 channel,直接在电报 App 上操作即可,就像微信建新群一样简单
[*]创建一个电报 bot,并获取 bot 的 token,这个直接问 chatgpt:“如何开通 telegram bot 并获取 Bot_Token”,有详细步骤
[*]将 bot 添加到 channel 并设为管理员,这个也直接问 chatgpt:“如何将 telegram bot 添加到 channel 并设为管理员”
[*]bot 进 channel 后,在 channel 里发一条消息,然后用如下链接得到 channel 的 chatId:
https://api.telegram.org/bot${botToken}/getUpdates
[*]然后在 https://gitee.com/Discuz/DiscuzX ... rum_thread.php#L219 添加如下代码
if ( $this->param['pinvisible']===0 && $this->forum['fid']!=='5' ) {
try {
$msg = preg_replace('/\[[^\]]+\]/', '', $this->param['message']);
if (mb_strlen($msg, 'UTF-8') > 64) {
$msg = mb_substr($msg, 0, 64, 'UTF-8');
$msg .= '...';
}
$msg = str_replace(["\n", "\r\n"], " ", trim($msg));
$data = [
'chat_id' => $chatIdOfChannel,
'text' => "【新主题】
标题:{$this->param['subject']}
作者:{$this->member['username']}
内容:$msg
链接:https://shuzijumin.com/thread-{$this->tid}-1-1.html"
];
$ch = curl_init("https://api.telegram.org/bot{$botToken}/sendMessage");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {}
}
[*]在 https://gitee.com/Discuz/DiscuzX ... forum_post.php#L144 添加如下代码
if ( $pinvisible===0 && $status===0 ) {
$threadInfo = C::t('forum_thread')->fetch_thread($this->thread['tid']);
try {
$msg = preg_replace('/\[[^\]]+\]/', '', $this->param['message']);
if (mb_strlen($msg, 'UTF-8') > 64) {
$msg = mb_substr($msg, 0, 64, 'UTF-8');
$msg .= '...';
}
$msg = str_replace(["\n", "\r\n"], " ", trim($msg));
$data = [
'chat_id' => $chatIdOfChannel,
'text' => "【新回帖】
原贴:{$threadInfo['subject']}
回复者:{$this->member['username']}
回复内容:$msg
链接:https://shuzijumin.com/forum.php?mod=redirect&goto=findpost&ptid={$this->thread['tid']}&pid={$this->pid}"
];
$ch = curl_init("https://api.telegram.org/bot{$botToken}/sendMessage");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {}
}这样每次发新主题或者回帖,电报 channel 都会有通知
其实一开始规划还有其它方案
有个是写定时脚本,每分钟读一下数据库,判断是否有新帖,帖子不多的话,大部分时间读取数据库都是白读,此外,帖子通知的延迟最多可能会有 1 分钟
另一个方案是打算直接用 bot 通知每个加 bot 好有的用户 chatId,但是好友多了,需要调用 sendMessage 的次数会很多,肯定会超过 telegram 的限制,而且这种方式还需要数据库记录所有人的 chatId,所以最终选择用 channel,只需把消息发 channel 即可 目前这个方案虽然兼顾了及时性,也就是,帖子刚提交,可能网页还没显示,你的电报就收到通知了,但是它也有个坏处,就是在 discuz 插入数据库后发通知,需要请求电报 api,如果网速慢的话,会导致提交帖子有延迟感 sendMessage 时将 disable_web_page_preview 设为 true 可以禁止 url 预览,使得单条消息不至于太长:https://core.telegram.org/bots/api#sendmessage 原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊哈哈 Monika 发表于 2023-7-22 18:03
原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊 ...
先这样,后续消息太多了再改 Monika 发表于 2023-7-22 18:03
原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊 ...
SSR 订阅可以只接收主题通知 赞+!!! 这是指在第219行添加这代码吗? taz 发表于 2023-10-2 21:20
这是指在第219行添加这代码吗?
两个地方,一个主题帖,一个回帖的
页:
[1]
2