自动化播报技术攻关

  1. 企业微信群机器人播报
  2. Python编辑发送内容
  3. 定时触发:腾讯云函数
    a. 测试成功,但运行结果无法返回到调用方:把代码放入函数里面
  4. Python对excel刷新数据,截图
    a. 更新数据源
    b. 刷新透视表
    c. 截图固定单元格区域
    python本地部署云函数 使用SCF CLI命令行工具
  5. 安装第三方库scf

云函数与企业微信机器人实践

企业微信机器人

选定群,单击右键即可新建一个机器人

推送消息有两种格式:

  • 文本格式Hi,我是机器人小瓶子,由令平子于11月05日添加到群
  • Markdown格式实时新增用户反馈<font color="warning">132例</font>,请相关同事注意。> 类型:<font color="comment">用户反馈</font>> 普通用户反馈:<font color="comment">117例</font>> VIP用户反馈:<font color="comment">15例</font>

官方说明:机器人配置说明

以下是用curl工具往群组推送文本消息的示例(注意要将url替换成你的机器人webhook地址,content必须是utf8编码):

  1. curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \
  2. -H 'Content-Type: application/json' \
  3. -d '
  4. {
  5. "msgtype": "text",
  6. "text": {
  7. "content": "hello world"
  8. }
  9. }'
  • 当前自定义机器人支持文本(text)、markdown(markdown)、图片(image)、图文(news)四种消息类型。
  • 机器人的text/markdown类型消息支持在content中使用<@userid>扩展语法来@群成员

消息类型及数据格式

文本类型

  1. {
  2. "msgtype": "text",
  3. "text": {
  4. "content": "广州今日天气:29度,大部分多云,降雨概率:60%",
  5. "mentioned_list":["wangqing","@all"],
  6. "mentioned_mobile_list":["13800001111","@all"]
  7. }
  8. }
参数 是否必填 说明
msgtype 消息类型,此时固定为text
content 文本内容,最长不超过2048个字节,必须是utf8编码
mentioned_list userid的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userid,可以使用mentioned_mobile_list
mentioned_mobile_list 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人

markdown类型

  1. {
  2. "msgtype": "markdown",
  3. "markdown": {
  4. "content": "实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n
  5. >类型:<font color=\"comment\">用户反馈</font> \n
  6. >普通用户反馈:<font color=\"comment\">117例</font> \n
  7. >VIP用户反馈:<font color=\"comment\">15例</font>"
  8. }
  9. }
参数 是否必填 说明
msgtype 消息类型,此时固定为markdown
content markdown内容,最长不超过4096个字节,必须是utf8编码

目前支持的markdown语法是如下的子集:

  1. 一、标题 (支持16级标题,注意#与文字中间要有空格)
  2. # 标题一
  3. ## 标题二
  4. ### 标题三
  5. #### 标题四
  6. ##### 标题五
  7. ###### 标题六
  8. 二、加粗
  9. **bold**
  10. 三、链接
  11. [这是一个链接](http://work.weixin.qq.com/api/doc)
  12. 四、行内代码段(暂不支持跨行)
  13. `code`
  14. 五、引用
  15. > 引用文字
  16. 六、字体颜色(只支持3种内置颜色)
  17. <font color="info">绿色</font>
  18. <font color="comment">灰色</font>
  19. <font color="warning">橙红色</font>

图片类型

  1. {
  2. "msgtype": "image",
  3. "image": {
  4. "base64": "DATA",
  5. "md5": "MD5"
  6. }
  7. }
参数 是否必填 说明
msgtype 消息类型,此时固定为image
base64 图片内容的base64编码
md5 图片内容(base64编码前)的md5值

图文类型

  1. {
  2. "msgtype": "news",
  3. "news": {
  4. "articles" : [
  5. {
  6. "title" : "中秋节礼品领取",
  7. "description" : "今年中秋节公司有豪礼相送",
  8. "url" : "www.qq.com",
  9. "picurl" : "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"
  10. }
  11. ]
  12. }
  13. }
参数 是否必填 说明
msgtype 消息类型,此时固定为news
articles 图文消息,一个图文消息支持1到8条图文
title 标题,不超过128个字节,超过会自动截断
description 描述,不超过512个字节,超过会自动截断
url 点击后跳转的链接。
picurl 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图 1068455,小图150150。

文件类型

  1. {
  2. "msgtype": "file",
  3. "file": {
  4. "media_id": "3a8asd892asd8asd"
  5. }
  6. }
参数 是否必填 说明
msgtype 消息类型,此时固定为file
media_id 文件id,通过下文的文件上传接口获取

消息发送频率限制

每个机器人发送的消息不能超过20条/分钟。

文件上传接口

素材上传得到media_id,该media_id仅三天内有效 media_id在同一企业内应用之间可以共享

请求方式:POST(HTTPS
请求地址:https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE
使用multipart/form-data POST上传文件, 文件标识名为”media”
参数说明:

参数 必须 说明
key 调用接口凭证, 机器人webhookurl中的key参数
type 固定传file

POST的请求包中,form-data中媒体文件标识,应包含有 filename、filelength、content-type等信息

filename标识文件展示的名称。比如,使用该media_id发消息时,展示的文件名由该字段控制

请求示例:

  1. POST https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa&type=file HTTP/1.1
  2. Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
  3. Content-Length: 220
  4. ---------------------------acebdf13572468
  5. Content-Disposition: form-data; name="media";filename="wework.txt"; filelength=6
  6. Content-Type: application/octet-stream
  7. mytext
  8. ---------------------------acebdf13572468--

返回数据:

  1. {
  2. "errcode": 0,
  3. "errmsg": "ok"
  4. "type": "file",
  5. "media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
  6. "created_at": "1380000000"
  7. }

参数说明:

参数 说明
type 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
media_id 媒体文件上传后获取的唯一标识,3天内有效
created_at 媒体文件上传时间戳

上传的文件限制:

  • 要求文件大小在5B~20M之间

腾讯云函数

官方入口
官方帮助文档
image.png
云函数设置步骤:

  1. 新建函数
  2. 编辑函数
    1. 在线编辑
    2. 本地上传zip包
    3. 本地上传文件夹
    4. 通过cos上传zip包
  3. 创建触发
    1. 定时触发
    2. COS触发
    3. Ckafka触发
    4. API网关触发器
    5. CLS日志触发

image.png
注:要把代码放到**def main_handler(event, context):**里面才能定时触发。


云函数与群机器人运行实例

小瓶子:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=f5d6e41d-5780-49a1-bd05-aa9f3688366d
什名:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=00236cb4-2c2f-4eb7-b00b-88109ccb3b8b
测试实例——文本

  1. # -*- coding: utf8 -*-
  2. import json
  3. def main_handler(event, context):
  4. print("Received event: " + json.dumps(event, indent = 2))
  5. print("Received context: " + str(context))
  6. import requests
  7. headers = {
  8. 'Content-Type': 'application/json',
  9. }
  10. params = (
  11. ('key', 'f5d6e41d-5780-49a1-bd05-aa9f3688366d'),
  12. )
  13. data = json.dumps({
  14. "msgtype": "text",
  15. "text": {
  16. "content": "各位院长晚上好!忙碌之余别忘了更新今天的名片记录哦!",
  17. "mentioned_list":["wangqing","@all"],
  18. #"mentioned_mobile_list":["@all"]
  19. }
  20. })
  21. response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
  22. print(response.content.decode())

测试实例——Markdown

  1. import requests
  2. import json
  3. headers = {'Content-Type': 'application/json',}
  4. params = (
  5. ('key', '00236cb4-2c2f-4eb7-b00b-88109ccb3b8b'),
  6. )
  7. data = json.dumps({
  8. "msgtype": "markdown",
  9. "markdown": {
  10. "content": "实时新增用户反馈<font color=\"warning\">132例</font>",
  11. }
  12. })
  13. response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
  14. print(response.content.decode())

测试实例——图文

  1. import requests
  2. import json
  3. headers = {'Content-Type': 'application/json',}
  4. params = (
  5. ('key', '00236cb4-2c2f-4eb7-b00b-88109ccb3b8b'),
  6. )
  7. data = json.dumps({
  8. "msgtype": "news",
  9. "news": {
  10. "articles" : [
  11. {
  12. "title" : "更新今日名片记录",
  13. "description" : "忙碌之余,记得更新",
  14. "url" : "https://www.kdocs.cn/p/95310168069",
  15. "picurl" : "https://ftp.bmp.ovh/imgs/2020/12/fd5ea9ef254f2e31.png"
  16. }
  17. ]
  18. }
  19. })
  20. response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
  21. print(response.content.decode())

网络案例1:

  1. import requests
  2. headers = {
  3. 'Content-Type': 'application/json',
  4. }
  5. # 注意这段key一定要妥善保护 不能暴露到外部空间 否则安全隐患很多
  6. params = (
  7. ('key', 'f5d6e41d-5780-49a1-bd05-aa9f3688366d'),
  8. )
  9. # data = '\n {\n "msgtype": "text",\n "text": {\n "content": "hello world"\n }\n }'
  10. data = {
  11. "msgtype": "text",
  12. "text": {
  13. "content": "广州今日天气:29度,大部分多云,降雨概率:60%",
  14. "mentioned_list":["wangqing","@all"],
  15. "mentioned_mobile_list":["@all"]
  16. }
  17. }
  18. response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers, params=params, data=data)
  19. print(response.content.decode())

网络案例2:

  1. from WorkWeixinRobot.work_weixin_robot import WWXRobot
  2. wwx = WWXRobot(key='你自己机器人的值')
  3. wwx.send_text(content='Hello')

网络案例3:

  1. import requests, json
  2. import datetime
  3. import time
  4. wx_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4baf3c3c-f3ea-4554-9a45-9fbbb2076269" # 测试机器人1号
  5. send_message = "测试:测试机器人1号………………………………!"
  6. def get_current_time():
  7. """获取当前时间,当前时分秒"""
  8. now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  9. hour = datetime.datetime.now().strftime("%H")
  10. mm = datetime.datetime.now().strftime("%M")
  11. ss = datetime.datetime.now().strftime("%S")
  12. return now_time, hour, mm, ss
  13. def sleep_time(hour, m, sec):
  14. """返回总共秒数"""
  15. return hour * 3600 + m * 60 + sec
  16. def send_msg(content):
  17. """艾特全部,并发送指定信息"""
  18. data = json.dumps({"msgtype": "text", "text": {"content": content, "mentioned_list":["@all"]}})
  19. r = requests.post(wx_url, data, auth=('Content-Type', 'application/json'))
  20. print(r.json)
  21. def every_time_send_msg(interval_h=0, interval_m=1, interval_s=0, special_h="00", special_m="00", mode="special"):
  22. """每天指定时间发送指定消息"""
  23. # 设置自动执行间隔时间
  24. second = sleep_time(interval_h, interval_m, interval_s)
  25. # 死循环
  26. while 1 == 1:
  27. # 获取当前时间和当前时分秒
  28. c_now, c_h, c_m, c_s = get_current_time()
  29. print("当前时间:", c_now, c_h, c_m, c_s)
  30. if mode == "special":
  31. if c_h == special_h and c_m == special_m:
  32. # 执行
  33. print("正在发送...")
  34. send_msg(send_message)
  35. else:
  36. send_msg(send_message)
  37. print("每隔" + str(interval_h) + "小时" + str(interval_m) + "分" + str(interval_s) + "秒执行一次")
  38. # 延时
  39. time.sleep(second)
  40. if __name__ == '__main__':
  41. every_time_send_msg(mode="no")

切换到python36环境,前提:已为Anaconda配置环境变量

C:\Users\Administrator>python
activate python36

安装scf

pip install scf
2. 配置账号信息

交互式配置

scf configure set

输入信息

appid:1300469945
region:ap-guangzhou

访问https://console.cloud.tencent.com/cam/capi获得

secret-id:
secret-key:
3. 初始化示例项目
scf init —runtime python3.6 —name testproject —output-dir /Users/Administrator/Desktop
cd C:\Users\Administrator\Desktop\testproject
tree /Users/Administrator/Desktop/testproject
4. 打包部署
cd C:\Users\Administrator\Desktop\testproject
scf deploy


参考来源: http://www.jishudao.com/2019/05/14/qywx_bot_one_day_play/ imgs.zip http://www.dszhp.com/wxworkroot.html 【实战】调用企业微信群机器人接口实现活动经营数据自动播报 | o郭二爷o-爱编程,爱python,爱数据分析 https://blog.csdn.net/tangthh123/article/details/95756982?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param (1条消息) 企业微信机器人并实现发送消息的功能(文本消息,图片消息,图文消息)Soup’s Blog-CSDN博客企业微信机器人怎么发消息

自动刷新 Excel 电子表格的 Python 脚本

  1. import win32com.client as win32
  2. Xlsx = win32.DispatchEx('Excel.Application')
  3. Xlsx.DisplayAlerts = True
  4. Xlsx.Visible = True
  5. book = Xlsx.Workbooks.Open('C:/Test_Excel/Essai_1.xlsx')
  6. # Refresh my two sheets
  7. book.RefreshAll()
  8. book.Save()
  9. book.Close()
  10. Xlsx.Quit()
  11. # del book
  12. # del Xlsx

对Excel文件进行写入操作:

Dispatch()在创建对象实例前会尝试使用GetObject(),如果有运行的实例,会得到该实例对象;
DispatchEx()直接创建一个对象实例.
一般用DispatchEx()好点,否则就对已经打开的对象实例进行操作了,大多数时候并非用户的意图.

  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. __author__ = 'mayi'
  4. # 导入模块
  5. import win32com.client
  6. # 打开Excel
  7. Application = win32com.client.Dispatch("Excel.Application")
  8. # 或者使用下面的方法,使用启动独立的进程:
  9. # Application = win32com.client.DispatchEx("Excel.Application")
  10. # 后台运行,显示程序界面,不警告
  11. Application.Visible = 1 # 调试阶段建议打开
  12. Application.DisplayAlerts = 0
  13. # 新建一个文档
  14. Workbook = Application.Workbooks.Add()
  15. # 打开一个文档
  16. Workbook = Application.Workbooks.Open("F:\\test.xlsx")
  17. # 根据工作表名
  18. Base = Workbook.Worksheets("Sheet1")
  19. # 根据工作表顺序
  20. # Base = Workbook.Worksheets(1)
  21. # 接受当前工作表
  22. # Base = Workbook.ActiveSheet
  23. # 添加内容: 0.0, 0.5, 1.0
  24. Base.Cells(1, 1).Value = 'Values'
  25. Base.Cells(1, 2).Value = 0.0
  26. Base.Cells(1, 3).Value = 0.5
  27. Base.Cells(1, 4).Value = 1.0
  28. Workbook.SaveAs("F:\\test.xlsx")
  29. # 关闭文档
  30. Workbook.Close()
  31. # 退出Excel
  32. Application.Quit()

对Excel文件进行读取操作:

  1. #!/usr/bin/python3
  2. # -*- coding:utf-8 -*-
  3. __author__ = 'mayi'
  4. # 导入模块
  5. import win32com.client
  6. # 打开Excel
  7. Application = win32com.client.Dispatch("Excel.Application")
  8. # 或者使用下面的方法,使用启动独立的进程:
  9. # Application = win32com.client.DispatchEx("Excel.Application")
  10. # 后台运行,显示程序界面,不警告
  11. Application.Visible = 1 # 调试阶段建设打开
  12. Application.DisplayAlerts = 0
  13. # 打开一个文档
  14. Workbook = Application.Workbooks.Open("F:\\test.xlsx")
  15. Base = Workbook.Worksheets(1)
  16. # 接受当前工作表
  17. Base = Workbook.ActiveSheet
  18. #列数
  19. ncols = 0
  20. while True:
  21. cell_value = Base.Cells(1, ncols + 1).Value
  22. if cell_value:
  23. ncols += 1
  24. else:
  25. break
  26. # 行数
  27. nrows = 0
  28. while True:
  29. cell_value = Base.Cells(nrows + 2, 1).Value # 第一行表头
  30. if cell_value:
  31. for col in range(ncols):
  32. cell_key = Base.Cells(1, col + 1).Value
  33. cell_value = Base.Cells(nrows + 2, col + 1).Value
  34. print(cell_key, "=>", cell_value, end = "\t")
  35. print("")
  36. nrows += 1
  37. else:
  38. break
  39. # 关闭文档
  40. Workbook.Close()
  41. # 退出Excel
  42. Application.Quit()

Python基础系列讲解-自动控制windows桌面

python 自动刷新网页

if else优化

字符串拼接

  1. joiner = '-'
  2. list = ['1','2','3']
  3. a = joiner.join(list)
  4. # '1-2-3'

判断列表为空

  1. # 方法一
  2. if mylist:
  3. # Do something with my list
  4. else:
  5. # The list is empty
  6. # 方法二
  7. list = []
  8. if len(list) == 0:
  9. print('list is empty')
  10. # 方法三
  11. list = []
  12. if not list:
  13. print('list is empty')
  14. #方法四
  15. EmptyList = []
  16. list = []
  17. if list==EmptyList:
  18. print('list is empty')

Python 如何启动其他程序

  • 方法一:os.startfile() ,直接启动 exe 文件,部分软件启动需配置参数不能直接启动,可通过快捷方式启动

    1. import os
    2. os.startfile(r"F:\Program Files\WeChat\WeChat.exe")
    3. os.startfile(r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\微信\微信.lnk")
  • 方法二:ShellExecute() 函数

    ShellExecute(hwnd, op, file, args, dir, show)

    • hwnd: 父窗口的句柄,如果没有父窗口,则为0
    • op : 要运行的操作,为open,print或者为空
    • file : 要运行的程序,或者打开的脚本
    • args : 要向程序传递的参数,如果打开的是文件则为空
    • dir : 程序初始化的目录
    • show : 是否显示窗口
  1. import win32api
  2. win32api.ShellExecute(0, 'open', "F:\Program Files\WeChat\WeChat.exe", '', '', 0)
  3. win32api.ShellExecute(0, 'open', "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\微信\微信.lnk", '', '', 0)
  • 方法三:CreateProcess() 函数

    CreateProcess(appName, cmdLine, proAttr, threadAttr, InheritHandle, CreationFlags, newEnv, currentDir, Attr)

    • appName 可执行文件名
    • cmdLine 命令行参数
    • procAttr 进程安全属性
    • threadAttr 线程安全属性
    • InheritHandle 继承标志
    • CreationFlags 创建标志
    • currentDir 进程的当前目录
    • Attr 创建程序的属性
  1. import win32process
  2. win32process.CreateProcess("F:\Program Files\WeChat\WeChat.exe", '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())
  • 方法四:pyautogui 库

    通过pyautogui进行图标识别,然后模拟双击图标启动。该方式稳定性不高,可移植性较差

  1. import pyautogui
  2. cposition = pyautogui.locateOnScreen(r"E:\L3.bmp") #根据图片定位
  3. cc = pyautogui.center(cposition) #获取这个软件位置的中心
  4. pyautogui.moveTo(cc[0],cc[1]) #把鼠标移动到这个位置
  5. pyautogui.click(clicks=2) #双击
  • 方法五:subprocess 库
    1. subprocess.Popen('C:/Windows/notepad.exe')

    Pyautogui 自动化(控制鼠标与键盘)

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux)。

  1. # 安装 pyautogui
  2. pip install pyautogui # conda install 貌似会出错
  3. ############################################# 准备工作 #############################################
  4. import pyautogui as pg
  5. import datetime
  6. # 保护措施,避免失控
  7. def SaveToExcel():
  8. While True:
  9. pg.FAILSAFE = True
  10. # 为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。
  11. pyautogui.PAUSE = 0.5
  12. # 设置输入时的时间间隔
  13. secs_between_keys = 0.1
  14. # 控制鼠标移动速度
  15. num_seconds = 0.2
  16. # 获取屏幕分辨率(分辨率*分辨率)
  17. screenWidth, screenHeight = pg.size()
  18. # 获取当前位置
  19. x, y = pg.position()
  20. print('当前鼠标的X轴、Y轴位置为:'.{}format(x, y))
  21. # 判断坐标是否在屏幕范围内
  22. pg.onScreen(100, 200) # True
  23. pg.onScreen(100,2000) # False

鼠标操作

mouseDown()、mouseUp();另有在click()之上封装的rightClick()、middleClick()、doubleClick()、tripleClick()等函数

  1. # 移动鼠标到指定位置
  2. pg.moveTo(x=821, y=60, duration=0.25) # duration 移动过渡时间
  3. # 点击鼠标
  4. pg.click(x=821, y=60, button='left')
  5. # 相对位置移动
  6. pg.moveTo(sizex/2,sizey/2,duration=1)
  7. # 绝对位置移动
  8. pg.moveRel(100, -200, duration=0.5)
  9. # 移动至屏幕中心点击一下左键,过渡时间0.5秒
  10. In [16]: pyautogui.click(sizex/2,sizey/2, duration=0.5)
  11. # 不指定x、y,在当前位置点击一下右键
  12. In [17]: pyautogui.click(button='right')
  13. # 移动至(100,100)点击3次左键,点击间隔0.1s,鼠标移动过渡时间0.5秒
  14. In [18]: pyautogui.click(100,100, clicks=3,interval=0.1,duration=0.5)
  15. # 移动至(100,100)点击2次右键,点击间隔0.5s,鼠标移动过渡时间0.2秒
  16. In [19]: pyautogui.click(100,100, clicks=2,interval=0.5,button='right',duration=0.2)
  17. # 滚动鼠标滚轮
  18. # 鼠标位置不动,向上回滚2个单位,项目文档对滚动量参数说明不详
  19. In [22]: pyautogui.scroll(2)
  20. # 鼠标移动至(1000,700),前下滚动10个单位
  21. # 运行发现鼠标并没有动
  22. In [26]: pyautogui.scroll(-10,1000,700)
  23. # 鼠标拖拽
  24. # 将鼠标从当前位置拖至屏幕中心,默认左键
  25. In [32]: pyautogui.dragTo(sizex/2,sizey/2)
  26. # 将鼠标从当前位置向左100像素、向右200像素拖动,过渡时间0.5秒,指定右键
  27. In [33]: pyautogui.dragRel(-100,200,duration=0.5,button='right')

键盘控制

控制按键,也是一个press()函数基本把活包干,按键动作往细分解包含keyDown()和keyUp()两个过程;在此基础上封装,有typewrite()和hotkey()两个高阶一点的函数,分别用于输入字符串和按快捷键。

  1. # 键名用字符串表示,支持的所有键名,存在pyautogui.KEYBOARD_KEYS变量中,包括26个字母、数字、符号、F1~F20、方向等等所有按键
  2. In [4]: pyautogui.press('a') # 按字母A键,字母支持大小写
  3. # 程序向终端输入了字符a,若程序运行时输入法为中文状态,由于没有继续输入空格或回车,输入法仅列出候选字,并不会输入到终端
  4. In [5]: a
  5. # 传入键名列表(按键p、按键y、空格),按键之间间隔0.1秒(默认0)
  6. In [6]: pyautogui.press(['p','y','space'], interval=0.1)
  7. # 运行前将输入法切换到中文状态,往终端直接输入了“培养”
  8. In [7]: 培养
  9. # typewrite方式一:传入字符串,不支持中文字符,因为函数无法知道输入法需要什么按键才能得到中文字符
  10. In [9]: pyautogui.typewrite('hello, PyAutoGUI!\n')
  11. # 程序把字符串"'hello, PyAutoGUI!"和换行符输入到了终端
  12. In [10]: hello, PyAutoGUI!
  13. ...:
  14. # typewrite方式二:传入键名列表,按键之间间隔0.1秒(默认0)
  15. In [11]: pyautogui.typewrite(['s','r','f','space'], interval=0.1)
  16. # 运行前将输入法切换到中文状态,往终端直接输入了“输入法”3个字
  17. In [12]: 输入法
  18. # 大小写字母是自动支持的,仍然尝试一次切换到大写
  19. In [13]: pyautogui.typewrite(['capslock','p','y'])
  20. # CapsLock按键灯被点亮,程序往终端输入了"PY"
  21. In [14]: PY
  22. # hotkey屏蔽了需要反复keyDown、keyUp的细节,参数是任意个键名,而非列表
  23. In [18]: pyautogui.hotkey('ctrl', 'shift', 'esc') #调出任务管理器
  24. In [19]:pyautogui.hotkey('alt','ctrl','delete') # 并未调出重启界面
  25. auto.perss('enter') 按下键盘的回车键
  26. auto.press('f1') 按下键盘的F1
  27. auto.press('left') 按下键盘上的左方向键左箭头
  28. # 组合按键
  29. # hotkey()可以传递几个键字符串,这些字符串将‘按顺序按下’,然后以‘反向顺序释放’。
  30. auto.hotkey('ctrl','shift','T')
  31. # 相当于
  32. auto.keyDown('ctrl')
  33. auto.keyDown('shift')
  34. auto.keyDown('T')
  35. auto.keyUp('T')
  36. auto.keyUp('shift')
  37. auto.keyUp('ctrl')

消息窗口

PyAutoGUI利用pymsgbox的功能,以JavaScript风格函数提供消息框功能,包括alert()、confirm()、prompt() 、password(),连参数都是一致的,熟悉JavaScript的朋友不会陌生

  1. In [24]: pyautogui.alert(text='警告',title='PyAutoGUI消息框',button='OK')
  2. Out[24]: 'OK' # 点击的按键被返回
  3. In [28]: pyautogui.confirm(text='请选择',title='PyAutoGUI消息框',buttons=['1','2'
  4. ...: ,'3'])
  5. Out[28]: '2' # 点击的按键被返回
  6. In [30]: pyautogui.prompt(text='请输入',title='PyAutoGUI消息框',default='请输入')
  7. Out[30]: 'input by 伪码人' # 点OK按钮后返回输入内容
  8. In [32]: pyautogui.password(text='输入密码',title='PyAutoGUI消息框',default='',mask='*')
  9. Out[32]: 'We_Coder' # 点OK按钮后返回输入内容
  • Python中设置指定窗口为前台活动窗口(最顶层窗口)win32gui ```python

    输出当前活动窗体句柄

    # def print_GetForegroundWindow(): hwnd_active = win32gui.GetForegroundWindow() print(‘hwnd_active hwnd:’,hwnd_active) print(‘hwnd_active text:’,win32gui.GetWindowText(hwnd_active)) print(‘hwnd_active class:’,win32gui.GetClassName(hwnd_active))

输出当前活动窗口句柄

print_GetForegroundWindow() print(‘—————————————————————‘)

设置TIM为活动窗口

shell = win32com.client.Dispatch(“WScript.Shell”) shell.SendKeys(‘%’) win32gui.SetForegroundWindow(win32gui.FindWindow(“TXGuiFoundation”,”TIM”))

查看是否修改

print_GetForegroundWindow()

加上显示到最前端,这里使用 SW_SHOW,用参考链接中得max有时会导致窗体不可点击

win32gui.ShowWindow(win32gui.FindWindow(“TXGuiFoundation”,”TIM”), win32con.SW_SHOW)

  1. <a name="E7RLa"></a>
  2. ## 定位
  3. > 坐标轴:电脑屏幕的左上角是位置(0,0),向右X坐标正方向,向下Y坐标正方向
  4. > 在#1920 x 1080屏幕上,定位函数调用大约需要1或2秒 ,不适用于游戏脚本调用,原因是太慢
  5. ```python
  6. ##################################### 方法一:手动获取 #########################################
  7. def get_mouse_position():
  8. screenWidth, screenHeight = pg.size()
  9. print('屏幕尺寸为:'.format(screenWidth, screenHeight) # 未奏效
  10. while 1:
  11. width, height = pg.position()
  12. print(width, height)
  13. time.sleep(0.5)
  14. ####################################### 方法二:根据截图定位 ####################################
  15. # locateOnScreen()直接用图片识别功能定位它的屏幕坐标(是元组,左、上、右、下),这个返回结果(元组)也可以给center()函数方法,转化成x,y的坐标值, 如果屏幕上找不到图像,locateOnScreen() 则返回结果为:None.
  16. # 可选confidence关键字参数指定函数在屏幕上定位图像的准确性。如果函数由于可忽略的像素差异而无法定位图像,这将非常有用:
  17. location1 = auto.locateOnScreen('01.png', confidence=0.9) #传入按钮的图片
  18. print(location1)
  19. x,y = auto.center(location1 ) # 转化为 x,y坐标
  20. pyautogui.click(location1 ) # 点击按图片查找到的位置
  21. # locateCenterOnScreen(image, grayscale=False)根据图片识别定位x,y坐标(比较好用),返回找到的第一个截图Image对象在屏幕上的中心坐标(x, y),如果没找到返回None
  22. (x, y) = pyautogui.locateCenterOnScreen('01.png',grayscale=False)
  23. # 参数grayscale是是否转灰度,您可以传递grayscale=True给locate函数以提供轻微的加速(大约30%-ish)。这会使图像和屏幕截图中的颜色去饱和,从而加快定位速度,但可能导致误判。
  24. # locateAllOnScreen(image, grayscale=False)返回找到的所有相同截图Image对象在屏幕上的坐标,返回结果是(left, top, width, height)的‘生成器’
  25. pyautogui.locateAllOnScreen('01.png',grayscale=False) #遍历找到屏幕上所有显示为xxx的图像对象坐标,转灰度操作=关闭
  26. # locate(needleImage, haystackImage, grayscale=False) 返回找到的第一个截图Image对象在haystackImage里面的坐标(left, top, width, height),如果没找到返回None
  27. pyautogui.locate('01.png')
  28. # locateAll(needleImage, haystackImage, grayscale=False)返回找到的所有相同截图Image对象在haystackImage里面的坐标(left, top, width, height)的生成器
  29. pyautogui.locateAll('01.png')

截图

截图函数 PyAutoGUI可以截取屏幕截图,将其保存到文件中,并在屏幕中查找图像。如果您有一个小图像,例如需要单击并希望在屏幕上找到它的按钮,这将非常有用。这些功能由PyScreeze模块提供,该模块与PyAutoGUI一起安装。 屏幕截图功能需要Pillow模块。OS X使用操作系统screencapture附带的命令。Linux使用该scrot命令,可以通过运行来安装。 调用screenshot()将返回Image对象(有关详细信息,请参阅Pillow或PIL模块文档)。传递文件名字符串会将屏幕截图保存到文件中,并将其作为Image对象返回。

输入文本等内容

  1. # 打开记事本并输入文本
  2. import subprocess
  3. import time
  4. import pyautogui
  5. import pyperclip
  6. subprocess.Popen('C:/Windows/notepad.exe')
  7. time.sleep(1) #1秒ウエイト
  8. pyautogui.typewrite('Hello World!') # 中文无效
  9. pyautogui.typewrite(['enter'])
  10. pyautogui.typewrite(['enter'])
  11. pyautogui.typewrite('Hello World!')
  12. time.sleep(1) #1秒ウエイト
  13. print('end')
  14. # 通过 pyperclip 库函数实现自动输入中文
  15. pyperclip.copy('文本') # 先复制
  16. pyperclip.paste() # 粘贴无效
  17. pyautogui.hotkey('ctrl', 'v') # 再粘贴

Python list数据写入文件并读取为list

需求:将一个list文件读取后,存入一个txt配置文件。存入时,发现list文件无法直接存入,必须转为str模式。 但在读取txt时,就无法恢复成list类型来读取了(准确地说,即使强行使用list读取,读出来的也是单个的字符)。

大佬的方法:
https://www.cnblogs.com/BH8ANK/p/9052086.html

  1. # 写入json文件
  2. with open('data.json', 'w') as f:
  3. json.dump(list, f)
  4. # 读取json文件
  5. with open('data.json', 'r') as f:
  6. data = json.load(f)
  7. return data

main.py 调用 moudle1.py 时相对路径的问题

https://blog.csdn.net/ljl6158999/article/details/78657799 采用转移文件的方法不推荐
https://blog.csdn.net/cxx654/article/details/79371565 推荐
解决方法:在 moudle1.py 使用相对路径时插入一下代码

  1. current_path = os.path.dirname(__file__)
  2. file_path = current_path + '../file.txt'

UiPath (RPA) 流程自动化