自动化播报技术攻关
- 企业微信群机器人播报
- Python编辑发送内容
- 定时触发:腾讯云函数
a. 测试成功,但运行结果无法返回到调用方:把代码放入函数里面 - Python对excel刷新数据,截图
a. 更新数据源
b. 刷新透视表
c. 截图固定单元格区域
python本地部署云函数 使用SCF CLI命令行工具 - 安装第三方库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编码):
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa' \
-H 'Content-Type: application/json' \
-d '
{
"msgtype": "text",
"text": {
"content": "hello world"
}
}'
- 当前自定义机器人支持文本(text)、markdown(markdown)、图片(image)、图文(news)四种消息类型。
- 机器人的text/markdown类型消息支持在content中使用<@userid>扩展语法来@群成员
消息类型及数据格式
文本类型
{
"msgtype": "text",
"text": {
"content": "广州今日天气:29度,大部分多云,降雨概率:60%",
"mentioned_list":["wangqing","@all"],
"mentioned_mobile_list":["13800001111","@all"]
}
}
参数 | 是否必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为text |
content | 是 | 文本内容,最长不超过2048个字节,必须是utf8编码 |
mentioned_list | 否 | userid的列表,提醒群中的指定成员(@某个成员),@all表示提醒所有人,如果开发者获取不到userid,可以使用mentioned_mobile_list |
mentioned_mobile_list | 否 | 手机号列表,提醒手机号对应的群成员(@某个成员),@all表示提醒所有人 |
markdown类型
{
"msgtype": "markdown",
"markdown": {
"content": "实时新增用户反馈<font color=\"warning\">132例</font>,请相关同事注意。\n
>类型:<font color=\"comment\">用户反馈</font> \n
>普通用户反馈:<font color=\"comment\">117例</font> \n
>VIP用户反馈:<font color=\"comment\">15例</font>"
}
}
参数 | 是否必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为markdown |
content | 是 | markdown内容,最长不超过4096个字节,必须是utf8编码 |
目前支持的markdown语法是如下的子集:
一、标题 (支持1至6级标题,注意#与文字中间要有空格)
# 标题一
## 标题二
### 标题三
#### 标题四
##### 标题五
###### 标题六
二、加粗
**bold**
三、链接
[这是一个链接](http://work.weixin.qq.com/api/doc)
四、行内代码段(暂不支持跨行)
`code`
五、引用
> 引用文字
六、字体颜色(只支持3种内置颜色)
<font color="info">绿色</font>
<font color="comment">灰色</font>
<font color="warning">橙红色</font>
图片类型
{
"msgtype": "image",
"image": {
"base64": "DATA",
"md5": "MD5"
}
}
参数 | 是否必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为image |
base64 | 是 | 图片内容的base64编码 |
md5 | 是 | 图片内容(base64编码前)的md5值 |
图文类型
{
"msgtype": "news",
"news": {
"articles" : [
{
"title" : "中秋节礼品领取",
"description" : "今年中秋节公司有豪礼相送",
"url" : "www.qq.com",
"picurl" : "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"
}
]
}
}
参数 | 是否必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为news |
articles | 是 | 图文消息,一个图文消息支持1到8条图文 |
title | 是 | 标题,不超过128个字节,超过会自动截断 |
description | 否 | 描述,不超过512个字节,超过会自动截断 |
url | 是 | 点击后跳转的链接。 |
picurl | 否 | 图文消息的图片链接,支持JPG、PNG格式,较好的效果为大图 1068455,小图150150。 |
文件类型
{
"msgtype": "file",
"file": {
"media_id": "3a8asd892asd8asd"
}
}
参数 | 是否必填 | 说明 |
---|---|---|
msgtype | 是 | 消息类型,此时固定为file |
media_id | 是 | 文件id,通过下文的文件上传接口获取 |
消息发送频率限制
文件上传接口
素材上传得到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发消息时,展示的文件名由该字段控制
请求示例:
POST https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa&type=file HTTP/1.1
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
Content-Length: 220
---------------------------acebdf13572468
Content-Disposition: form-data; name="media";filename="wework.txt"; filelength=6
Content-Type: application/octet-stream
mytext
---------------------------acebdf13572468--
返回数据:
{
"errcode": 0,
"errmsg": "ok",
"type": "file",
"media_id": "1G6nrLmr5EC3MMb_-zK1dDdzmd0p7cNliYu9V5w7o8K0",
"created_at": "1380000000"
}
参数说明:
参数 | 说明 |
---|---|
type | 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file) |
media_id | 媒体文件上传后获取的唯一标识,3天内有效 |
created_at | 媒体文件上传时间戳 |
上传的文件限制:
- 要求文件大小在5B~20M之间
腾讯云函数
- 新建函数
- 编辑函数
- 在线编辑
- 本地上传zip包
- 本地上传文件夹
- 通过cos上传zip包
- 创建触发
- 定时触发
- COS触发
- Ckafka触发
- API网关触发器
- CLS日志触发
注:要把代码放到**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
测试实例——文本
# -*- coding: utf8 -*-
import json
def main_handler(event, context):
print("Received event: " + json.dumps(event, indent = 2))
print("Received context: " + str(context))
import requests
headers = {
'Content-Type': 'application/json',
}
params = (
('key', 'f5d6e41d-5780-49a1-bd05-aa9f3688366d'),
)
data = json.dumps({
"msgtype": "text",
"text": {
"content": "各位院长晚上好!忙碌之余别忘了更新今天的名片记录哦!",
"mentioned_list":["wangqing","@all"],
#"mentioned_mobile_list":["@all"]
}
})
response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
print(response.content.decode())
测试实例——Markdown
import requests
import json
headers = {'Content-Type': 'application/json',}
params = (
('key', '00236cb4-2c2f-4eb7-b00b-88109ccb3b8b'),
)
data = json.dumps({
"msgtype": "markdown",
"markdown": {
"content": "实时新增用户反馈<font color=\"warning\">132例</font>",
}
})
response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
print(response.content.decode())
测试实例——图文
import requests
import json
headers = {'Content-Type': 'application/json',}
params = (
('key', '00236cb4-2c2f-4eb7-b00b-88109ccb3b8b'),
)
data = json.dumps({
"msgtype": "news",
"news": {
"articles" : [
{
"title" : "更新今日名片记录",
"description" : "忙碌之余,记得更新",
"url" : "https://www.kdocs.cn/p/95310168069",
"picurl" : "https://ftp.bmp.ovh/imgs/2020/12/fd5ea9ef254f2e31.png"
}
]
}
})
response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers,params=params, data=data)
print(response.content.decode())
网络案例1:
import requests
headers = {
'Content-Type': 'application/json',
}
# 注意这段key一定要妥善保护 不能暴露到外部空间 否则安全隐患很多
params = (
('key', 'f5d6e41d-5780-49a1-bd05-aa9f3688366d'),
)
# data = '\n {\n "msgtype": "text",\n "text": {\n "content": "hello world"\n }\n }'
data = {
"msgtype": "text",
"text": {
"content": "广州今日天气:29度,大部分多云,降雨概率:60%",
"mentioned_list":["wangqing","@all"],
"mentioned_mobile_list":["@all"]
}
}
response = requests.post('https://qyapi.weixin.qq.com/cgi-bin/webhook/send', headers=headers, params=params, data=data)
print(response.content.decode())
网络案例2:
from WorkWeixinRobot.work_weixin_robot import WWXRobot
wwx = WWXRobot(key='你自己机器人的值')
wwx.send_text(content='Hello')
网络案例3:
import requests, json
import datetime
import time
wx_url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4baf3c3c-f3ea-4554-9a45-9fbbb2076269" # 测试机器人1号
send_message = "测试:测试机器人1号………………………………!"
def get_current_time():
"""获取当前时间,当前时分秒"""
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
hour = datetime.datetime.now().strftime("%H")
mm = datetime.datetime.now().strftime("%M")
ss = datetime.datetime.now().strftime("%S")
return now_time, hour, mm, ss
def sleep_time(hour, m, sec):
"""返回总共秒数"""
return hour * 3600 + m * 60 + sec
def send_msg(content):
"""艾特全部,并发送指定信息"""
data = json.dumps({"msgtype": "text", "text": {"content": content, "mentioned_list":["@all"]}})
r = requests.post(wx_url, data, auth=('Content-Type', 'application/json'))
print(r.json)
def every_time_send_msg(interval_h=0, interval_m=1, interval_s=0, special_h="00", special_m="00", mode="special"):
"""每天指定时间发送指定消息"""
# 设置自动执行间隔时间
second = sleep_time(interval_h, interval_m, interval_s)
# 死循环
while 1 == 1:
# 获取当前时间和当前时分秒
c_now, c_h, c_m, c_s = get_current_time()
print("当前时间:", c_now, c_h, c_m, c_s)
if mode == "special":
if c_h == special_h and c_m == special_m:
# 执行
print("正在发送...")
send_msg(send_message)
else:
send_msg(send_message)
print("每隔" + str(interval_h) + "小时" + str(interval_m) + "分" + str(interval_s) + "秒执行一次")
# 延时
time.sleep(second)
if __name__ == '__main__':
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 脚本
import win32com.client as win32
Xlsx = win32.DispatchEx('Excel.Application')
Xlsx.DisplayAlerts = True
Xlsx.Visible = True
book = Xlsx.Workbooks.Open('C:/Test_Excel/Essai_1.xlsx')
# Refresh my two sheets
book.RefreshAll()
book.Save()
book.Close()
Xlsx.Quit()
# del book
# del Xlsx
对Excel文件进行写入操作:
Dispatch()在创建对象实例前会尝试使用GetObject(),如果有运行的实例,会得到该实例对象;
DispatchEx()直接创建一个对象实例.
一般用DispatchEx()好点,否则就对已经打开的对象实例进行操作了,大多数时候并非用户的意图.
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
# 导入模块
import win32com.client
# 打开Excel
Application = win32com.client.Dispatch("Excel.Application")
# 或者使用下面的方法,使用启动独立的进程:
# Application = win32com.client.DispatchEx("Excel.Application")
# 后台运行,显示程序界面,不警告
Application.Visible = 1 # 调试阶段建议打开
Application.DisplayAlerts = 0
# 新建一个文档
Workbook = Application.Workbooks.Add()
# 打开一个文档
Workbook = Application.Workbooks.Open("F:\\test.xlsx")
# 根据工作表名
Base = Workbook.Worksheets("Sheet1")
# 根据工作表顺序
# Base = Workbook.Worksheets(1)
# 接受当前工作表
# Base = Workbook.ActiveSheet
# 添加内容: 0.0, 0.5, 1.0
Base.Cells(1, 1).Value = 'Values'
Base.Cells(1, 2).Value = 0.0
Base.Cells(1, 3).Value = 0.5
Base.Cells(1, 4).Value = 1.0
Workbook.SaveAs("F:\\test.xlsx")
# 关闭文档
Workbook.Close()
# 退出Excel
Application.Quit()
对Excel文件进行读取操作:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
__author__ = 'mayi'
# 导入模块
import win32com.client
# 打开Excel
Application = win32com.client.Dispatch("Excel.Application")
# 或者使用下面的方法,使用启动独立的进程:
# Application = win32com.client.DispatchEx("Excel.Application")
# 后台运行,显示程序界面,不警告
Application.Visible = 1 # 调试阶段建设打开
Application.DisplayAlerts = 0
# 打开一个文档
Workbook = Application.Workbooks.Open("F:\\test.xlsx")
Base = Workbook.Worksheets(1)
# 接受当前工作表
Base = Workbook.ActiveSheet
#列数
ncols = 0
while True:
cell_value = Base.Cells(1, ncols + 1).Value
if cell_value:
ncols += 1
else:
break
# 行数
nrows = 0
while True:
cell_value = Base.Cells(nrows + 2, 1).Value # 第一行表头
if cell_value:
for col in range(ncols):
cell_key = Base.Cells(1, col + 1).Value
cell_value = Base.Cells(nrows + 2, col + 1).Value
print(cell_key, "=>", cell_value, end = "\t")
print("")
nrows += 1
else:
break
# 关闭文档
Workbook.Close()
# 退出Excel
Application.Quit()
Python基础系列讲解-自动控制windows桌面
python 自动刷新网页
if else优化
字符串拼接
joiner = '-'
list = ['1','2','3']
a = joiner.join(list)
# '1-2-3'
判断列表为空
# 方法一
if mylist:
# Do something with my list
else:
# The list is empty
# 方法二
list = []
if len(list) == 0:
print('list is empty')
# 方法三
list = []
if not list:
print('list is empty')
#方法四
EmptyList = []
list = []
if list==EmptyList:
print('list is empty')
Python 如何启动其他程序
方法一:os.startfile() ,直接启动 exe 文件,部分软件启动需配置参数不能直接启动,可通过快捷方式启动
import os
os.startfile(r"F:\Program Files\WeChat\WeChat.exe")
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 : 是否显示窗口
import win32api
win32api.ShellExecute(0, 'open', "F:\Program Files\WeChat\WeChat.exe", '', '', 0)
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 创建程序的属性
import win32process
win32process.CreateProcess("F:\Program Files\WeChat\WeChat.exe", '', None, None, 0, win32process.CREATE_NO_WINDOW, None, None, win32process.STARTUPINFO())
- 方法四:pyautogui 库
通过pyautogui进行图标识别,然后模拟双击图标启动。该方式稳定性不高,可移植性较差
import pyautogui
cposition = pyautogui.locateOnScreen(r"E:\L3.bmp") #根据图片定位
cc = pyautogui.center(cposition) #获取这个软件位置的中心
pyautogui.moveTo(cc[0],cc[1]) #把鼠标移动到这个位置
pyautogui.click(clicks=2) #双击
- 方法五:subprocess 库
subprocess.Popen('C:/Windows/notepad.exe')
Pyautogui 自动化(控制鼠标与键盘)
PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux)。
# 安装 pyautogui
pip install pyautogui # conda install 貌似会出错
############################################# 准备工作 #############################################
import pyautogui as pg
import datetime
# 保护措施,避免失控
def SaveToExcel():
While True:
pg.FAILSAFE = True
# 为所有的PyAutoGUI函数增加延迟。默认延迟时间是0.1秒。
pyautogui.PAUSE = 0.5
# 设置输入时的时间间隔
secs_between_keys = 0.1
# 控制鼠标移动速度
num_seconds = 0.2
# 获取屏幕分辨率(分辨率*分辨率)
screenWidth, screenHeight = pg.size()
# 获取当前位置
x, y = pg.position()
print('当前鼠标的X轴、Y轴位置为:'.{}format(x, y))
# 判断坐标是否在屏幕范围内
pg.onScreen(100, 200) # True
pg.onScreen(100,2000) # False
鼠标操作
mouseDown()、mouseUp();另有在click()之上封装的rightClick()、middleClick()、doubleClick()、tripleClick()等函数
# 移动鼠标到指定位置
pg.moveTo(x=821, y=60, duration=0.25) # duration 移动过渡时间
# 点击鼠标
pg.click(x=821, y=60, button='left')
# 相对位置移动
pg.moveTo(sizex/2,sizey/2,duration=1)
# 绝对位置移动
pg.moveRel(100, -200, duration=0.5)
# 移动至屏幕中心点击一下左键,过渡时间0.5秒
In [16]: pyautogui.click(sizex/2,sizey/2, duration=0.5)
# 不指定x、y,在当前位置点击一下右键
In [17]: pyautogui.click(button='right')
# 移动至(100,100)点击3次左键,点击间隔0.1s,鼠标移动过渡时间0.5秒
In [18]: pyautogui.click(100,100, clicks=3,interval=0.1,duration=0.5)
# 移动至(100,100)点击2次右键,点击间隔0.5s,鼠标移动过渡时间0.2秒
In [19]: pyautogui.click(100,100, clicks=2,interval=0.5,button='right',duration=0.2)
# 滚动鼠标滚轮
# 鼠标位置不动,向上回滚2个单位,项目文档对滚动量参数说明不详
In [22]: pyautogui.scroll(2)
# 鼠标移动至(1000,700),前下滚动10个单位
# 运行发现鼠标并没有动
In [26]: pyautogui.scroll(-10,1000,700)
# 鼠标拖拽
# 将鼠标从当前位置拖至屏幕中心,默认左键
In [32]: pyautogui.dragTo(sizex/2,sizey/2)
# 将鼠标从当前位置向左100像素、向右200像素拖动,过渡时间0.5秒,指定右键
In [33]: pyautogui.dragRel(-100,200,duration=0.5,button='right')
键盘控制
控制按键,也是一个press()函数基本把活包干,按键动作往细分解包含keyDown()和keyUp()两个过程;在此基础上封装,有typewrite()和hotkey()两个高阶一点的函数,分别用于输入字符串和按快捷键。
# 键名用字符串表示,支持的所有键名,存在pyautogui.KEYBOARD_KEYS变量中,包括26个字母、数字、符号、F1~F20、方向等等所有按键
In [4]: pyautogui.press('a') # 按字母A键,字母支持大小写
# 程序向终端输入了字符a,若程序运行时输入法为中文状态,由于没有继续输入空格或回车,输入法仅列出候选字,并不会输入到终端
In [5]: a
# 传入键名列表(按键p、按键y、空格),按键之间间隔0.1秒(默认0)
In [6]: pyautogui.press(['p','y','space'], interval=0.1)
# 运行前将输入法切换到中文状态,往终端直接输入了“培养”
In [7]: 培养
# typewrite方式一:传入字符串,不支持中文字符,因为函数无法知道输入法需要什么按键才能得到中文字符
In [9]: pyautogui.typewrite('hello, PyAutoGUI!\n')
# 程序把字符串"'hello, PyAutoGUI!"和换行符输入到了终端
In [10]: hello, PyAutoGUI!
...:
# typewrite方式二:传入键名列表,按键之间间隔0.1秒(默认0)
In [11]: pyautogui.typewrite(['s','r','f','space'], interval=0.1)
# 运行前将输入法切换到中文状态,往终端直接输入了“输入法”3个字
In [12]: 输入法
# 大小写字母是自动支持的,仍然尝试一次切换到大写
In [13]: pyautogui.typewrite(['capslock','p','y'])
# CapsLock按键灯被点亮,程序往终端输入了"PY"
In [14]: PY
# hotkey屏蔽了需要反复keyDown、keyUp的细节,参数是任意个键名,而非列表
In [18]: pyautogui.hotkey('ctrl', 'shift', 'esc') #调出任务管理器
In [19]:pyautogui.hotkey('alt','ctrl','delete') # 并未调出重启界面
auto.perss('enter') 按下键盘的回车键
auto.press('f1') 按下键盘的F1
auto.press('left') 按下键盘上的左方向键左箭头
# 组合按键
# hotkey()可以传递几个键字符串,这些字符串将‘按顺序按下’,然后以‘反向顺序释放’。
auto.hotkey('ctrl','shift','T')
# 相当于
auto.keyDown('ctrl')
auto.keyDown('shift')
auto.keyDown('T')
auto.keyUp('T')
auto.keyUp('shift')
auto.keyUp('ctrl')
消息窗口
PyAutoGUI利用pymsgbox的功能,以JavaScript风格函数提供消息框功能,包括alert()、confirm()、prompt() 、password(),连参数都是一致的,熟悉JavaScript的朋友不会陌生
In [24]: pyautogui.alert(text='警告',title='PyAutoGUI消息框',button='OK')
Out[24]: 'OK' # 点击的按键被返回
In [28]: pyautogui.confirm(text='请选择',title='PyAutoGUI消息框',buttons=['1','2'
...: ,'3'])
Out[28]: '2' # 点击的按键被返回
In [30]: pyautogui.prompt(text='请输入',title='PyAutoGUI消息框',default='请输入')
Out[30]: 'input by 伪码人' # 点OK按钮后返回输入内容
In [32]: pyautogui.password(text='输入密码',title='PyAutoGUI消息框',default='',mask='*')
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)
<a name="E7RLa"></a>
## 定位
> 坐标轴:电脑屏幕的左上角是位置(0,0),向右X坐标正方向,向下Y坐标正方向
> 在#1920 x 1080屏幕上,定位函数调用大约需要1或2秒 ,不适用于游戏脚本调用,原因是太慢
```python
##################################### 方法一:手动获取 #########################################
def get_mouse_position():
screenWidth, screenHeight = pg.size()
print('屏幕尺寸为:'.format(screenWidth, screenHeight) # 未奏效
while 1:
width, height = pg.position()
print(width, height)
time.sleep(0.5)
####################################### 方法二:根据截图定位 ####################################
# locateOnScreen()直接用图片识别功能定位它的屏幕坐标(是元组,左、上、右、下),这个返回结果(元组)也可以给center()函数方法,转化成x,y的坐标值, 如果屏幕上找不到图像,locateOnScreen() 则返回结果为:None.
# 可选confidence关键字参数指定函数在屏幕上定位图像的准确性。如果函数由于可忽略的像素差异而无法定位图像,这将非常有用:
location1 = auto.locateOnScreen('01.png', confidence=0.9) #传入按钮的图片
print(location1)
x,y = auto.center(location1 ) # 转化为 x,y坐标
pyautogui.click(location1 ) # 点击按图片查找到的位置
# locateCenterOnScreen(image, grayscale=False)根据图片识别定位x,y坐标(比较好用),返回找到的第一个截图Image对象在屏幕上的中心坐标(x, y),如果没找到返回None
(x, y) = pyautogui.locateCenterOnScreen('01.png',grayscale=False)
# 参数grayscale是是否转灰度,您可以传递grayscale=True给locate函数以提供轻微的加速(大约30%-ish)。这会使图像和屏幕截图中的颜色去饱和,从而加快定位速度,但可能导致误判。
# locateAllOnScreen(image, grayscale=False)返回找到的所有相同截图Image对象在屏幕上的坐标,返回结果是(left, top, width, height)的‘生成器’
pyautogui.locateAllOnScreen('01.png',grayscale=False) #遍历找到屏幕上所有显示为xxx的图像对象坐标,转灰度操作=关闭
# locate(needleImage, haystackImage, grayscale=False) 返回找到的第一个截图Image对象在haystackImage里面的坐标(left, top, width, height),如果没找到返回None
pyautogui.locate('01.png')
# locateAll(needleImage, haystackImage, grayscale=False)返回找到的所有相同截图Image对象在haystackImage里面的坐标(left, top, width, height)的生成器
pyautogui.locateAll('01.png')
截图
截图函数 PyAutoGUI可以截取屏幕截图,将其保存到文件中,并在屏幕中查找图像。如果您有一个小图像,例如需要单击并希望在屏幕上找到它的按钮,这将非常有用。这些功能由PyScreeze模块提供,该模块与PyAutoGUI一起安装。 屏幕截图功能需要Pillow模块。OS X使用操作系统screencapture附带的命令。Linux使用该scrot命令,可以通过运行来安装。 调用screenshot()将返回Image对象(有关详细信息,请参阅Pillow或PIL模块文档)。传递文件名字符串会将屏幕截图保存到文件中,并将其作为Image对象返回。
输入文本等内容
# 打开记事本并输入文本
import subprocess
import time
import pyautogui
import pyperclip
subprocess.Popen('C:/Windows/notepad.exe')
time.sleep(1) #1秒ウエイト
pyautogui.typewrite('Hello World!') # 中文无效
pyautogui.typewrite(['enter'])
pyautogui.typewrite(['enter'])
pyautogui.typewrite('Hello World!')
time.sleep(1) #1秒ウエイト
print('end')
# 通过 pyperclip 库函数实现自动输入中文
pyperclip.copy('文本') # 先复制
pyperclip.paste() # 粘贴无效
pyautogui.hotkey('ctrl', 'v') # 再粘贴
Python list数据写入文件并读取为list
需求:将一个list文件读取后,存入一个txt配置文件。存入时,发现list文件无法直接存入,必须转为str模式。 但在读取txt时,就无法恢复成list类型来读取了(准确地说,即使强行使用list读取,读出来的也是单个的字符)。
大佬的方法:
https://www.cnblogs.com/BH8ANK/p/9052086.html
# 写入json文件
with open('data.json', 'w') as f:
json.dump(list, f)
# 读取json文件
with open('data.json', 'r') as f:
data = json.load(f)
return data
main.py 调用 moudle1.py 时相对路径的问题
https://blog.csdn.net/ljl6158999/article/details/78657799 采用转移文件的方法不推荐
https://blog.csdn.net/cxx654/article/details/79371565 推荐
解决方法:在 moudle1.py 使用相对路径时插入一下代码
current_path = os.path.dirname(__file__)
file_path = current_path + '../file.txt'