logo
0
1
WeChat Login

钉钉机器人基础框架

一个基于PHP的钉钉机器人开发框架,支持插件化扩展和完整的日志记录系统。

二次开发使用Code Buddy IDE进行辅助开发。感谢CNB.COOL提供代码托管服务

版本信息

  • 版本: v1.1.0
  • 作者: Qicloud-DingBotQicloud admin@zets.cn
  • 适用于: 钉钉群聊机器人
  • 更新: 支持新版钉钉机器人 SessionWebhook

功能特性

🤖 核心功能

  • 支持新版钉钉机器人 SessionWebhook(推荐)
  • 兼容传统钉钉机器人配置方式
  • 插件化架构,支持自定义功能扩展
  • 完整的日志记录系统
  • 管理员权限控制(基于钉钉isAdmin字段)
  • 定时任务支持
  • 消息发送统计
  • 自动兼容新旧版钉钉机器人

📝 消息类型支持

  • 文本消息 (text)
  • Markdown消息 (markdown)
  • 链接消息 (link)
  • 卡片消息 (actionCard)
  • 订阅消息 (feedCard)

📊 日志系统

  • 聊天消息日志: ./Data/Log/Chat/[日期]/chat.log
  • 原始消息日志: ./Data/Log/Other/[日期]-raw.log
  • 其他类型消息: ./Data/Log/Other/[日期].log
  • 未知消息日志: ./Data/Log/Other/[日期]-unknown.log
  • 定时任务日志: ./Data/Cron/Cron_[任务名].log
  • 安全验证日志: ./Data/Log/Security/[日期]-security.log 🔒
  • 消息统计: ./Data/num.txt

目录结构

BOT_API/
├── index.php              # 主入口文件
├── inc/
│   ├── config.php         # 配置文件
│   └── function.php       # 函数库
├── plugins/               # 插件目录
│   ├── Hello World.php    # 示例插件
│   ├── GroupSign.php      # 群签到插件
│   ├── Weather_List.php   # 天气查询插件
│   ├── Hitokoto.php       # 一言插件
│   ├── Time.php           # 时间插件
│   └── Rand.php           # 随机数插件
├── Data/                  # 数据目录(自动创建)
│   ├── Log/               # 日志目录
│   │   ├── Chat/          # 聊天日志
│   │   └── Other/         # 其他日志
│   ├── Cron/              # 定时任务日志
│   └── num.txt            # 消息统计
├── themes/                # 主题目录
└── docs/                  # 文档目录

快速开始

1. 配置钉钉机器人

编辑 inc/config.php 文件:

新版钉钉机器人配置(推荐)

// 是否使用新版钉钉机器人(使用 sessionWebhook)
$Use_SessionWebhook = 'true';

// 钉钉机器人签名验证配置(重要安全功能)
$Enable_Sign_Verification = 'true';  // 生产环境强烈建议开启
$BOT_AppSecret = '你的机器人AppSecret';  // 从钉钉开发者后台获取

// 其他配置
$BOT_Sleep = 'false';
$API_Server = '你的API地址';
$API_Token = '你的API_Token';
$Cron_Token_Required = 'false';

传统钉钉机器人配置(兼容模式)

// 使用传统配置模式
$Use_SessionWebhook = 'false';

// 钉钉机器人的Webhook地址
$BOT_Server = 'https://oapi.dingtalk.com/robot/send';

// 钉钉机器人的Access_Token
$BOT_Token = '你的access_token';

// 钉钉机器人的关键词
$BOT_Keyword = '你的关键词';

// 签名验证配置(可选但推荐)
$Enable_Sign_Verification = 'true';
$BOT_AppSecret = '你的机器人AppSecret';

// 其他配置
$BOT_Sleep = 'false';
$API_Server = '你的API地址';
$API_Token = '你的API_Token';
$Cron_Token_Required = 'false';

新版与传统版本对比

特性新版 SessionWebhook传统版本
关键词❌ 不需要✅ 必须配置
Access Token❌ 不需要✅ 必须配置
Webhook地址🔄 动态获取📝 手动配置
配置复杂度🟢 简单🟡 中等
推荐程度⭐⭐⭐⭐⭐⭐⭐⭐

2. 安全配置(重要)

签名验证配置

钉钉机器人支持签名验证来确保请求的合法性,强烈建议在生产环境中启用:

// 开启签名验证
$Enable_Sign_Verification = 'true';

// 设置机器人的AppSecret(从钉钉开发者后台获取)
$BOT_AppSecret = '你的机器人AppSecret';

签名验证原理

  1. 时间戳验证: 请求时间戳与系统当前时间相差超过1小时则拒绝
  2. 签名验证: 使用 timestamp + "\n" + AppSecret 进行 HmacSHA256 签名并 Base64 编码
  3. 双重验证: 只有时间戳和签名同时验证通过才认为是合法请求

安全日志

系统会自动记录安全相关事件:

  • 验证成功: ./Data/Log/Security/[日期]-security.log
  • 验证失败: 包含IP地址和失败原因
  • 异常请求: 缺少必要头部信息的请求

获取AppSecret

  1. 登录钉钉开发者后台
  2. 找到你的机器人应用
  3. 在机器人配置页面获取 AppSecret
  4. 将 AppSecret 配置到 $BOT_AppSecret 变量中

⚠️ 安全提醒:

  • AppSecret 是敏感信息,请妥善保管
  • 生产环境务必开启签名验证
  • 定期检查安全日志

3. 定时任务配置(可选)

如果需要使用定时任务功能,可以通过以下方式触发:

手动触发

在钉钉群中发送以下命令之一:

  • "执行定时任务"
  • "检查定时任务"
  • "触发定时任务"

外部触发(推荐)

通过crontab等定时器定期访问接口:

不需要token验证(默认配置):

# 每分钟执行一次
* * * * * curl "http://你的域名/?trigger_tasks=true"

需要token验证(生产环境推荐):

  1. 在config.php中设置:$Cron_Token_Required = 'true';
  2. 设置crontab:
# 每分钟执行一次
* * * * * curl "http://你的域名/?trigger_tasks=true&token=你的API_Token"

2. 部署到服务器

将项目文件上传到Web服务器,确保PHP环境支持:

  • PHP 7.0+
  • cURL扩展
  • 文件写入权限

3. 设置钉钉机器人Webhook

在钉钉群聊中添加自定义机器人,将Webhook地址设置为:

https://你的域名/

插件开发

插件结构

插件文件放置在 plugins/ 目录下,基本结构:

新版插件开发(推荐)

<?php
/*
* @Plugin Name:示例插件
* @Author:你的名字
* @Version:1.0.0
* @Modified for:钉钉机器人
*/

// 检查消息内容
if(isset($Data['text']['content'])) {
    $message = $Data['text']['content'];
    
    // 匹配关键词
    if(strpos($message, '你好') !== false) {
        // 使用新的发送函数(推荐)
        send_text('你好!我是机器人');
        
        // 或者发送Markdown消息
        send_markdown('问候', '**你好!** 我是机器人\n\n欢迎使用!');
    }
    
    // 处理其他命令
    if(strpos($message, '帮助') !== false) {
        $helpText = "# 机器人帮助\n\n";
        $helpText .= "- 发送「你好」获取问候\n";
        $helpText .= "- 发送「帮助」查看此信息\n";
        
        send_markdown('帮助信息', $helpText);
    }
}
?>

兼容旧版插件

<?php
// 旧版插件写法仍然支持
if(isset($Data['text']['content'])) {
    $message = $Data['text']['content'];
    
    if(strpos($message, '你好') !== false) {
        // 旧版写法(仍然可用)
        http_post_json('text', '你好!我是机器人');
    }
}
?>

可用函数

消息发送函数(推荐使用新函数)

  • send_text($content) - 发送文本消息(推荐)
  • send_markdown($title, $text) - 发送Markdown消息(推荐)
  • send_message($msgType, $content) - 通用发送函数(推荐)
  • http_post_json($msgType, $content, $sessionWebhook) - 原始发送函数(兼容)

网络请求函数

  • curl($url, $guise, $UA) - HTTP请求
  • Curl_Post($server, $data) - POST请求

定时任务函数

  • BOT_Time_Inr($name, $minutes) - 间隔执行
  • BOT_Time_Day($name, $time) - 每天定时执行
  • BOT_Time_One($name, $datetime) - 单次定时执行
  • BOT_Time_Hour($name, $minute) - 整点执行

API调用函数

  • call_api($endpoint, $params) - 调用外部API

管理员功能

框架自动识别钉钉群管理员权限(基于isAdmin字段),管理员可使用特殊命令:

  • 重启命令: 发送包含"重启"的消息可重启机器人服务

日志查看

聊天日志格式

[2024-01-20 14:30:25] 用户昵称(用户ID): 消息内容

原始日志格式

[2024-01-20 14:30:25] {"msgtype":"text","text":{"content":"消息内容"},...}

高级配置

延时策略

开启延时策略可避免消息发送过于频繁:

$BOT_Sleep = 'true';  // 开启延时

自定义主题

themes/ 目录下创建 index.php 可自定义访问页面。

注意事项

  1. 权限设置: 确保 Data/ 目录有写入权限
  2. 关键词配置: 钉钉机器人需要配置关键词才能正常发送消息
  3. 服务器要求: 需要支持PHP和cURL扩展
  4. 日志管理: 定期清理日志文件避免占用过多空间

更新日志

Beta_0.0.1 (2021-05-16)

  • 优化管理员权限判断,使用钉钉返回的isAdmin字段
  • 简化配置文件,移除不必要的Admin_ID配置
  • 完善日志记录系统
  • 支持多种消息类型发送

技术支持

如有问题或建议,请查看 docs/ 目录下的相关文档。

许可证

本项目基于开源项目二次开发,仅供学习和研究使用。

About

一个基于PHP的钉钉机器人开发框架,支持插件化扩展和完整的日志记录系统。

Language
Markdown54.7%
PHP45.2%
gitignore0.1%