找回密码
 立即注册
快捷导航

Discuz X! 3.5 论坛添加新帖 Telegram 通知的方式,包括回帖通知

[复制链接]
男技师 2023-7-12 11:41:32 | 显示全部楼层
本帖最后由 男技师 于 2023-7-19 10:43 编辑

原理就是在新帖插入数据库后,通过调用 telegram bot 的 api 往 channel 发消息,具体步骤和代码如下:

  • 创建一个电报 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/blob/v3.5/upload/source/class/model/model_forum_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/blob/v3.5/upload/source/class/model/model_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 都会有通知

回复

使用道具 举报

主题

0

回帖

410

积分

已臻大成

 楼主| 男技师 2023-7-12 11:43:12 | 显示全部楼层
Discuz X! 3.5 论坛添加新帖 Telegram 通知的方式,包括回帖通知3844 作者:男技师 帖子ID:475


Discuz X! 3.5 论坛添加新帖 Telegram 通知的方式,包括回帖通知9405 作者:男技师 帖子ID:475

   
回复

使用道具 举报

主题

0

回帖

410

积分

已臻大成

 楼主| 男技师 2023-7-12 11:45:51 | 显示全部楼层
其实一开始规划还有其它方案

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

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

使用道具 举报

主题

0

回帖

410

积分

已臻大成

 楼主| 男技师 2023-7-12 12:04:54 | 显示全部楼层
目前这个方案虽然兼顾了及时性,也就是,帖子刚提交,可能网页还没显示,你的电报就收到通知了,但是它也有个坏处,就是在 discuz 插入数据库后发通知,需要请求电报 api,如果网速慢的话,会导致提交帖子有延迟感
   
回复

使用道具 举报

主题

0

回帖

410

积分

已臻大成

 楼主| 男技师 2023-7-12 12:05:28 | 显示全部楼层
sendMessage 时将 disable_web_page_preview 设为 true 可以禁止 url 预览,使得单条消息不至于太长:https://core.telegram.org/bots/api#sendmessage   
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼
5楼
温馨提示

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

关于 注册码 问题

      由于近期经常大量注册机器人注册发送大量广告,本站开启免费入群领取注册码注册网站账号,注册码在群公告上贴着...

Archiver|手机版|小黑屋|DLSite

GMT+8, 2024-11-25 00:12

Powered by Discuz! X3.5 and PHP8

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