打造智能钉钉机器人:借助智谱GLM-4-Flash实现高效智能回复(文末附源码)

文章目录

  • 前言
  • 一、准备工作
    • (一)钉钉机器人
    • (二)智谱 GLM-4-Flash
    • (三)内网穿透工具 cpolar
    • (四)需要准备的工具和环境
  • 二、钉钉机器人的创建与配置
      • 步骤1:创建钉钉机器人
      • 步骤2:将机器人加入群聊
      • 步骤3:配置服务器相关信息
  • 三、开发环境准备
    • (一) 本地开发环境搭建
      • 步骤1:创建 Python环境
      • 步骤2:安装必要的依赖库
    • (二) 获取 API 密钥
  • 四、消息接收与处理
    • (一)接收钉钉消息
    • (二)解析消息内容
    • (三)验证消息合法性
  • 五、调用大模型生成答案
    • (一)处理用户指令
    • (二)发送回复消息
  • 六、运行与测试
    • (一)本地运行
        • 艾特机器人并发送“地震播报”
        • 艾特机器人并发送“北京天气”
        • 艾特机器人并询问问题
  • 总结
  • 附录


前言

        在当今数字化办公的时代,钉钉作为一款广泛使用的办公协作工具,其机器人功能为企业和团队带来了诸多便利。通过创建自定义钉钉机器人,我们可以实现自动化消息推送、智能问答等功能,极大地提高工作效率。而智谱 GLM-4-Flash 作为一款强大的语言模型,能够生成高质量的文本内容,为我们的机器人赋予更智能的回复能力。本文将详细介绍如何从零开始打造一个智能钉钉机器人,实现调用智谱 API 来生成智能回复的全过程。


一、准备工作

        在开始打造智能钉钉机器人之前,我们需要对一些基础知识有所了解,并准备好必要的工具和环境。

(一)钉钉机器人

        钉钉机器人是一种可以自动接收和处理钉钉群消息的工具,它通过 webhook 接口与钉钉进行通信。机器人可以被添加到钉钉群聊中,当群成员艾特机器人时,机器人会接收到消息并根据预设的逻辑进行处理和回复。钉钉机器人广泛应用于自动化办公、信息推送、智能问答等场景,能够帮助企业提高工作效率和协作体验。

(二)智谱 GLM-4-Flash

        GLM-4-Flash,智谱AI发布的矩阵模型。它能够生成高质量的文本内容,适用于多种自然语言处理任务,如文本生成、问答系统、文本摘要等。通过调用智谱 GLM-4-Flash 的 API 接口,我们可以将用户的输入传递给模型,并获取模型生成的回答内容,从而实现智能回复功能。

(三)内网穿透工具 cpolar

        内网穿透是一种技术,它允许外部网络访问内网中的服务。在本地开发环境中,我们通常处于内网,无法直接被钉钉服务器访问。因此,我们需要使用内网穿透工具 cpolar 来创建一个隧道,将本地端口映射到公网,使得钉钉服务器可以通过公网地址访问到本地运行的服务。

(四)需要准备的工具和环境

        在开始开发之前,我们需要准备以下工具和环境:

  • 钉钉开发者账号:注册钉钉开发者账号,用于创建机器人和获取 webhook token。
  • 智谱 GLM-4-Flash 账号:注册智谱平台账号,创建项目并获取 API 密钥。
  • 内网穿透工具 cpolar:下载并安装 cpolar 客户端,用于本地开发环境的内网穿透。
  • 天气 API 账号(可选):如果需要实现天气查询功能,可以注册天气 API 服务,获取用户 ID 和密钥。
  • Python 开发环境:安装 Python 环境(推荐 Python 3.8+),并安装必要的 Python 库。

二、钉钉机器人的创建与配置

注意:需要在有开发者权限的组织才可以进行下面步骤,若发现自己没有开发者权限请联系管理员或自行创建组织测试,本博客选择后者
在这里插入图片描述


步骤1:创建钉钉机器人

  1. 登录钉钉开发者后台:https://developers.dingtalk.com/。
  2. 在开发者后台的导航栏中找到“机器人”选项,点击进入机器人管理页面。
  3. 点击“创建应用”按钮,选择“自定义机器人”。
  4. 填写机器人名称(如“智能助手”)、描述(如“基于智谱 GLM-4-Flash 的智能回复机器人”)等基本信息。

在这里插入图片描述


步骤2:将机器人加入群聊

  1. 打开钉钉应用,进入你希望添加机器人的群聊。
  2. 点击群设置,找到“机器人”选项。
  3. 点击“添加机器人”,选择刚才创建的机器人。
  4. 确认添加后,机器人将自动加入群聊。
    在这里插入图片描述

完成创建后,会生成一个 webhook access_token,这是后续开发中与钉钉进行通信的关键凭证,务必妥善保存。
在这里插入图片描述


步骤3:配置服务器相关信息

  1. 访问 cpolar 官方网站(https://cpolar.com/),根据自己的操作系统下载并安装 cpolar 客户端。
  2. 打开 cpolar 客户端,登录账号。创建一个隧道,将本地端口(如 8080)映射到公网。
  3. 记录下 cpolar 提供的公网地址(如 http://your-public-address:8080)。
    在这里插入图片描述

  1. 配置钉钉服务器出口 IP:
  2. 在钉钉开发者后台的机器人开发管理设置页面,找到“消息接收地址”配置项。
  3. 将 cpolar 提供的公网 IP 地址填写到配置框中。
  4. 提示在这里有公网IP或者云服务器的也可以直接填入公网IP地址,这里做本地测试所以使用内网穿透展示
    在这里插入图片描述

三、开发环境准备

在开始开发智能钉钉机器人之前,我们需要确保开发环境已经搭建好,并安装了必要的依赖库。以下是详细的环境创建和依赖安装步骤:

(一) 本地开发环境搭建

步骤1:创建 Python环境

本博客为隔离开发环境,使用Anaconda 来管理 Python 环境,也推荐大家这样做。
Anaconda安装教程:https://blog.csdn.net/pdsu_Zhe/article/details/129432873

  1. 创建新的 Anaconda 环境
conda create -n dingtalk_bot python=3.10
  1. 激活环境:
conda activate dingtalk_bot

步骤2:安装必要的依赖库

在激活的环境中,使用 pip 安装以下依赖库:

  • requests:用于发送 HTTP 请求。
  • hmac、hashlib、base64:用于签名验证。
  • socket:用于创建服务器端口,接收钉钉发送的消息。
  • zhipuai:智谱 GLM-4-Flash 的 Python SDK,用于调用大模型。
pip install requests hmac hashlib base64 socket zhipuai

(二) 获取 API 密钥

1、智谱 GLM-4-Flash API 密钥

  • 访问智谱AI开放平台(https://bigmodel.cn/),注册账号并登录。
  • 在平台中创建一个项目,获取 API 密钥。
  • 将 API 密钥保存到本地,后续代码中会用到。

在这里插入图片描述

2、其他功能API密钥
由于博主在开发地震相关的,所以接入了中国地震台网的全球最新地震信息API,大家有需要的API可以自行搜索方法,这里不在讲述。


四、消息接收与处理

(一)接收钉钉消息

使用 Python 的 socket 模块创建一个服务器端口,监听钉钉发送的消息。

def handle_client(client_socket):request_data = client_socket.recv(20000)print(f"接收到的消息:{request_data}")client_socket.close()if __name__ == "__main__":server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(("", 8080))server_socket.listen(120)print("服务器启动,等待连接...")while True:client_socket, client_address = server_socket.accept()print(f"[{client_address}] 用户连接上了")handle_client(client_socket)

(二)解析消息内容

解析钉钉发送的消息,提取用户 ID、签名、时间戳和消息内容。

def getPost(request_data):request_data = str(request_data, encoding="utf8").split('\r\n')items = []for item in request_data[1:-2]:items.append(item.split(':'))post_useful = dict(items)post_mes = json.loads(request_data[-1])post_sign = post_useful.get('Sign').strip()post_timestamp = post_useful.get('Timestamp').strip()post_userid = post_mes.get('senderId').strip()post_mes = post_mes.get('text').get('content').strip()return post_userid, post_sign, post_timestamp, post_mes

(三)验证消息合法性


def initKey(post_userid, post_sign, post_timestamp, post_mes):app_secret = '你的app_secret'  # 替换为你的 app_secretstring_to_sign = f'{post_timestamp}\n{app_secret}'hmac_code = hmac.new(app_secret.encode('utf-8'), string_to_sign.encode('utf-8'), digestmod=hashlib.sha256).digest()sign = base64.b64encode(hmac_code).decode('utf-8')if post_sign == sign:print("消息验证通过")return Trueelse:print("消息验证失败")return False

五、调用大模型生成答案

(一)处理用户指令

根据用户发送的消息内容,调用相应的处理逻辑。

from zhipuai import ZhipuAIclient = ZhipuAI(api_key="你的GLM_API_KEY")  # 替换为你的智谱 API 密钥def selectMes(post_userid, post_mes):if post_mes == "地震播报":earthquake_data = "地震等级: 5.0, 地震时间: 2025-03-09 10:00, 位置: 四川省"  # 替换为实际的地震数据获取逻辑response = client.chat.completions.create(model="glm-4-flash",messages=[{"role": "system", "content": "生成地震播报文本"},{"role": "user", "content": earthquake_data}])answer = response.choices[0].message.contentelif "天气" in post_mes:province, place = "四川", "成都"  # 替换为实际的省份和地点提取逻辑weather_data = f"{province} {place} 的天气数据"  # 替换为实际的天气数据获取逻辑response = client.chat.completions.create(model="glm-4-flash",messages=[{"role": "system", "content": "生成天气预报文本"},{"role": "user", "content": weather_data}])answer = response.choices[0].message.contentelse:response = client.chat.completions.create(model="glm-4-flash",messages=[{"role": "system", "content": "你是一个智能助手,能够回答各种问题。"},{"role": "user", "content": post_mes}])answer = response.choices[0].message.contentreturn sendText(post_userid, answer)

(二)发送回复消息

import requests
import jsondef sendText(post_userid, send_mes):webhook = "https://oapi.dingtalk.com/robot/send?access_token=你的token"  # 替换为你的钉钉 webhook tokenheader = {"Content-Type": "application/json", "Charset": "UTF-8"}message_json = json.dumps({"msgtype": "text","text": {"content": send_mes},"at": {"atDingtalkIds": [post_userid],"isAtAll": False}})response = requests.post(url=webhook, data=message_json, headers=header)if response.status_code == 200:print("消息发送成功")else:print("消息发送失败")

六、运行与测试

(一)本地运行

启动本地服务器,确保机器人能够正常接收和处理消息。运行以下代码:

if __name__ == "__main__":server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(("", 8080))server_socket.listen(120)print("服务器启动,等待连接...")while True:client_socket, client_address = server_socket.accept()print(f"[{client_address}] 用户连接上了")handle_client(client_socket)

该代码启动一个监听 8080 端口的服务器,等待钉钉发送的消息。

测试机器人功能:
在钉钉群聊中艾特机器人,测试不同指令的响应情况。例如:

艾特机器人并发送“地震播报”

在这里插入图片描述

艾特机器人并发送“北京天气”

在这里插入图片描述

艾特机器人并询问问题

在这里插入图片描述


总结

通过本文的介绍,我们从零开始打造了一个智能钉钉机器人,实现了调用智谱 GLM-4-Flash API 来生成智能回复的全过程。这个机器人可以根据用户的指令,自动获取地震数据、天气信息,并生成相应的播报内容,极大地提高了办公效率和协作体验。


附录

这里只提供大模型智能回复代码,若需其他功能的相关逻辑代码,可以联系我交流学习。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: Richard Zhang
@time: 2025/3/7 19:55 
@file: DingTalk.py
@describe: TODO
"""
# -*- coding: GBK -*-
import requests
import json
import time
import hmac
import hashlib
import base64
import socket
from multiprocessing import Process
from zhipuai import ZhipuAI# 配置
GLM_API_KEY = "your_api_key"  # 替换为你的智谱GLM-4-Flash API密钥# 初始化智谱GLM-4-Flash客户端
client = ZhipuAI(api_key=GLM_API_KEY)
model_name = "glm-4-flash"  # 模型名称def handle_client(client_socket):# 获取socketrequest_data = client_socket.recv(20000)post_userid, post_sign, post_timestamp, post_mes = getPost(request_data)# 回应socketinitKey(post_userid, post_sign, post_timestamp, post_mes)# 关闭socketclient_socket.close()def getPost(request_data):request_data = str(request_data, encoding="utf8").split('\r\n')items = []for item in request_data[1:-2]:items.append(item.split(':'))post_useful = dict(items)post_mes = json.loads(request_data[-1])post_sign = post_useful.get('Sign').strip()post_timestamp = post_useful.get('Timestamp').strip()post_userid = post_mes.get('senderId').strip()post_mes = post_mes.get('text').get('content').strip()return post_userid, post_sign, post_timestamp, post_mesdef initKey(post_userid, post_sign, post_timestamp, post_mes):whtoken = "your_webhook_token" # 替换为你的webhook_tokentimestamp = str(round(time.time() * 1000))app_secret = 'your_app_secret' # 替换为你的app_secretapp_secret_enc = app_secret.encode('utf-8')string_to_sign = '{}\n{}'.format(post_timestamp, app_secret)string_to_sign_enc = string_to_sign.encode('utf-8')hmac_code = hmac.new(app_secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()sign = base64.b64encode(hmac_code).decode('utf-8')if (abs(int(post_timestamp) - int(timestamp)) < 3600000 and post_sign == sign):webhook = "https://oapi.dingtalk.com/robot/send?access_token=" + whtoken + "&timestamp=" + timestamp + "&sign=" + signheader = {"Content-Type": "application/json", "Charset": "UTF-8"}message_json = json.dumps(selectMes(post_userid, post_mes))info = requests.post(url=webhook, data=message_json, headers=header)print(info)else:print("Warning:Not DingDing's post")def selectMes(post_userid, post_mes):# 将用户输入传递给大模型生成回答response = client.chat.completions.create(model=model_name,messages=[{"role": "system", "content": "你是一个智能助手,能够回答各种问题。"},{"role": "user", "content": post_mes}])answer = response.choices[0].message.content# 返回文本消息return sendText(post_userid, answer)def sendText(post_userid, send_mes):message = {"msgtype": "text","text": {"content": send_mes},"at": {"atDingtalkIds": [post_userid],"isAtAll": False}}return messageif __name__ == "__main__":server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(("", 8080))server_socket.listen(120)while True:client_socket, client_address = server_socket.accept()print("[%s, %s]用户连接上了" % client_address)handle_client_process = Process(target=handle_client, args=(client_socket,))handle_client_process.start()client_socket.close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/32139.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react基础语法视图层类组件

react基础语法视图层&类组件 MVVM *区别mvc&mvvm 两者的区别&#xff1a; 数据模型去渲染视图。数据层改了&#xff0c;vue自己会监听到帮我们拿最新的数据去渲染视图&#xff1b;构建数据构建视图&#xff0c;数据驱动的思想。这一套是非常相似的。 视图中的内容改变&…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 arrList 类中仍然是受保护成员。 { …

Docker容器与宿主机目录映射深度解析

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 一、Docker容器与宿主机目录映射基础原理 在深入了解如何查询 Docker 容器目录在宿主机的映射目录之前&#xff0c;有必要先明晰其背后的基础原理。Docker 容器通过挂载&#xff08;mount&#xff09;机制将宿主机的…

p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳

向 豆包 提问&#xff1a;编写一个 p5.js 脚本&#xff0c;模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转&#xff0c;并显示透明的轮廓线。请确保实现适当的碰撞检测&#xff0c;使小球保持在球体内部。 cd p5-demo copy…

javascript-es6 (六)

编程思想 面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了 就是按照我们分析好了的步骤&#xff0c;按照步骤解决问题 面向对象 面向对象是把事务分解成为一个个对象&…

Linux第0节:Linux环境的搭建

一、Linux 环境的搭建方式 搭建方式主要有三种&#xff1a; 直接安装在物理机上。但是由于 Linux 桌面使用起来非常不友好&#xff08;不推荐&#xff09;。使用虚拟机软件, 将 Linux 搭建在虚拟机上。但是由于当前的虚拟机软件(如 VMWare 之类的)存在一些 bug , 会导致环境上…

计算机网络:计算机网络的概念

1.计算机网络&#xff1a;由若干个结点和链接这些的链路组成。 2.集线器&#xff08;Hub&#xff09;&#xff1a;可以把多个结点连接起来&#xff0c;组成一个计算机网络。 不能避免数据冲突的情况 3.交换机&#xff08;Switch&#xff09;:可以把多个结点连接起来&#x…

mysql的锁-->一篇读懂所有锁机制

目录 mysql的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…

Vue 实现智能检测文字是否溢出,溢出显示省略号,鼠标悬浮显示全部【附封装组件完整代码+详细注释+粘贴即食】

一、场景需求 在项目中&#xff0c;经常会遇到文本内容超出容器的情况。为了提高用户体验&#xff0c;我希望在文字溢出时显示悬浮提示&#xff0c;未溢出时则不显示。 二、效果演示 三、实现原理 DOM宽度对比法&#xff1a;通过比较元素的scrollWidth&#xff08;实际内容宽…

用Deepseek写一个 HTML 和 JavaScript 实现一个简单的飞机游戏

大家好&#xff01;今天我将分享如何使用 HTML 和 JavaScript 编写一个简单的飞机游戏。这个游戏的核心功能包括&#xff1a;控制飞机移动、发射子弹、敌机生成、碰撞检测和得分统计。代码简洁易懂&#xff0c;适合初学者学习和实践。 游戏功能概述 玩家控制&#xff1a;使用键…

《Spring日志整合与注入技术:从入门到精通》

1.Spring与日志框架的整合 1.Spring与日志框架进行整合&#xff0c;日志框架就可以在控制台中&#xff0c;输出Spring框架运行过程中的一些重要的信息。 好处&#xff1a;方便了解Spring框架的运行过程&#xff0c;利于程序的调试。 Spring如何整合日志框架 Spring5.x整合log4j…

关于mybatis查询时,时间字段的映射问题

目录 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 1.2 datetime 2.mybatis从mysql数据库查询出上述两种类型的字段后&#xff0c;映射到Java实体类时的问题 3.结语 1.mysql中&#xff0c;关于时间的两种类型 1.1 date 格式&#xff1a;2002-09-23 特点&#xff1a…

高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架

一、背景 在快节奏的开发周期中&#xff0c;如何确保接口质量&#xff1f;自动化测试是关键。通过构建标准化、可复用的测试框架&#xff0c;能显著提升测试效率与准确性&#xff0c;为项目质量保驾护航[1][7]。 二、目标 ✅ 核心目标&#xff1a; ● 实现快速、高效的接口测试…

【鸿蒙开发】MongoDB入门

https://www.mongodb.com/try/download/community 下载MongoDB: var mongoose require("mongoose");// localhost 域名&#xff0c;代表本机 // 127.0.0.1 ip , 代码本机 mongoose.connect("mongodb://localhost:27017/jiaju").then(() > {console.l…

Linux中的TCP编程接口基本使用

TCP编程接口基本使用 本篇介绍 在UDP编程接口基本使用已经介绍过UDP编程相关的接口&#xff0c;本篇开始介绍TCP编程相关的接口。有了UDP编程的基础&#xff0c;理解TCP相关的接口会更加容易&#xff0c;下面将按照两个方向使用TCP编程接口&#xff1a; 基本使用TCP编程接口…

wireshark 如何关闭混杂模式 wireshark操作

Fiddler和Wireshark都是进行抓包的工具&#xff1a;所谓抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&#xff0c;也用来检查网络安全。抓包也经常被用来进行数据截取等。黑客常常会用抓包软件获取你非加密的上网数据&#xff0c;然后通过分析&#…

IDEA2024又一坑:连接Docker服务连不上,提示:Cannot run program “docker“: CreateProcess error=2

为新电脑安装了IDEA2024版&#xff0c;因为局域网中安装有Docker,所以这台电脑上没有安装&#xff0c;当运行时发现死活连不上Docker报&#xff1a;Cannot run program “docker“: CreateProcess error2 分析&#xff1a; Docker服务有问题 其它电脑都能连&#xff0c;排除 网…

文件包含漏洞第一关

一、什么是文件包含漏洞 1.文件包含漏洞概述 和SQL注入等攻击方式一样&#xff0c;文件包含漏洞也是一种注入型漏洞&#xff0c;其本质就是输入一段用户能够控制的脚本或者代码&#xff0c;并让服务端执行。 什么叫包含呢&#xff1f;以PHP为例&#xff0c;我们常常把可重复使…

网络安全事件响应--应急响应(windows)

应用系统日志 Windows主要有以下三类日志记录系统事件&#xff1a;应用程序日志、系统日志和安全日志。 系统和应用程序日志存储着故障排除信息&#xff0c;对于系统管理员更为有用。安全日志记录着事件审计信息&#xff0c;包括用户验证&#xff08;登录、远程访问等&#x…

C++蓝桥杯基础篇(九)

片头 嗨&#xff01;小伙伴们&#xff0c;大家好~ 今天我们将学习蓝桥杯基础篇&#xff08;十&#xff09;&#xff0c;学习函数相关知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、函数基础 一个典型的函数定义包括以下部分&#xff1a;返回类型、函数名…