找回密码
 注册免广告
搜索
人人必备的 Wise 💳华侨银行送 15 新加坡币 🎁个人 IBAN 出金,注册送 $25 比特币 ฿数字货币银行卡,注册送 7 美元💲
查看: 1499|回复: 15

Discuz x! 3.5 增加 Telegram 新帖通知的方式

[复制链接]

465

主题

5019

回帖

1万

积分

版主

积分
12108
HelloWorld 发表于 2023-6-18 10:32:51 | 显示全部楼层 |阅读模式
  • 创建一个电报 channel,直接在电报 App 上操作即可,就像微信建新群一样简单
  • 创建一个电报 bot,并获取 bot 的 token,这个直接问 chatgpt:“如何开通 telegram bot 并获取 Bot_Token”,有详细步骤
  • 将 bot 添加到 channel 并设为管理员,这个也直接问 chatgpt:“如何将 telegram bot 添加到 channel 并设为管理员”
  • bot 进 channel 后,在 channel 里发一条消息,然后用如下链接得到 channel 的 chatId:

  1. https://api.telegram.org/bot${botToken}/getUpdates
复制代码


  1. if ( $this->param['pinvisible']===0 && $this->forum['fid']!=='5' ) {
  2.   try {
  3.     $msg = preg_replace('/\[[^\]]+\]/', '', $this->param['message']);
  4.     if (mb_strlen($msg, 'UTF-8') > 64) {
  5.       $msg = mb_substr($msg, 0, 64, 'UTF-8');
  6.       $msg .= '...';
  7.     }
  8.     $msg = str_replace(["\n", "\r\n"], " ", trim($msg));
  9.     $data = [
  10.       'chat_id' => $chatIdOfChannel,
  11.       'text' => "【新主题】
  12. 标题:{$this->param['subject']}
  13. 作者:{$this->member['username']}
  14. 内容:$msg
  15. 链接:https://shuzijumin.com/thread-{$this->tid}-1-1.html"
  16.     ];
  17.     $ch = curl_init("https://api.telegram.org/bot{$botToken}/sendMessage");
  18.     curl_setopt($ch, CURLOPT_POST, true);
  19.     curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  20.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  21.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  22.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  23.     curl_exec($ch);
  24.     curl_close($ch);
  25.   } catch (Exception $e) {}
  26. }
复制代码

  1. if ( $pinvisible===0 && $status===0 ) {
  2.   $threadInfo = C::t('forum_thread')->fetch_thread($this->thread['tid']);
  3.   try {
  4.     $msg = preg_replace('/\[[^\]]+\]/', '', $this->param['message']);
  5.     if (mb_strlen($msg, 'UTF-8') > 64) {
  6.       $msg = mb_substr($msg, 0, 64, 'UTF-8');
  7.       $msg .= '...';
  8.     }
  9.     $msg = str_replace(["\n", "\r\n"], " ", trim($msg));
  10.     $data = [
  11.       'chat_id' => $chatIdOfChannel,
  12.       'text' => "【新回帖】
  13. 原贴:{$threadInfo['subject']}
  14. 回复者:{$this->member['username']}
  15. 回复内容:$msg
  16. 链接:https://shuzijumin.com/forum.php?mod=redirect&goto=findpost&ptid={$this->thread['tid']}&pid={$this->pid}"
  17.     ];
  18.     $ch = curl_init("https://api.telegram.org/bot{$botToken}/sendMessage");
  19.     curl_setopt($ch, CURLOPT_POST, true);
  20.     curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  21.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  22.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  23.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  24.     curl_exec($ch);
  25.     curl_close($ch);
  26.   } catch (Exception $e) {}
  27. }
复制代码
这样每次发新主题或者回帖,电报 channel 都会有通知


465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-6-18 10:38:40 | 显示全部楼层
其实一开始规划还有其它方案

有个是写定时脚本,每分钟读一下数据库,判断是否有新帖,帖子不多的话,大部分时间读取数据库都是白读,此外,帖子通知的延迟最多可能会有 1 分钟

另一个方案是打算直接用 bot 通知每个加 bot 好有的用户 chatId,但是好友多了,需要调用 sendMessage 的次数会很多,肯定会超过 telegram 的限制,而且这种方式还需要数据库记录所有人的 chatId,所以最终选择用 channel,只需把消息发 channel 即可

465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-6-18 10:40:33 | 显示全部楼层
目前这个方案虽然兼顾了及时性,也就是,帖子刚提交,可能网页还没显示,你的电报就收到通知了,但是它也有个坏处,就是在 discuz 插入数据库后发通知,需要请求电报 api,如果网速慢的话,会导致提交帖子有延迟感

465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-6-18 13:45:11 | 显示全部楼层
sendMessage 时将 disable_web_page_preview 设为 true 可以禁止 url 预览,使得单条消息不至于太长:https://core.telegram.org/bots/api#sendmessage

9

主题

69

回帖

552

积分

版主

积分
552
Monika 发表于 2023-7-22 18:03:13 | 显示全部楼层
原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊哈哈

点评

SSR 订阅可以只接收主题通知  详情 回复 发表于 2023-7-22 18:15
先这样,后续消息太多了再改  详情 回复 发表于 2023-7-22 18:14
JUST MONIKA...

465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-7-22 18:14:57 | 显示全部楼层
Monika 发表于 2023-7-22 18:03
原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊 ...

先这样,后续消息太多了再改

465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-7-22 18:15:24 | 显示全部楼层
Monika 发表于 2023-7-22 18:03
原来如此,不过其实可以只推送主题,回贴的话,现在人少,也不水还好,人多了水贴多了看着有点不方便……啊 ...

SSR 订阅可以只接收主题通知

0

主题

20

回帖

62

积分

注册会员

积分
62
ISKII 发表于 2023-8-15 19:57:34 | 显示全部楼层
赞+!!!

0

主题

4

回帖

10

积分

新手上路

积分
10
taz 发表于 2023-10-2 21:20:47 | 显示全部楼层
这是指在第219行添加这代码吗?

465

主题

5019

回帖

1万

积分

版主

积分
12108
 楼主| HelloWorld 发表于 2023-10-2 22:21:34 | 显示全部楼层
taz 发表于 2023-10-2 21:20
这是指在第219行添加这代码吗?

两个地方,一个主题帖,一个回帖的

点评

taz
L219 和 L144指的是什么  详情 回复 发表于 2023-10-3 01:27
您需要登录后才可以回帖 登录 | 注册免广告

本版积分规则

排行榜|意见建议|数字居民论坛

GMT+8, 2024-5-20 12:52

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表