{"id":35098629,"url":"https://github.com/duhongming1990/dify-on-lark","last_synced_at":"2026-04-01T21:06:06.528Z","repository":{"id":324312287,"uuid":"1078262286","full_name":"duhongming1990/dify-on-lark","owner":"duhongming1990","description":"dify-on-lark是一个非常轻量级、易于部署 Dify 的飞书机器人集成方案。可以通过简单配置来对接你的Dify应用和企业内部机器人，实现企业内部机器人的群聊、私聊智能问答，且支持飞书的AI卡片流式打字机输出效果。","archived":false,"fork":false,"pushed_at":"2026-02-03T13:23:34.000Z","size":1717,"stargazers_count":10,"open_issues_count":1,"forks_count":4,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T00:36:41.950Z","etag":null,"topics":["dify","dify-on-feishu","dify-on-lark","feishu","lark"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/duhongming1990.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-17T13:06:29.000Z","updated_at":"2026-03-23T05:55:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/duhongming1990/dify-on-lark","commit_stats":null,"previous_names":["duhongming1990/dify-on-lark"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/duhongming1990/dify-on-lark","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duhongming1990%2Fdify-on-lark","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duhongming1990%2Fdify-on-lark/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duhongming1990%2Fdify-on-lark/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duhongming1990%2Fdify-on-lark/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/duhongming1990","download_url":"https://codeload.github.com/duhongming1990/dify-on-lark/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/duhongming1990%2Fdify-on-lark/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291994,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dify","dify-on-feishu","dify-on-lark","feishu","lark"],"created_at":"2025-12-27T16:10:01.563Z","updated_at":"2026-04-01T21:06:06.514Z","avatar_url":"https://github.com/duhongming1990.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\n\n[English](README_EN.md) / 简体中文 / (PR for your language)\n\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/duhongming1990/dify-on-lark)](https://github.com/duhongming1990/dify-on-lark/releases/latest)\n\u003cimg src=\"https://img.shields.io/badge/java-21-blue.svg\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/Spring%20Boot-3.5.6-blue.svg\"/\u003e\n\u003cimg src=\"https://img.shields.io/maven-central/v/com.larksuite.oapi/oapi-sdk.svg?label=larksuite-oapi-sdk\" /\u003e\n\u003cimg src=\"https://img.shields.io/maven-central/v/io.github.imfangs/dify-java-client.svg?label=dify-java-client\" /\u003e\n\n\u003c/div\u003e\n\nGithub：https://github.com/duhongming1990/dify-on-lark\n\nGitee：https://gitee.com/duhongming/dify-on-lark\n\n# 1 介绍\n\ndify-on-lark是一个非常轻量级、易于部署 Dify\n的飞书机器人集成方案。可以通过简单配置来对接你的Dify应用和企业内部机器人，实现企业内部机器人的群聊、私聊智能问答，且支持飞书的AI卡片流式打字机输出效果。\n\n## 1.1 项目功能\n\n- 支持回复卡片消息\n- 支持显示Dify中应用名称和应用描述\n- 支持卡片流式响应推理输出\n- 支持@相关人员\n- 支持相关问题显示\n- 支持相关文档显示\n- 支持token用量分析和推理耗时\n- 支持点赞和踩功能和Dify后台交互\n\n![dify-on-lark.png](http://kodo.cdn.duhongming.top/dify-on-lark/dify-on-lark.png)\n\n## 1.2 项目背景\n\n### 1.2.1 参考dify-on-dingtalk\n\n- 将 Dify 应用与钉钉机器人集成：https://docs.dify.ai/zh-hans/learn-more/use-cases/dify-on-dingtalk\n- GitHub：https://github.com/zfanswer/dify-on-dingtalk\n\n### 1.2.2 参考dify-on-wechat\n\n- 手把手教你把 Dify 接入微信生态：https://docs.dify.ai/zh-hans/learn-more/use-cases/dify-on-wechat\n- GitHub：https://github.com/hanfangyuan4396/dify-on-wechat\n\n### 1.2.3 参考langbot\n\n- 将 Dify 快速接入\n  QQ、微信、飞书、钉钉等平台：https://docs.dify.ai/zh-hans/learn-more/use-cases/connect-dify-to-various-im-platforms-by-using-langbot\n- GitHub：https://github.com/langbot-app/LangBot\n\n发现没有专门对接飞书的dify-on-lark，langbot中可以接入飞书，但发现只是基础功能：卡片流式响应推理输出。\n\n## 1.3 项目依赖\n\n- 依赖飞书SDK：https://github.com/larksuite/oapi-sdk-java\n\n- 依赖Dify SDK：https://github.com/imfangs/dify-java-client\n\n# 2 项目配置及部署\n\n| 配置参数                            | 是否必填 | 备注                                                                                          |\n|---------------------------------|------|---------------------------------------------------------------------------------------------|\n| platform.lark.appId             | ✅    | 应用唯一的 ID 标识                                                                                 |\n| platform.lark.appName           | ✅    | 应用名，用于是否@本应用，通过验证后响应                                                                        |\n| platform.lark.appSecret         | ✅    | 应用的密钥，在创建应用时由平台生成，可用于获取 app_access_token                                                    |\n| platform.lark.verificationToken | ✅    | 用于加密事件或回调的请求内容，校验请求来源。当订阅方式为“将事件发送至开发者服务器”或“将回调发送至开发者服务器”时生效                                |\n| platform.lark.encryptKey        | ✅    | 用于加密事件或回调的请求内容，校验请求来源。当订阅方式为“将事件发送至开发者服务器”或“将回调发送至开发者服务器”时生效                                |\n| platform.lark.cardTemplateId    |      | 如果配置中cardTemplateId不存在，则使用内置Card。可自定义卡片，先将[LLM.card](src/main/resources/LLM.card)导入进去，自行修改！ |\n| provider.dify.url               | ✅    | Dify地址，需要带上/v1，例如：http://localhost/v1                                                       |\n| provider.dify.auth              | ✅    | Dify鉴权，无需加上Bearer ,例如：app-xxx                                                               |                                               \n\n## 2.1 飞书配置\n\nhttps://open.feishu.cn/app\n\n### 2.1.1 获取appId和appSecret\n\n![](http://kodo.cdn.duhongming.top/dify-on-lark/lark-config-1.png)\n\n```properties\nplatform.lark.appId=xxx\nplatform.lark.appName=xxx\nplatform.lark.appSecret=xxx\n```\n\n### 2.1.2 获取verificationToken和encryptKey\n\n![](http://kodo.cdn.duhongming.top/dify-on-lark/lark-config-2.png)\n\n```properties\nplatform.lark.verificationToken=xxx\nplatform.lark.encryptKey=xxx\n```\n\n### 2.1.3 飞书卡片配置（可选）\n\nhttps://open.feishu.cn/cardkit\n可自定义卡片，先将[LLM.card](src/main/resources/LLM.card)导入进去，自行修改！\n\n```\nplatform.lark.cardTemplateId=xxx\n```\n\n需要新建这几个变量\n\n- name 应用名称\n- description 应用描述\n- answer 回答\n- question 相关问题\n- document 相关文档\n\n## 2.2 Dify配置\n\n![](http://kodo.cdn.duhongming.top/dify-on-lark//dify-config.png)\n\n```properties\nprovider.dify.url=http://localhost/v1\nprovider.dify.auth=app-xxx\n```\n\n## 2.3 启动服务\n\n### 2.3.1 利用Docker启动服务\n\n```bash\ndocker run -d --name dify-on-lark \\\n  -e TZ=Asia/Shanghai \\\n  -e PARAMS=\"--platform.lark.appId=xxx \\\n  --platform.lark.appSecret=xxx \\\n  --platform.lark.encryptKey=xxx \\\n  --platform.lark.verificationToken=xxx \\\n  --provider.dify.url=http://localhost/v1 \\\n  --provider.dify.auth=app-xxx\" \\\n  -p 8088:8088 \\\n  --restart=always \\\nduhongming/dify-on-lark:v1.0.0 \n```\n\n### 2.3.2 从源码启动服务\n\n重命名文件，填入配置即可！\n\n```bash\nmv application.template.properties application.properties\n```\n\nrun `DifyOnLarkApplication`就行了！\n\n### 2.3.3 k8s启动\n\n一键执行：\n\n```bash\nkubectl apply -f dify-on-lark.yaml\n```\n\ndify-on-lark.yaml 如下：\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: dify-on-lark  # 对应 --name dify-on-lark\n  labels:\n    app: dify-on-lark\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: dify-on-lark\n  template:\n    metadata:\n      labels:\n        app: dify-on-lark\n    spec:\n      containers:\n        - name: dify-on-lark  # 容器名称与部署名保持一致\n          image: duhongming/dify-on-lark:v1.0.1  # 镜像地址\n          env:\n            - name: TZ\n              value: \"Asia/Shanghai\"  # 时区环境变量\n            - name: PARAMS\n              value: |  # 保留原参数结构，换行保持可读性\n                --platform.lark.appId=xxx\n                --platform.lark.appSecret=xxx\n                --platform.lark.encryptKey=xxx\n                --platform.lark.verificationToken=xxx\n                --provider.dify.url=http://localhost/v1\n                --provider.dify.auth=app-xxx\n          ports:\n            - containerPort: 8088  # 假设应用默认暴露8080端口（请根据实际端口调整）\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: dify-on-lark-service  # Service名称与部署名关联\nspec:\n  selector:\n    app: dify-on-lark  # 关联到上面的Deployment\n  ports:\n    - port: 8088  # Service暴露的集群内访问端口\n      targetPort: 8088  # 映射到容器的端口（需与containerPort一致）\n  type: ClusterIP  # 集群内部可访问，如需外部访问可改为NodePort/LoadBalancer\n---\n# https://doc.traefik.io/traefik/reference/routing-configuration/kubernetes/crd/http/ingressroute/ \napiVersion: traefik.io/v1alpha1\nkind: IngressRoute\nmetadata:\n  name: dify-on-lark-ingress-route-http\nspec:\n  entryPoints:\n    - web\n  routes:\n    - match: Host(`dify-on-lark.example.com`)\n      kind: Rule\n      services:\n        - name: dify-on-lark-service\n          port: 8088\n```\n\n## 2.4 飞书平台配置\n\n项目启动后，才可以操作。\n\n### 2.4.1 事件配置\n\n使用 长连接 接收事件 ，点击`保存`\n![](http://kodo.cdn.duhongming.top/dify-on-lark/event-config.png)\n\n### 2.4.2 回调配置\n\n使用 长连接 接收回调 ，点击`保存`\n![](http://kodo.cdn.duhongming.top/dify-on-lark/callback-config.png)\n\n### 2.4.3 添加事件\n\n事件配置中添加：\n\n- 接收消息 im.message.receive_v1\n  ![](http://kodo.cdn.duhongming.top/dify-on-lark/event-config-im.message.receive_v1.png)\n\n回调配置中添加：\n\n- 卡片回传交互 card.action.trigger\n  ![](http://kodo.cdn.duhongming.top/dify-on-lark/callback-config-card.action.trigger.png)\n\n### 2.4.4 版本发布\n\n最后别忘记点击版本发布！最后别忘记点击版本发布！最后别忘记点击版本发布！重要事情说三遍......\n![](http://kodo.cdn.duhongming.top/dify-on-lark/release-version.png)\n\n### 2.4.5 权限管理\n\n最小开通权限，导入即可：\n\n```json\n{\n  \"scopes\": {\n    \"tenant\": [\n      \"cardkit:card:read\",\n      \"cardkit:card:write\",\n      \"cardkit:template:read\",\n      \"im:message\",\n      \"im:message.group_at_msg:readonly\",\n      \"im:message.group_msg\",\n      \"im:message.p2p_msg:readonly\",\n      \"im:message:send_as_bot\"\n    ],\n    \"user\": []\n  }\n}\n```\n\n![](http://kodo.cdn.duhongming.top/dify-on-lark/min-privilege.png)\n\n# 3 提供飞书API增强接口对接Dify\n\n## 3.1 通过 日/周/月/年 等维度获取指定群的历史对话，用于总结群对话\n\n- chatId 可以直接在群里面 @dify-on-lark id 即可获取！\n\n- timeType 时间类型，为下列值时，自动计算startTime和endTime\n  | 时间类型 | 功能 |\n  |-------|----------|\n  | day | 获取昨日起止时间 |\n  | week | 获取上周起止时间 |\n  | month | 获取上月起止时间 |\n  | year | 获取去年起止时间 |\n\n- sortType 消息排序方式。\n  ByCreateTimeAsc：按消息创建时间升序排列\n  ByCreateTimeDesc：按消息创建时间降序排列\n  默认值：ByCreateTimeAsc\n\n- startTime 待查询历史信息的起始时间，秒级时间戳。\n  注意：thread 容器类型暂不支持获取指定时间范围内的消息。\n\n- endTime\n  待查询历史信息的结束时间，秒级时间戳。\n  注意：thread 容器类型暂不支持获取指定时间范围内的消息。\n\nGET http://localhost:8088/api/v1/chat/history?chatId=oc_xxx\u0026timeType=day\n\n## 3.2 机器人bot被加入了哪些群\n\n- userIdType 用户 ID 类型\n  示例值：\"open_id\"\n  可选值有：\n  open_id：标识一个用户在某个应用中的身份。同一个用户在不同应用中的 Open ID 不同。了解更多：如何获取 Open ID\n  union_id：标识一个用户在某个应用开发商下的身份。同一用户在同一开发商下的应用中的 Union ID 是相同的，在不同开发商下的应用中的\n  Union ID 是不同的。通过 Union ID，应用开发商可以把同个用户在多个应用中的身份关联起来。了解更多：如何获取 Union ID？\n  user_id：标识一个用户在某个租户内的身份。同一个用户在租户 A 和租户 B 内的 User ID 是不同的。在同一个租户内，一个用户的\n  User ID 在所有应用（包括商店应用）中都保持一致。User ID 主要用于在不同的应用间打通用户数据。了解更多：如何获取 User ID？\n  默认值：open_id\n\n- sortType 群组排序方式\n  示例值：\"ByCreateTimeAsc\"\n  可选值有：\n  ByCreateTimeAsc：按群组创建时间升序排列\n  ByActiveTimeDesc：按群组活跃时间降序排列。因群组活跃时间变动频繁，使用 ByActiveTimeDesc 排序方式可能会造成群组遗漏。例如，设置分页大小为\n  10，发起第一次请求获取到第一页数据后，原本排在第 11 位的群组中有群成员发送了一条消息，那么该群组将被排列到第 1\n  位，此时发起请求获取第二页数据时，该群组将不能被获取到，需要再从第一页开始获取。\n  默认值：ByCreateTimeAsc\n\nGET http://localhost:8088/api/v1/chats\n\n# 版本记录\n\n## v1.0.0\n\n- [+] 初始版本，Dify应用在飞书卡片中交互\n\n## v1.0.1\n\n- [+] 新增飞书增强接口：获取群历史消息/机器人所在群组列表\n\n## v1.0.2\n\n- [+] 增加应用名称配置\n- [~] 修复bot在群里面没有@时，随意回答的bug\n\n## v1.0.3\n- [+] 增加Jenkins自动CI，并推送镜像到docker仓库和阿里云仓库\n- [+] 增加k8s部署yaml\n- [^] 升级oapi-sdk和dify-java-client依赖版本\n\n## v1.0.4\n- [~] 更新消息处理逻辑，减少NPE\n- [~] 修复在工作流中，飞书消息显示不全问题处理\n- [^] 升级oapi-sdk和dify-java-client依赖版本\n- [+] 添加sonar和质量门及jacoco代码覆盖率报告","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduhongming1990%2Fdify-on-lark","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduhongming1990%2Fdify-on-lark","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduhongming1990%2Fdify-on-lark/lists"}