相关文章和数据源:

python自动化高效办公第二期,带你项目实战【一】{excel数据处理、批量化生成word模板、pdf和ppt等自动化操作}


Python自动化办公--Pandas玩转Excel【一】

Python自动化办公--Pandas玩转Excel数据分析【二】

Python自动化办公--Pandas玩转Excel数据分析【三】


python处理Excel实现自动化办公教学(含实战)【一】

python处理Excel实现自动化办公教学(含实战)【二】

python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】


python入门之后须掌握的知识点(模块化编程、时间模块)【一】

python入门之后须掌握的知识点(excel文件处理+邮件发送+实战:批量化发工资条)【二】


spandas玩转excel码源.zip-数据挖掘文档类资源-CSDN下载

Python自动化办公(2021最新版!有源代码,).zip-

Python自动化办公(可能是B站内容最全的!有源代码,).zip-

上面是对应码源,图方便的话可以直接下载都分类分好了,当然也可以看文章。


1.数据可视化

参考上面pandas文章即可

2.python发送邮件

2.1 发送普通邮件

  1. import smtplib
  2. from smtplib import SMTP_SSL
  3. from email.mime.text import MIMEText
  4. from email.mime.multipart import MIMEMultipart
  5. from email.header import Header
  6. host_server = 'smtp.sina.com' #新浪邮箱smtp服务器
  7. sender_sina = 'your_email@sina.com' #发件人邮箱
  8. pwd = 'your_pwd' #密码
  9. sender_sina_mail = 'your_email@sina.com' #发件人邮箱
  10. receiver = 'others_email@sina.com' #收件人邮箱
  11. mail_title = '这是标题'
  12. mail_content = '这是正文'
  13. msg = MIMEMultipart() #邮件主题
  14. msg['Subject'] = Header(mail_title, 'utf-8') #邮件主题
  15. msg['From'] = sender_sina_mail
  16. msg['To'] = Header('mail_title', 'utf-8')
  17. msg.attach(MIMEText(mail_content, 'plain', 'utf-8')) #邮件正文
  18. smtp = SMTP_SSL(host_server) #ssl登录
  19. smtp.login(sender_sina,pwd)
  20. smtp.sendmail(sender_sina_mail,receiver,msg.as_string())
  21. smtp.quit()

2.2.发送带附件邮件

  1. import smtplib
  2. from smtplib import SMTP_SSL
  3. from email.mime.text import MIMEText
  4. from email.mime.multipart import MIMEMultipart
  5. from email.mime.application import MIMEApplication
  6. from email.header import Header
  7. host_server = 'smtp.sina.com'
  8. sender_sina = 'your_email@sina.com'
  9. pwd = 'your_pwd'
  10. sender_sina_mail = 'your_email@sina.com'
  11. receiver = 'others_email@sina.com'
  12. mail_title = '这是标题'
  13. mail_content = '这是正文'
  14. msg = MIMEMultipart()
  15. msg['Subject'] = Header(mail_title, 'utf-8')
  16. msg['From'] = sender_sina_mail
  17. msg['To'] = Header('mail_title', 'utf-8')
  18. msg.attach(MIMEText(mail_content, 'html', 'utf-8')) #html格式
  19. # 添加附件
  20. attachment = MIMEApplication(open('student.xls', 'rb').read())
  21. attachment.add_header('Content-Disposition', 'attachment', filename='student.xls')
  22. msg.attach(attachment)
  23. try:
  24. smtp = SMTP_SSL(host_server)
  25. smtp.set_debuglevel(1) #0关闭 1开启
  26. smtp.ehlo(host_server) #和服务器确定状态
  27. smtp.login(sender_sina, pwd)
  28. smtp.sendmail(sender_sina_mail, receiver, msg.as_string())
  29. smtp.quit()
  30. print('success')
  31. except smtplib.SMTPException:
  32. print('error')

2.3 利用zmail接受邮件

安装

  1. pip install zmail
  1. import zmail
  2. server = zmail. server(' pythonauto@sina.com', ' python1234' )
  3. mail = server.get_ latest()
  4. zmail.show(mail)
  5. zmail.show(mail["subject"])#只取标题

2.4 计划任务进行邮箱监控

2.4.1 windows下计划任务设置

首先我们可以同级目录下建一个run.text文档,然后输入:main.py

然后后缀名改掉改成bat

然后在windows下搜索计划任务

新建一个任务库:python

创建一个任务:

新建一个触发器:

操作:添加脚本

之后只需要等待即可。时间到了就会执行main.py

2.4.2计划任务监控邮箱

通过id判断邮件数量:

同级目录:新建一个id的text:写入当前邮件id

定时执行上述文件方法相同。

3.打造python聊天机器人(基于微信、钉钉)

3.1 API调用教学

BAT开源很多的,

以百度云为例:

API商城_API_API接口大全_API一站式采购基地百度智能云API商城-API一站式采购基地,API商城提供天气查询API、实名认证API、短信验证码、OCR识别等海量API服务。选购API服务,首选百度智能云API商城。https://apis.baidu.com/

选择一个API然后购买【天气预报为例】

API参数以及使用指南官网也有给出教程

购买完成之后可以在买家中心的管理控制台中找到这个订单。

基本信息中有个AppCode,点击显示秘钥能看的到了。

然后去调试

我们也可以进入这个页面中调试,headers的写法相同。

结果如下:

在本地运行就是:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import requests
  4. # 天气查询-按地名 Python示例代码
  5. if __name__ == '__main__':
  6. url = 'https://weatherquery.api.bdymkt.com/weather/query/by-area'
  7. params = {}
  8. params['area'] = '杭州'
  9. params['areaId'] = ''
  10. headers = {
  11. 'Content-Type': 'application/json;charset=UTF-8',
  12. 'X-Bce-Signature': 'AppCode/你的appcode'
  13. }
  14. r = requests.request("POST", url, params=params, headers=headers)
  15. print(r.content)

其余的api调用同理。

3.2 python微信自动化

3.2.1 采坑

安装库:

  1. pip install itchat
  1. import itchat
  2. itchat.auto_login(enableCmdQR=True)

运行程序:在vscode会得到下面的图,一个不完整的二维码

之后我们去相应文件夹,cmd进入环境,运行我们创建的文件即可:

python main.py

登录后报错:

xml.parsers.expat.ExpatError: mismatched tag: line 63, column 4

搜了一下解决方案:

问题解决:xml.parsers.expat.ExpatError: mismatched tag: line 63, column 4(itchat)_此杭非彼航的博客-CSDN博客文章目录问题描述相关代码尝试解决(暂未解决)总结问题描述通过itchat生成二维码扫码后报错Traceback (most recent call last): File "itchat_app.py", line 59, in <module> itchat.auto_login(hotReload=True, enableCmdQR=2, statusStorageDir='./logs/loginInfo.pkl') File "c:\anaconda3\envshttps://blog.csdn.net/ljhsq/article/details/122756196

  1. <p class="msg-desc">由于安全原因,此微信号不能使用网页版微信。
  2. 你可以前往微信官网 https://weixin.qq.com/ 下载客户端登录。</p>

个人建议:不要把时间浪费到itchat上了,itchat-uos我下了也不行,建议直接换个方法。

3.2.2 wxpy部分人可用

参考文章:

从零开始微信机器人(二):使用图灵机器人和api.ai相关接口 - 简书

主页有其余四篇文章介绍微信机器人

gg网页版的都不行,下面知乎有位做的不错的这里推荐一下:

基于hook的python机器人,彻底取代itchat - 知乎本文档部分由itchat与wxpy的开发文档修改得出 https://github.com/smallevilbeast/wechat_pc_api已经有人做了更好的机器人,本文停更 本文链接: https://zhuanlan.zhihu.com/p/114214846 禁止不规范转载WechatBot…https://zhuanlan.zhihu.com/p/114214846

m微信机器人码源,

wxpy简单程序我还是提供一下:

  • 获取好友地理位置
  1. # pip install wxpy
  2. from wxpy import *
  3. # 初始化一个机器人对象
  4. # cache_path缓存路径,给定值为第一次登录生成的缓存文件路径
  5. # bot = Bot()
  6. bot = Bot(console_qr=-2, cache_path=True) # 移植到linux,console_qr设置True和2都无法扫描登录,设置-2之后正常登录。
  7. # 获取好友列表(包括自己)
  8. my_friends = bot.friends(update=False)
  9. '''
  10. stats_text 函数:帮助我们简单统计微信好友基本信息
  11. 简单的统计结果的文本
  12. :param total: 总体数量
  13. :param sex: 性别分布
  14. :param top_provinces: 省份分布
  15. :param top_cities: 城市分布
  16. :return: 统计结果文本
  17. '''
  18. print(my_friends.stats_text())
  • 获取好友头像

  1. from wxpy import *
  2. import os,sys
  3. # 初始化机器人,扫码登陆微信,适用于Windows系统
  4. bot = Bot()
  5. # # Linux系统,执行登陆请调用下面的这句
  6. # bot = Bot(console_qr=2, cache_path="botoo.pkl"
  7. # 获取当前路径信息
  8. image_dir = os.getcwd()+'\\' + "FriendImgs\\"
  9. # 如果保存头像的FriendImgs目录不存在就创建一个
  10. if not os.path.exists(image_dir):
  11. os.mkdir(image_dir)
  12. os.popen('explorer ' + image_dir)
  13. my_friends = bot.friends(update=True)
  14. # 获取好友头像信息并存储在FriendImgs目录中
  15. n = 0
  16. for friend in my_friends:
  17. print(friend)
  18. image_name = image_dir + str(n) + '.jpg'
  19. friend.get_avatar(image_name)
  20. n = n + 1
  • 聊天机器人

  1. from wxpy import *
  2. import requests, json, time
  3. import datetime
  4. # 创建机器人
  5. bot = Bot()
  6. # bot = Bot(console_qr=-2, cache_path=True) # 移植到linux,console_qr设置True和2都无法扫描登录,设置-2之后正常登录。
  7. @bot.register(Group)
  8. def print_messages(msg):
  9. # 登陆微信的用户群昵称
  10. user_name = msg.sender.self.name
  11. # 信息内容
  12. content = msg.raw['Content']
  13. # 发信息好友名称
  14. friend_name = msg.raw['ActualNickName']
  15. # 打印出对方说的话
  16. print("{} - 说 - {}".format(friend_name,content))
  17. # 类型
  18. type = msg.raw['Type']
  19. # 请自行添加关键词对应的内容
  20. keywords_dic = {
  21. '你好': '你好,我是机器人',
  22. '写作变现': '写作变现系列,真香!http://t.cn/A6xHLdYK',
  23. '自动化办公': '0基础如何学习自动化办公? http://t.cn/A6xHPxpx',
  24. }
  25. #把昵称,改为你自己的,某个群里昵称避免所有群都回复
  26. if '昵称' in user_name:
  27. # 以下代码,不要修改
  28. for key in keywords_dic.keys():
  29. if key in content:
  30. res_keyword_reply = '''{}'''
  31. reply_content = res_keyword_reply.format(keywords_dic[key])
  32. return reply_content
  33. # 堵塞线程,并进入 Python 命令行
  34. # embed()
  35. bot.join()

3.3 钉钉机器人

配置机器人

步骤如下:先创建一个群:智能群助手--添加机器人--自定义

需要注意的是,在安全设置一栏里,我们选择加签的方式来验证,在此说明一下,钉钉机器人的安全策略有三种,第一种是使用关键字,就是说你推送的消息里必须包含你创建机器人时定义的关键字,如果不包含就推送不了消息,第二种就是使用加密签名,第三种是定义几个ip源,非这些源的请求会被拒绝,综合来看还是第二种又安全又灵活。

代码提供:

  1. import time
  2. import hmac
  3. import hashlib
  4. import base64
  5. import urllib.parse
  6. timestamp = str(round(time.time() * 1000))
  7. secret = 'SECfaa7f034bf7b25bcaeccfcce82e5f712c8e1bdcbf16a0934143f542d31058363' #添加你的
  8. secret_enc = secret.encode('utf-8')
  9. string_to_sign = '{}n{}'.format(timestamp, secret)
  10. string_to_sign_enc = string_to_sign.encode('utf-8')
  11. hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
  12. sign = urllib.parse.quote(base64.b64encode(hmac_code))
  13. # print(timestamp)
  14. # print(sign)
  15. import requests,json #导入依赖库
  16. headers={'Content-Type': 'application/json'} #定义数据类型
  17. #添加你的
  18. webhook = 'https://oapi.dingtalk.com/robot/send?access_token=2cc56c65710552bb82d2a23ff87d85b8ba42e171e2c8c5c92528765ea9a90248&timestamp='+timestamp+"&sign="+sign
  19. #定义要发送的数据
  20. #"at": {"atMobiles": "['"+ mobile + "']"
  21. data = {
  22. "msgtype": "text",
  23. "text": {"content": '欢迎小可爱们'},
  24. "isAtAll": True}
  25. res = requests.post(webhook, data=json.dumps(data), headers=headers) #发送post请求
  26. print(res.text)

3.4 机器人支持格式

参考文章:

https://www.csdn.net/tags/Ntzacg4sNzkzNzMtYmxvZwO0O0OO0O0O.html

  • 复制机器人的Webhook,用于向这个群发送消息
  1. https://oapi.dingtalk.com/robot/send?access_token=XXXXXX

3.4.1 text格式

  1. {
  2. "at": {
  3. "atMobiles":[
  4. "180xxxxxx"
  5. ],
  6. "atUserIds":[
  7. "user123"
  8. ],
  9. "isAtAll": false
  10. },
  11. "text": {
  12. "content":"我就是我, @XXX 是不一样的烟火"
  13. },
  14. "msgtype":"text"
  15. }

实例-关键词

  1. import json
  2. import requests
  3. url = 'https://oapi.dingtalk.com/robot/send?access_token=2f43cdbca48d42b266632aa52aaf2ef10794d5de625f8c2aa0a9b3c3d4eb99b3'
  4. headers = {
  5. "Content-Type": "application/json;charset=utf-8"
  6. }
  7. json_ = {
  8. "at": {
  9. "isAtAll": True
  10. },
  11. "text": {
  12. "content": "打卡"
  13. },
  14. "msgtype": "text"
  15. }
  16. # 将dict转为str类型
  17. string_text_msg = json.dumps(json_)
  18. res = requests.post(url, data=string_text_msg, headers=headers, verify=False)
  19. print(res.json())

3.4.2 link类型

  1. {
  2. "msgtype": "link",
  3. "link": {
  4. "text": "这个即将发布的新版本",
  5. "title": "时代的火车向前开",
  6. "picUrl": "",
  7. "messageUrl": "https://www.dingtalk.com/s"
  8. }
  9. }

实例-关键词

  1. import json
  2. import requests
  3. url = 'https://oapi.dingtalk.com/robot/send?access_token=xx'
  4. headers = {
  5. "Content-Type": "application/json;charset=utf-8"
  6. }
  7. json_ = {
  8. "msgtype": "link",
  9. "link": {
  10. "text": "这个即将发布的新版本",
  11. "title": "打卡 时代的火车向前开",
  12. "picUrl": "",
  13. "messageUrl": "https://www.dingtalk.com/s"
  14. }
  15. }
  16. string_text_msg = json.dumps(json_)
  17. res = requests.post(url, data=string_text_msg, headers=headers, verify=False)
  18. print(res.json())

\

3.4.3、Markdown格式

  1. {
  2. "msgtype": "markdown",
  3. "markdown": {
  4. "title":"杭州天气",
  5. "text": "#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"
  6. },
  7. "at": {
  8. "atMobiles": [
  9. "150XXXXXXXX"
  10. ],
  11. "atUserIds": [
  12. "user123"
  13. ],
  14. "isAtAll": false
  15. }
  16. }

实例-关键词

  1. import json
  2. import requests
  3. url = 'https://oapi.dingtalk.com/robot/send?access_token=xx'
  4. headers = {
  5. "Content-Type": "application/json;charset=utf-8"
  6. }
  7. json_ = {
  8. "msgtype": "markdown",
  9. "markdown": {
  10. "title": "上海天气",
  11. "text": "打卡 上海天气 @18056540512 \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fbpic.588ku.com%2Foriginal_pic%2F18%2F10%2F23%2F17e928fa76a63d0908fff97b978d7b27.jpg&refer=http%3A%2F%2Fbpic.588ku.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096430&t=eac289fecb0e78922c4e9b33d3d1de7e)\n > ###### 10点20分发布 [天气](http://weathernew.pae.baidu.com/weathernew/pc?query=%E4%B8%8A%E6%B5%B7%E5%A4%A9%E6%B0%94&srcid=4982&city_name=%E4%B8%8A%E6%B5%B7&province_name=%E4%B8%8A%E6%B5%B7) \n"
  12. },
  13. "at": {
  14. "atMobiles": [
  15. "18056540xxxx"
  16. ],
  17. "atUserIds": [
  18. "user123"
  19. ],
  20. "isAtAll": False
  21. }
  22. }
  23. string_text_msg = json.dumps(json_)
  24. res = requests.post(url, data=string_text_msg, headers=headers, verify=False)
  25. print(res.json())

3.4.4、整体跳转ActionCard类型

  1. {
  2. "actionCard": {
  3. "title": "乔布斯 20 年前想打造一间苹果咖啡厅",
  4. "text": "![screenshot]",
  5. "btnOrientation": "0",
  6. "singleTitle": "打卡 阅读全文",
  7. "singleURL": "http://xxxx"
  8. },
  9. "msgtype": "actionCard"
  10. }

3.4.5、独立跳转ActionCard类型

  1. {
  2. "msgtype": "actionCard",
  3. "actionCard": {
  4. "title": "打卡 我 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身",
  5. "text": "![screenshot](https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050) \n\n #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
  6. "btnOrientation": "0",
  7. "btns": [
  8. {
  9. "title": "去点饭",
  10. "actionURL": "http://hefan.youfantech.cn/w/#/login"
  11. },
  12. {
  13. "title": "不感兴趣",
  14. "actionURL": "http://hefan.youfantech.cn/w/#/login"
  15. }
  16. ]
  17. }
  18. }

实例-关键词

  1. import json
  2. import requests
  3. url = 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
  4. headers = {
  5. "Content-Type": "application/json;charset=utf-8"
  6. }
  7. json_ = {
  8. "msgtype": "actionCard",
  9. "actionCard": {
  10. "title": "打卡 我 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身",
  11. "text": "![screenshot](https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050) \n\n #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划",
  12. "btnOrientation": "0",
  13. "btns": [
  14. {
  15. "title": "去点饭",
  16. "actionURL": "http://hefan.youfantech.cn/w/#/login"
  17. },
  18. {
  19. "title": "不感兴趣",
  20. "actionURL": "http://hefan.youfantech.cn/w/#/login"
  21. }
  22. ]
  23. }
  24. }
  25. string_text_msg = json.dumps(json_)
  26. res = requests.post(url, data=string_text_msg, headers=headers, verify=False)
  27. print(res.json())

3.4.6、FeedCard类型

  1. {
  2. "msgtype":"feedCard",
  3. "feedCard": {
  4. "links": [
  5. {
  6. "title": "悠饭点餐1",
  7. "messageURL": "https://www.dingtalk.com/",
  8. "picURL": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050"
  9. },
  10. {
  11. "title": "打卡 悠饭点餐2",
  12. "messageURL": "https://www.dingtalk.com/",
  13. "picURL": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050"
  14. }
  15. ]
  16. }
  17. }

实例-关键词

  1. import json
  2. import requests
  3. url = 'https://oapi.dingtalk.com/robot/send?access_token=xx'
  4. headers = {
  5. "Content-Type": "application/json;charset=utf-8"
  6. }
  7. json_ = {
  8. "msgtype":"feedCard",
  9. "feedCard": {
  10. "links": [
  11. {
  12. "title": "悠饭点餐1",
  13. "messageURL": "https://www.dingtalk.com/",
  14. "picURL": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050"
  15. },
  16. {
  17. "title": "打卡 悠饭点餐2",
  18. "messageURL": "https://www.dingtalk.com/",
  19. "picURL": "https://gimg2.baidu.com/image_search/src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20200114%2F1d9277a398584cdcb1284f274532c064.jpeg&refer=http%3A%2F%2F5b0988e595225.cdn.sohucs.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1629096721&t=c0fc2015e8963ef750babd9a73522050"
  20. }
  21. ]
  22. }
  23. }
  24. string_text_msg = json.dumps(json_)
  25. res = requests.post(url, data=string_text_msg, headers=headers, verify=False)
  26. print(res.json())

3.5、常见问题

  1. // 消息内容中不包含任何关键词
  2. {
  3. "errcode":310000,
  4. "errmsg":"keywords not in content"
  5. }
  6. // timestamp 无效
  7. {
  8. "errcode":310000,
  9. "errmsg":"invalid timestamp"
  10. }
  11. // 签名不匹配
  12. {
  13. "errcode":310000,
  14. "errmsg":"sign not match"
  15. }
  16. // IP地址不在白名单
  17. {
  18. "errcode":310000,
  19. "errmsg":"ip X.X.X.X not in whitelist"
  20. }

3.5.1、集成

  • PostMan -- Newman、Monitor定时自动监控接口
  • JMeter -- Jenkins、Shell..
  • Python -- sleep、threading模块中的Timer、sched模块

Python 定时任务的实现方式 - 枫飞飞 - 博客园

3.5.2、实例讲解

  • 钉钉接口
  1. import json
  2. import urllib
  3. import requests
  4. import time
  5. import hmac
  6. import hashlib
  7. import base64
  8. from requests.packages.urllib3.exceptions import InsecureRequestWarning
  9. requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  10. class Ding:
  11. """
  12. 钉钉机器人
  13. """
  14. def __init__(self):
  15. # 测试群-钉钉机器人的webhook地址
  16. self.url = 'https://oapi.dingtalk.com/robot/send?access_token=xxx'
  17. # secret
  18. self.secret = 'xxx'
  19. def check_secret(self, secret):
  20. """
  21. 生成secret加签
  22. :param secret:
  23. :return:
  24. """
  25. timestamp = str(round(time.time() * 1000))
  26. secret_enc = secret.encode('utf-8')
  27. string_to_sign = '{}\n{}'.format(timestamp, secret)
  28. string_to_sign_enc = string_to_sign.encode('utf-8')
  29. hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
  30. sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
  31. return "&timestamp=" + timestamp + "&sign=" + sign
  32. def send_message(self, message=None):
  33. """
  34. 发送钉钉消息
  35. :param message: 发送内容
  36. :return:
  37. """
  38. test_url = self.url + self.check_secret(f"{self.secret}")
  39. headers = {
  40. "Content-Type": "application/json;charset=utf-8"
  41. }
  42. message = message
  43. string_text_msg = {
  44. "msgtype": "text",
  45. "text": {"content": message},
  46. "at": {
  47. "isAtAll": 1 # 如果需要@所有人,这些写1
  48. }
  49. }
  50. string_text_msg = json.dumps(string_text_msg)
  51. with requests.post(test_url, data=string_text_msg, headers=headers, verify=False) as res:
  52. return res
  53. def send_link(self, message_url):
  54. """
  55. 发送钉钉链接
  56. :param message_url: 指定的url
  57. :return:
  58. """
  59. test_url = self.url + self.check_secret(f"{self.secret}")
  60. headers = {
  61. "Content-Type": "application/json;charset=utf-8"
  62. }
  63. string_link_msg = {
  64. "msgtype": "link",
  65. "link": {
  66. "text": "今天吃点啥呢?去悠饭看看吧~",
  67. "title": "悠饭点饭啦~",
  68. "picUrl": "https://tvax4.sinaimg.cn/crop.0.0.891.891.180/006Gos8ply8fxgn9viu2fj30ot0orgna.jpg?KID=imgbed,tva&Expires=1626279933&ssig=dsK87pjAuN",
  69. "messageUrl": message_url
  70. }
  71. }
  72. string_text_msg = json.dumps(string_link_msg)
  73. with requests.post(test_url, data=string_text_msg, headers=headers, verify=False) as res:
  74. return res
  • Task任务
  1. from common.robot import Ding
  2. import datetime
  3. import pytz
  4. run_time = datetime.datetime.now(pytz.timezone('PRC')).strftime("%Y-%m-%d %H:%M:%S")
  5. def lunch():
  6. """
  7. 提醒
  8. :return:
  9. """
  10. remind = "朋友们,可以准备准备去吃饭啦~"
  11. Ding().send_message(f"饭点时间到了 {remind}")
  12. return remind
  13. def dinner():
  14. """
  15. 提醒晚上点饭
  16. :return:
  17. """
  18. link = 'http://xxx'
  19. Ding().send_link(link)
  • 执行方式一:
  1. from task.youfan import lunch, dinner
  2. import datetime
  3. import pytz
  4. from apscheduler.schedulers.blocking import BlockingScheduler
  5. run_time = datetime.datetime.now(pytz.timezone('PRC')).strftime("%Y-%m-%d %H:%M:%S")
  6. scheduler = BlockingScheduler(timezone="Asia/Shanghai")
  7. print("start...")
  8. scheduler.add_job(lunch, 'cron', day_of_week='mon-fri', hour=11, minute=30, second=00)
  9. scheduler.add_job(dinner, 'cron', day_of_week='mon-fri', hour=16, minute=30, second=00)
  10. scheduler.start()
  11. print("end...")
  • 执行方式二:
  1. # 在具体的函数中添加 装饰器
  2. from common.robot import Ding
  3. import datetime
  4. import pytz
  5. from apscheduler.schedulers.blocking import BlockingScheduler
  6. run_time = datetime.datetime.now(pytz.timezone('PRC')).strftime("%Y-%m-%d %H:%M:%S")
  7. scheduler = BlockingScheduler(timezone="Asia/Shanghai")
  8. @scheduler.scheduled_job('cron', day_of_week='mon-fri', hour=11, minute=30, second=00)
  9. def lunch():
  10. """
  11. 提醒
  12. :return:
  13. """
  14. remind = "朋友们,可以准备准备去吃饭啦~"
  15. Ding().send_message(f"饭点时间到了 {remind}")
  16. return remind
  17. @scheduler.scheduled_job('cron', day_of_week='mon-fri', hour=16, minute=30, second=00)
  18. def dinner():
  19. """
  20. 提醒晚上点饭
  21. :return:
  22. """
  23. link = 'http://hefan.youfantech.cn/w/#/login'
  24. Ding().send_link(link)

3.5.3、scheduler简单使用

  1. import time
  2. from apscheduler.schedulers.blocking import BlockingScheduler
  3. def my_job():
  4. """
  5. 定义一个方法
  6. """
  7. print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
  8. # 创建一个BlockingScheduler(调度器)对象
  9. sched = BlockingScheduler()
  10. # 添加一个作业job_store,第一个参数是可调度的执行,第二个是调用方式(interval,date,cron),第三个是interval中指定的时间
  11. sched.add_job(my_job, 'interval', seconds=5)
  12. try:
  13. # 启动调度器,注意:启动后就不能修改配置参数了,运行程序需要写在start方法前面。
  14. sched.start()
  15. except (KeyboardInterrupt, SystemExit):
  16. sched.shutdown()
  • sched = BlockingScheduler()
  1. sched.add_job(func,'interval','date','cron')
  2. # date
  3. from datetime import datetime
  4. from datetime import date
  5. from apscheduler.schedulers.blocking import BlockingScheduler
  6. def job(text):
  7. print(text)
  8. scheduler = BlockingScheduler(timezone="Asia/Shanghai")
  9. # 在 2019-8-30 运行一次 job 方法
  10. # args=['这个是方法的一个入参']
  11. scheduler.add_job(job, 'date', run_date=date(2021, 7, 20), args=['text1'])
  12. # 在 2019-8-30 01:00:00 运行一次 job 方法
  13. scheduler.add_job(job, 'date', run_date=datetime(2021, 7, 20, 11, 38, 0), args=['text2'])
  14. # 在 2019-8-30 01:00:01 运行一次 job 方法
  15. scheduler.add_job(job, 'date', run_date='2021-7-20 11:39:00', args=['text3'])
  16. scheduler.start()

  1. sched.add_job(func,'interval','date','cron')
  2. # interval
  3. # 在 2021-07-19 20:15:00至2021-07-20 22:17:00期间,每隔1分30秒 运行一次 job 方法
  4. scheduler.add_job(job, 'interval', minutes=1, seconds = 30, start_date='2019-08-29 22:15:00', end_date='2019-08-29 22:17:00')

  1. sched.add_job(func,'interval','date','cron')
  2. # cron
  3. # 在每天22点,每隔 1分钟 运行一次 job 方法
  4. scheduler.add_job(job, 'cron', hour=22, minute='*/1')
  5. # 在每天22和23点的25分,运行一次 job 方法
  6. scheduler.add_job(job, 'cron', hour='22-23', minute='25')
  7. # 支持表达式的
  8. * 表示任何
  9. */a 表示每a,执行一次
  10. a-b 表示 ab的范围内
  11. a-b/c 表示a-b范围内每执行一次
  12. last x 表示本月最后一个工作日执行
  13. last 表示本月的最后一天执行

4.开通腾讯AI聊天机器人

腾讯 AI 开放平台腾讯AI开放平台汇聚顶尖技术,专业人才和行业资源,依托腾讯AI Lab、腾讯云、优图实验室及合作伙伴强大的AI技术能力,升级锻造创业项目。通过腾讯品牌、创投和流量广告等资源,为AI技术及产品找到更多的应用场景,实现产品从打造到引爆的全过程。https://ai.qq.com/

编写调用聊天接口代码(文件名:interface.py)

  1. import hashlib
  2. import time
  3. import random
  4. import string
  5. from urllib.parse import quote
  6. def curlmd5(src):
  7. m = hashlib.md5(src.encode('UTF-8'))
  8. # 将得到的MD5值所有字符转换成大写
  9. return m.hexdigest().upper()
  10. def get_params(plus_item):
  11. # 请求时间戳(秒级),用于防止请求重放(保证签名5分钟有效)
  12. t = time.time()
  13. time_stamp = str(int(t))
  14. # 请求随机字符串,用于保证签名不可预测
  15. nonce_str = ''.join(random.sample(string.ascii_letters + string.digits, 10))
  16. # 应用标志,这里修改成自己的id和key
  17. app_id = '你的id号码'
  18. app_key = '你的key号码'
  19. params = {'app_id': app_id,
  20. 'question': plus_item,
  21. 'time_stamp': time_stamp,
  22. 'nonce_str': nonce_str,
  23. 'session': '10000'
  24. }
  25. sign_before = ''
  26. # 要对key排序再拼接
  27. for key in sorted(params):
  28. # 键值拼接过程value部分需要URL编码,URL编码算法用大写字母,例如%E8。quote默认大写。
  29. sign_before += '{}={}&'.format(key, quote(params[key], safe=''))
  30. # 将应用密钥以app_key为键名,拼接到字符串sign_before末尾
  31. sign_before += 'app_key={}'.format(app_key)
  32. # 对字符串sign_before进行MD5运算,得到接口请求签名
  33. sign = curlmd5(sign_before)
  34. params['sign'] = sign
  35. return params

编写运行代码,直接复制下面的就行~

  1. import requests
  2. import interface
  3. def get_content(plus_item):
  4. # 聊天的API地址
  5. url = "https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat"
  6. # 获取请求参数
  7. plus_item = plus_item.encode('utf-8')
  8. payload = interface.get_params(plus_item)
  9. # r = requests.get(url,params=payload)
  10. r = requests.post(url, data=payload)
  11. return r.json()["data"]["answer"]
  12. if __name__ == '__main__':
  13. while True:
  14. comment = input('我:')
  15. if comment == 'q':
  16. break
  17. answer = get_content(comment)
  18. print('机器人:' + answer)

云端部署参考这边文章

M5 | Python+AI,实现云端部署(源代码和步骤)倒数第2个步骤。https://mp.weixin.qq.com/s?__biz=MzUzNTc5NjA4NQ==&mid=2247485298&idx=2&sn=970ff8e9a7c49905465e9b48c68a4417&chksm=fa814768cdf6ce7e7a75eb56ffe9713b79c44258fd25e886f787104e85c96cc2fa27c1303cdc&scene=21#wechat_redirect

python自动化高效办公第二期,带你项目实战【二】{数据可视化、发送邮件(定时任务监控)、python聊天机器人(基于微信、钉钉)}的更多相关文章

  1. python实现的、带GUI界面电影票房数据可视化程序

    代码地址如下:http://www.demodashi.com/demo/14588.html 详细说明: Tushare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采 ...

  2. 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码

    随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...

  3. python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改、删除操作

    python操作三大主流数据库(14)python操作redis之新闻项目实战②新闻数据的展示及修改.删除操作 项目目录: ├── flask_redis_news.py ├── forms.py ├ ...

  4. appium+python自动化项目实战(二):项目工程结构

    废话不多说,直接上图: nose.cfg配置文件里,可以指定执行的测试用例.生成测试报告等.以后将详细介绍.

  5. Python网络爬虫实战(二)数据解析

    上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题.那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据. 根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是 ...

  6. 【python数据分析实战】电影票房数据分析(二)数据可视化

    目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...

  7. 数据可视化开源系统(python开发)

    Caravel 是 Airbnb (知名在线房屋短租公司)开源的数据探查与可视化平台(曾用名Panoramix),该工具在可视化.易用性和交互性上非常有特色,用户可以轻松对数据进行可视化分析. 核心功 ...

  8. Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy

    爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...

  9. python操作三大主流数据库(13)python操作redis之新闻项目实战①新闻数据的导入

    1.新闻处理页面redis_news.py #coding:utf-8 import math import redis class RedisNews(object): def __init__(s ...

  10. flow.ci + Github + Slack 一步步搭建 Python 自动化持续集成

    理想的程序员必须懒惰,永远追随自动化法则.Automating shapes smarter future. 在一个 Python 项目的开发过程中可能会做的事情:编译.手动或自动化测试.部署环境配置 ...

随机推荐

  1. SpringBoot 拦截器 统一日志 记录用户请求返回日志

    你请求我接口,传了什么参数,我返回了什么值给你,全部记下来.防止扯皮 需求:记录每次用户请求Controller的Body参数, 思路:在每个Controller 该当中记录,容易漏记,如果在拦截器里 ...

  2. 在原生 html 中使用 vue,在浏览器中直接运行 .vue 文件,在 vue 中使用 leaflet

    vue3-in-html 在html中使用vue3,不依赖nodejs和webpack,不依赖脚手架 demo源码 https://gitee.com/s0611163/vue3-in-html 功能 ...

  3. Spring | 利用Maven搭建Spring的开发环境

    本节主要介绍如何利用Maven搭建 Spring 开发环境,使用 Spring 之前需要安装 JDK .Maven和 IDEA 建议一定要从 Maven 项目开始,而不是从空项目开始,空项目开始会出现 ...

  4. 「HDU-2196」Computer (树形DP、树的直径)

    「HDU-2196」Computer 树形dp,树的最长路径(最远点对) 题意 给出一棵nn个结点的无根树,求出每个结点所能到达的最远点的距离. 解法 将无根树转成有根树,并进行两次DFS. 第一次D ...

  5. 利用PE工具箱安装WINDOWS系统

    一.   进入PE系统 U盘插入电脑,开机多次按F12(联想F12,华硕ESC,DELL F9,微星F11,大部分都是这样,实在不行就按F2进BIOS改)键进入类似如下图界面,选择U盘启动,(能选UE ...

  6. OAuth2.0回调函数用html页面转发给controller

    OAuth2.0授权中有个回调函数,就是请求授权服务后,它会将你需要的code(假设code就是你需要的数据)发送给你的回调函数(你对外开放的一个url地址用以接收参数) 注:这个回调函数有点讨厌为什 ...

  7. vue Promise的使用

    一.Promise是什么? Promise是异步编程的一种解决方案. 二.那什么时候我们会来处理异步事件呢? 1. 一种很常见的场景应该就是网络请求了. 我们封装一个网络请求的函数,因为不能立即拿到结 ...

  8. HanLP — 汉字转拼音,简繁转换 -- JAVA

    目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...

  9. el-menu菜单过长,显示不全问题

  10. C#设计模式18——迭代器模式的写法

    是什么: 迭代器模式是一种行为型设计模式,它允许客户端通过一种统一的方式遍历集合对象中的元素,而无需暴露集合对象的内部结构. 为什么: 使用迭代器模式可以使得客户端程序与集合对象解耦,从而可以更加灵活 ...