1、本次学习用到的模块

1、requests(http 请求库)
2、datatime
3、json 模块
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它是JavaScript的子集,易于人阅读和编写。

JSON用来存储和交换文本信息,比xml更小/更快/更易解析,易于读写,占用带宽小,网络传输速度快的特性,适用于数据量大,不要求保留原有类型的情况。。

前端和后端进行数据交互,其实就是JS和Python进行数据交互!

2、http请求方法get()和post()

http请求服务分为get 和 post ,get用于向服务器发送数据请求,而post用于将数据发送给服务器进行操作(get常用于向服务器请求数据,post常用于提交数据给服务器处理)

3、使用自定义的机器人发送消息

我需要搞清楚的是python操作钉钉机器人发消息的整体逻辑:
首先创建一个机器人,获取机器人的webhook(一个API里面的参数,类似访问权限)
然后根据不同的消息格式定义不同的字典
最后借助requests库中的post函数和josn模块中的dump方法对数据进行格式变更,将相应的消息通过钉钉机器人传到了聊天框中。

因为个人隐私问题,webhook在代码运行过后我将其设置为空,运行结果为webhook清空前的运行结果

3.1 发送text消息

代码:

import requests
import json
import datetime

def send_msg(token_dd, date_str, msg, at_all=False):
    """
    通过钉钉机器人发送内容
    @param date_str:
    @param msg:
    @param at_all:
    @return:
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    content_str = "{0}定时推送:\n\n{1}\n".format(date_str, msg)
    
    data = {
        "msgtype": "text",
        "text": {
            "content": content_str
        },
        "at": {
            "isAtAll": at_all
        },
    }
    res = requests.post(url, data=json.dumps(data), headers=headers)#直接一句post就可以实现通过机器人在群聊里发消息
    # print(res.text)
    
    # return res.text

if __name__ == '__main__':
    token_dd = ''
    note_str = "DataWhale自动化组队学习中..."
    date_str = datetime.datetime.now().strftime('%H:%M')
    send_msg(token_dd, date_str, note_str, True)

运行结果:
在这里插入图片描述

3.2 发送link消息

代码:

import requests
import json
import datetime

def send_msg(token_dd, date_str, note_str, at_all=False):
    """
    通过钉钉机器人发送内容
    @param date_str:
    @return:
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    content_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
    
    data = {
        "msgtype": "link",
        "link": {
            "title": content_str,
            "text": "Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习。Datawhale发展于2018年12月6日。团队成员规模也在不断扩大,有来自双非院校的优秀同学,也有来自上交、武大、清华等名校的小伙伴,同时也有来自微软、字节、百度等企业的工程师。我们将一群有能力有想法的理想青年们集结在一起,共同改善学习的模式。在这里,我们没有标签。如果你是小白,我们将为你提供学习和改变的机会,如果你是优秀的学习者,我们将向你提供提升和发展的平台。",
            "picUrl": "https://www.keaidian.com/uploads/allimg/190424/24110307_8.jpg",
            "messageUrl": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
        }
    }
    res = requests.post(url, data=json.dumps(data), headers=headers)
    print(res.text)
    
    return res.text

if __name__ == '__main__':
    token_dd = ''
    note_str = "DataWhale自动化组队学习中..."
    date_str = datetime.datetime.now().strftime('%H:%M')
    send_msg(token_dd, date_str, note_str, True)

运行结果:
在这里插入图片描述

3.3 发送markdown格式消息

代码:

import requests
import json
import datetime

def send_msg(token_dd, date_str, at_all):
    """
    通过钉钉机器人发送内容
    @param date_str:
    @param at_all:
    @return:
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
    
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": title_str,
            "text": "### Datawhale \n > Datawhale是一个专"\
            "注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习。\n\n > Datawhale发展于**2018年12月6日**。团队成员规模也在不断扩大,有来自双非院校的优秀同学,也有来自上交、武大、清华等名校的小伙伴,同时也有来自微软、字节、百度等企业的工程师。\n\n > 我们将一群有能力有想法的理想青年们集结在一起,共同改善学习的模式。**在这里,我们没有标签**。如果你是小白,我们将为你提供学习和改变的机会,如果你是优秀的学习者,我们将向你提供提升和发展的平台。",
        },
        "at": {
            "isAtAll": at_all
        }
    }
    
    res = requests.post(url, data=json.dumps(data), headers=headers)
    print(res.text)
    
    return res.text


if __name__ == '__main__':
    token_dd = ''
    date_str = datetime.datetime.now().strftime('%H:%M')
    send_msg(token_dd, date_str, at_all=True)

运行结果:
在这里插入图片描述

3.4 发送整体跳转ActionCard格式消息

代码:

import requests
import json
import datetime

def send_msg(token_dd, date_str):
    """
    通过钉钉机器人发送内容
    @param date_str:
    @return:
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd#webhook
    headers = {'Content-Type': 'application/json;charset=utf-8'}#网页头,防止服务器认为你在爬虫
    title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
    
    data = {
        "msgtype": "actionCard",#整体跳转
        "actionCard": {
            "title": title_str,
            "text": "### Datawhale \n > Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习...",
            "btnOrientation": "0",
            "singleTitle": "哈哈哈哈哈哈阅读全文哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈",
            "singleURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
        }
    }
    
    res = requests.post(url, data=json.dumps(data), headers=headers)
    print(res.text)
    
    return res.text

if __name__ == '__main__':
    token_dd = ''
    date_str = datetime.datetime.now().strftime('%H:%M')
    send_msg(token_dd, date_str)

运行结果:
在这里插入图片描述

3.5 发送独立跳转ActionCard格式消息

代码:

import requests
import json
import datetime

def send_msg(token_dd, date_str):
    """
    通过钉钉机器人发送内容
    @param date_str:
    @return:
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    title_str = "{0}定时推送:\n\n{1}\n".format(date_str, "Datawhale和学习者一起成长")
    
    data = {
        "msgtype": "actionCard",
        "actionCard": {
            "text": "### Datawhale \n > Datawhale是一个专注于AI领域的开源组织,致力于构建一个纯粹的学习圈子,帮助学习者更好地成长。我们专注于机器学习,深度学习,编程和数学等AI领域内容的产出与学习...",
            "title": title_str,
            "btnOrientation": "0",
            "btns": [
                {
                    "title": "阅读全文1",
                    "actionURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
                },
                {
                    "title": "阅读全文2",
                    "actionURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1"
                }
            ]
        }
    }
    
    res = requests.post(url, data=json.dumps(data), headers=headers)
    print(res.text)
    
    return res.text

if __name__ == '__main__':
    token_dd = ''
    date_str = datetime.datetime.now().strftime('%H:%M')
    send_msg(token_dd, date_str)

运行结果:
在这里插入图片描述

3.6 发送feedCard格式消息

我理解为带图片的ActionCard消息
代码:

import requests
import json
import datetime

def send_msg(token_dd):
    """
    通过钉钉机器人发送内容
    """
    url = 'https://oapi.dingtalk.com/robot/send?access_token=' + token_dd
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    title_str = "定时推送:\n\n{0}\n".format("Datawhale和学习者一起成长1")

    data = {
        "msgtype": "feedCard",
        "feedCard": {
            "links": [{
                    "title": title_str,
                    "messageURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1",
                    "picURL": "https://camo.githubusercontent.com/442350f57282653c563b8c6181f561452b6258632dc79d8a5298b724a37a42f7/68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f65366339643234656c793168316f69646f617469716a3231313030753061626e2e6a7067"
                }, {
                    "title": "Datawhale和学习者一起成长2",
                    "messageURL": "https://linklearner.com/datawhale-homepage/index.html#/article/1",
                    "picURL": "https://camo.githubusercontent.com/442350f57282653c563b8c6181f561452b6258632dc79d8a5298b724a37a42f7/68747470733a2f2f747661312e73696e61696d672e636e2f6c617267652f65366339643234656c793168316f69646f617469716a3231313030753061626e2e6a7067"
                }
            ]
        }
    }
    
    res = requests.post(url, data=json.dumps(data), headers=headers)
    print(res.text)
    
    return res.text

if __name__ == '__main__':
    token_dd = ''
    send_msg(token_dd)

运行结果:
在这里插入图片描述

4、后记

1、 本次学习,借助http请求库requests,时间的设置模块datatime以及数据格式转换的库json,实现了python操作钉钉机器人实现对text,link,markdown,ActionCard,feedCard格式消息的发送,实用性非常强。
2、本次学习的整体的实现逻辑是:在钉钉app里面创建群聊,然后创建群聊机器人并获取webhook编码,这个编码用来实现操作钉钉群的接口。然后借助requests中的post方法向服务器发送数据并由服务器操作数据,并通过json中的dump方法实现数据格式的转化,最终实现我们看到的界面。
3、 与上次任务的爬虫相类似,里面也有网页头的设置,另外,爬虫用到了requests库中的get()方法,而本次课程用到的是requests()中的post()方法,要进行相应的对比与总结。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐