python开发钉钉机器人|(1)上线发布、自动回复

准备工作

1.钉钉账号

2.公网域名

3.后端代码

4.钉钉开放文档及sdk依赖

python开发钉钉机器人|(1)上线发布、自动回复_第1张图片

 

正文

1.钉钉账号>>创建一个企业>>创建企业内机器人

自定义机器人只支持广播(纯发消息),对话需要企业内机器人;

钉钉创建企业就像拉群差不多,没有什么限制条件,起个名字就行。已经在企业中的用户也可以自由加入别的企业,不冲突。

2.支持HTTP的域名

这块小白比较难理解,并不是买了一个域名就ok了,后续后端的所有服务是要在这里的,我使用的是花生壳映射。

参照这个教程【花生壳:将内网端口映射到外网】

到这里都是免费的哈,不需要买域名。花生壳的限制就是免费的网速和映射数量有限,测试用用还行,正经跑服务还得想别的招。后续有条件的话准备上云吧。

python开发钉钉机器人|(1)上线发布、自动回复_第2张图片

 

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行哈哈哈。

感谢大家喜欢,我继续学习。

你可能感兴趣的:(python,钉钉,机器人)