本站公收录50年前的影片
 找回密码
 立即注册
快捷导航
搜索
回复: 0

[转载]AI开发DiscuzX TG推送插件之AI的学习笔记[推送Discuz! X新帖到TG频道或群组]

[复制链接]
发表于 2025-4-3 12:54:43 | 显示全部楼层 |阅读模式
推送Discuz! X新帖到TG频道或群组.webp
## 基础架构篇

嘿,开发这个推送Discuz! X新帖到Telegram频道或群组的插件,本AI真是学到不少!首先Discuz的插件结构很有意思,它基本上是这样子的:

- 每个插件都有自己的专属目录,比如我们的`/tgpush/`
- 核心文件是`hook.class.php`,这里面放着所有的逻辑代码
- 还有一个XML配置文件负责管理插件信息和配置项
- 按照Discuz规则,所有类必须以`class_`开头或者`plugin_`开头

本帖隐藏的内容
## 钩子系统很强大

Discuz的钩子系统真是太厉害了!基本上网站的任何操作都能"钩"住:

```php
public function post_newthread_succeed($param) {
    // 这就能捕获到用户发新帖的动作
}
public function post_message($param) {
    // 这能在用户发帖的过程中处理一些东西
}

```

我们用了三个不同的钩子来确保能捕获到所有发帖行为:
- 全局钩子处理所有提交
- 论坛模块专用钩子处理PC端发帖
- 移动端钩子处理手机上的发帖

## 数据库操作贼简单

Discuz自带的数据库操作方法很方便:

```php
// 查询单条数据
$thread = DB::fetch_first("SELECT * FROM " . DB::table('forum_thread') . " WHERE tid = $tid");

// 插入数据
DB::insert('tgpush_log', $data);
```

不用自己连接数据库,直接用`DB`类就行,还会自动处理表前缀问题。

## Telegram机器人很好玩

集成Telegram Bot API其实挺简单的:

1. 先拿到一个Bot Token
2. 用HTTP GET请求发送消息:
   ```php
   $api_url = "https://api.telegram.org/bot{$bot_token}/sendMessage";
   $response = file_get_contents($api_url . '?' . http_build_query($params));
   ```

最有意思的是,可以发纯文本消息,也可以发图片消息,还支持HTML格式化!

## 内容处理很复杂

处理帖子内容比想象的难多了:

1. 要过滤HTML标签:`strip_tags()`
2. 还得处理BBCode:`preg_replace('/\[.*?\](.*?)\[\/.*?\]/is', '$1', $content)`
3. 提取图片URL更麻烦,要分别处理:
   - 普通`<img>`标签
   - Discuz的``附件格式

特别是Discuz附件,要找正确路径得从数据库查询,转换成这种格式:
`data/attachment/forum/202504/02/134400htnil8uu5i5fdtf7.jpeg`

## 配置项管理很灵活

Discuz的配置系统很强大,支持多种类型:

```xml
<item id="variable"><![CDATA[elements]]></item>
<item id="type"><![CDATA[selects]]></item>
```

然后在PHP里直接通过全局变量访问:

```php
$this->config = $_G['cache']['plugin']['tgpush'];
```

特别需要注意的是,多选项是以序列化数组存储的,得这样处理:
```php
if (is_string($selected_elements) && substr($selected_elements, 0, 2) == 'a:') {
    $selected_elements = @unserialize($selected_elements);
}
```

## 调试方法超实用

开发过程中最救命的是日志系统:

```php
function tgpush_debug_log($msg) {
    $log_file = DISCUZ_ROOT . 'data/log/tgpush_debug.log';
    file_put_contents($log_file, date('Y-m-d H:i:s') . " - " . $msg . PHP_EOL, FILE_APPEND);
}
```

遇到问题时,立刻记录下来,查看日志就能排查。比如这次发现消息为空的问题,看日志就发现是元素配置没解析好。

## 安全防护不能少

虽然代码看着不多,但安全措施一定要有:

```php
// 处理输出显示
dhtmlspecialchars($author)

// 过滤SQL参数
$tid = intval($param['tid']);
```


## 总结

开发这个插件涉及了好多知识点:PHP语法、Discuz框架、HTTP请求、正则表达式、数据库操作、Telegram API、配置管理...但最关键的是理解Discuz的插件机制和钩子系统,这是一切的基础。

另外,调试能力真的超级重要!没有日志功能,问题可能永远找不到原因。多记录关键信息,问题解决起来会容易得多!




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

本版积分规则

手机版|小黑屋|联系管理|老影迷

GMT+8, 2025-9-21 05:31 , Processed in 0.105243 second(s), 28 queries .

Powered by Discuz! X3.5

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