1.钉钉账号
2.公网域名
3.后端代码
4.钉钉开放文档及sdk依赖
1.钉钉账号>>创建一个企业>>创建企业内机器人
自定义机器人只支持广播(纯发消息),对话需要企业内机器人;
钉钉创建企业就像拉群差不多,没有什么限制条件,起个名字就行。已经在企业中的用户也可以自由加入别的企业,不冲突。
2.支持HTTP的域名
这块小白比较难理解,并不是买了一个域名就ok了,后续后端的所有服务是要在这里的,我使用的是花生壳映射。
参照这个教程【花生壳:将内网端口映射到外网】
到这里都是免费的哈,不需要买域名。花生壳的限制就是免费的网速和映射数量有限,测试用用还行,正经跑服务还得想别的招。后续有条件的话准备上云吧。
3.后端代码
框架看的是b站的课程,参考【Python 从0快速制作Web服务器】01-课程介绍、web服务器的介绍_哔哩哔哩_bilibili
这个监听代码写好后,关掉测试花生壳时候使用的TCP工具,将对应内网端口写好,先把后端服务跑起来,然后用花生壳客户端检查一下隧道是否打通,再把公网地址贴到钉钉后台消息接收地址去,收到HTTP/1.1 200 OK之后这个页面就可以保存了。
4.钉钉开放文档及sdk依赖
参考钉钉官方文档,申请想要的业务功能的权限,比如说单聊收发消息这种。
下载sdk依赖。
# 按照官方提示 安装
pip install alibabacloud_dingtalk
主程序,是在监听代码里加的,后续还需要完善定时任务的模块,因为token会过期。协程啥的我不会,所以还没写。
import socket, json, sys, random, re
# 这些大家都熟悉
from typing import List
from alibabacloud_dingtalk.robot_1_0.client import Client as dingtalkrobot_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.robot_1_0 import models as dingtalkrobot__1__0_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
# 这部分是钉钉sdk提供的,需要pip下载后使用
from getAccessToken import Sample as Geter
# 这部分是单独写的,见下一个代码块
reply_rand=[
'家人们谁懂啊~~~',
'没关系,又活了一天',
'美好的一天从比奇堡开始',
'多喝热水',
'沉浸式体验人工智障陪你办公'
] # 随机回复的语句库
def main():
# 1 创建套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 绑定本地端口
server_socket.bind(("", 1111)) # 传入元组,第一个值为空串,代表本机ip,第二个值为本机端口号
# 3 变为监听套接字
server_socket.listen(128)
while True:
# 4 等待对方链接
son_socket, son_addr = server_socket.accept()
# 4.1 接收数据
request = son_socket.recv(1024).decode("utf-8")
print(request)
if request.find("senderStaffId") != -1:
request_cont = re.search(r"{\"conversationId\".*.\"text\"}", request).group() # 正则 我不懂
message = json.loads(request_cont)
user_ids = [message["senderStaffId"]] # 提取用户的id,以便给他回复
words = random.choice(reply_rand)
print(words)
Sample.main(sys.argv[1:], words=words, user_ids=user_ids,token=token)
# 4.2 解析、提取文件 不管用户传什么,都返回一个hello
# 4.3 读取文件数据
response_header = "HTTP/1.1 200 OK\r\n"
response_header += "\r\n"
response_body = "hello"
response = response_header + response_body
# 4.4 返回给浏览器
son_socket.send(response.encode("utf-8"))
# 4.5 关闭套接字 注意只关子套接字
son_socket.close()
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> dingtalkrobot_1_0Client:
"""
使用 Token 初始化账号Client
@return: Client
@throws Exception
"""
config = open_api_models.Config()
config.protocol = 'https'
config.region_id = 'central'
return dingtalkrobot_1_0Client(config)
def main(
args: List[str], words, user_ids,token,
) -> None:
client = Sample.create_client()
batch_send_otoheaders = dingtalkrobot__1__0_models.BatchSendOTOHeaders()
batch_send_otoheaders.x_acs_dingtalk_access_token = token
batch_send_otorequest = dingtalkrobot__1__0_models.BatchSendOTORequest(
msg_param='{ "content": "%s" }' %words,
msg_key='sampleText', # 回复文本类型的消息,都写这个
robot_code='XXXXXXXXXX', # 每个机器人(应用)不一样,需要自己抓一个请求看一下,贴出来就行
user_ids=user_ids # 即便只有1个也要以列表传入,此处是根据用户发消息来,谁发的给谁回复
)
try:
client.batch_send_otowith_options(batch_send_otorequest, batch_send_otoheaders,
util_models.RuntimeOptions())
except Exception as err:
if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
print(err)
pass
if __name__ == '__main__':
token_response = Geter.main(sys.argv[1:])
token = getattr(getattr(token_response, 'body'), 'access_token') # 回来的数据类型比较奇怪,我看不懂,找了半天怎么取值,哪位大佬有更好看的写法请一定告诉我。。。
main()
以上部分是填好对应参数,到时候run起来的。
下一部分是以导包形式引入的。这个是官方的示例代码几乎未做修改,
import sys
from typing import List
from alibabacloud_dingtalk.oauth2_1_0.client import Client as dingtalkoauth2_1_0Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_dingtalk.oauth2_1_0 import models as dingtalkoauth_2__1__0_models
from alibabacloud_tea_util.client import Client as UtilClient
class Sample:
def __init__(self):
pass
@staticmethod
def create_client() -> dingtalkoauth2_1_0Client:
"""
使用 Token 初始化账号Client
@return: Client
@throws Exception
"""
config = open_api_models.Config()
config.protocol = 'https'
config.region_id = 'central'
return dingtalkoauth2_1_0Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client()
get_access_token_request = dingtalkoauth_2__1__0_models.GetAccessTokenRequest(
app_key='XXXXXXXX',
app_secret='YYYYYYYYYY' # 申请应用后,去后台贴一下
)
try:
a = client.get_access_token(get_access_token_request)
return a
except Exception as err:
if not UtilClient.empty(err.code) and not UtilClient.empty(err.message):
# err 中含有 code 和 message 属性,可帮助开发定位问题
# 不知道哪报错了就在这print一下,钉钉服务器给的回复都很详细
pass
if __name__ == '__main__':
a = Sample.main(sys.argv[1:])
print(a) # 测试用的
以上就是100行以内代码搞定钉钉自动回复机器人部署的全部内容。
主要都是复制粘贴的,原创代码不到10行哈哈哈。
感谢大家喜欢,我继续学习。