前言
文章起源
最进了一个诈骗群,里面就是根据一个人发的任务然后进入某个软件来点赞,一单三块,后面肯定是杀猪盘,我只想捞一波就走,就想写个自动化程序来自己完成刷单然后提交任务白嫖一波,结果我自动化程序刚刚写好,他就开始杀猪了气死我
我提醒群内的人,就被封了
就当复习自动化了!!
要想自动化步骤必须要清晰
步骤:
1:骗子在自己软件里发群公告不能复制,我们就使用文本识别然后保存到一个文件里
2:对刚刚的文本文件进行处理,得到关键信息然后返回
3:通返回来的关键信息来在选择城市,和输入关键信息搜索,然后选择点赞,或者根据关键信息后面的自动化重复几次,输入不同信息
4:对完成的任务截图保存到夜神模拟器的相册里
5:在夜神模拟器里自动发任务截图给那个人
6:半小时发群里发一次任务,于是完成一次整体操作后,每隔10min又重新识别群公告,如果关键信息一样就不运行,如果不一样就运行,无限重复
我们就成功完成了一个全自动化来完成任务,自己挂在电脑上运行就好了
源码就不放了,基本都是下面的操作。自由组合,不要一个文件写到底,有Bug的时候就裂开了,推荐将操作和主程序分开
自动化操作
需要的各种各样的库,有获得窗口位置的,进行鼠标键盘模拟的,截取窗口的
win32gui,win32api,win32con,pyautogui
获得窗口句柄
使用spyxx软件直接获取,点赞加收藏发信息给我,我发给你
也可以不使用软件获取,推荐用软件
在 Python 中,可以使用 pywin32 模块来获取窗口句柄。下面是一个例子,展示了如何使用 pywin32 获取指定窗口的句柄:
import win32gui
## 窗口类名和标题
class_name = None
window_title = "Untitled - Notepad"
## 查找窗口句柄
hwnd = win32gui.FindWindow(class_name, window_title)
## 检查是否找到了窗口
if hwnd == 0:
print(f"无法找到窗口:{window_title}")
else:
print(f"窗口句柄为:{hwnd}")
上面的代码中,我们使用 win32gui.FindWindow 函数来查找指定窗口的句柄。函数的第一个参数是窗口类名,可以为 None 表示匹配所有窗口类,第二个参数是窗口标题。如果找到了窗口,函数会返回窗口句柄,否则返回 0。
它不光是取的窗口的位置,要想你的自动化程序到达真正的自动化,就要使用句柄,我们的一切模拟操作都是是在以句柄为基础,比如点击操作,我们的确可以直接选定屏幕坐标进行点击,但我的窗口一但换文置,你下次要么重新选定坐标,要么就是将窗口移动回原处。但我们用句柄为基础就不一样了,只需要以句柄坐标为基础,在什么对x,y坐标进行偏移量加减就就不一样了。
获取鼠标位置
import pymouse
print('点击回车查看当前鼠标的坐标')
while True:
_ = input() # input起到阻塞程序的作用
print(pymouse.PyMouse().position()) # 获取当前鼠标指针的坐标,是屏幕大小为100%时的,这是个大坑
点击操作
from pymouse import PyMouse
m = PyMouse() # 创建鼠标对象
m.move(x,y) # 移动到目标位置
m.click(x, y, 1, 1) # 点击目标第一个1是点左键,2就是右键。最/后一个1是点击次数
我们发现通过截图软件得到的地址不能进行点击,那是应为我们的屏幕被放大了
如果你的屏幕被放大,那么PyMouse可以通过以下方法来进行调整:
首先,你需要确定你的屏幕被放大的比例是多少。这可以在屏幕显示设置中找到。在 Windows 系统中,你可以在「显示设置」菜单中找到缩放和布局选项,并查看缩放百分比。
在你的 Python 脚本中,你需要导入 PyMouse 库,并创建一个 PyMouse 对象:
import pymouse
m = pymouse.PyMouse()
接下来,你需要告诉 PyMouse 屏幕被放大了多少倍。这可以通过设置鼠标位置的比例来实现。假设你的屏幕被放大了 200%(即缩放比例为 2.0)
你可以使用 PyMouse 的其他函数来模拟鼠标操作。例如,如果你想将鼠标移动到屏幕上的特定位置,你可以使用以下代码:
m.move(x_pos / 2, y_pos / 2)
这里的 x_pos 和 y_pos 是你想要移动到的位置的坐标,除以 2 是因为屏幕被放大了两倍。我们要变回去
注意,你需要根据你的具体情况调整上述代码中的屏幕比例和坐标值。
什么是偏移量加减?
比如我要点击某个窗口的某个地方,设这个窗口的句柄是0x000710CC
点击目标位置,(1381,111)是我从截图软件得的目标值,要除去自己的显示大小,才是真正的该位置
def point(x,y):
from pymouse import PyMouse
m = PyMouse()
m.move(x,y)
m.click(x, y, 1, 1)
point(int(1381/(3/2)), int(111/(3/2)))
如果是通过前面获取鼠标位置的代码获取的目标值就直接填就行
点击目标位置,下面这个才是我们要写的,以窗口为相对位置进行点击
import win32gui
def point(x,y):
from pymouse import PyMouse
m = PyMouse()
m.move(x,y)
m.click(x, y, 1, 1)
rect = win32gui.GetWindowRect(0x000710CC)
point(rect[0]+53,rect[1]+(42))
53和42,就是该点离左上角的距离
两个的区别就是一个可以随意的移动窗口也可以进行点击到目标位置
通过剪贴版输入中文,或文本
def key(str):
import pyautogui
import pyperclip
# 将中文字符复制到剪贴板
pyperclip.copy(f"{str}")
# 将剪贴板中的内容粘贴到当前焦点应用程序中
pyautogui.hotkey('ctrl', 'v')
自动提取文本操作
先要有个可以识别文本的软件就可以
def Picture(x,y):
import pyautogui
pyautogui.hotkey('Win', 'space') # 打开识别软件的快捷键
import win32api
import win32con
import time
# 起点坐标
start_x, start_y = x+15, y+170 # 相对窗口的坐标
win32api.SetCursorPos((start_x, start_y)) # 鼠标移动到这
# 终点坐标
end_x, end_y = x+857, y+719
# 鼠标按下左键
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, start_x, start_y, 0, 0)
# 鼠标移动到终点坐标
step_x = (end_x - start_x) / 10.0 # 每次的移动距离
step_y = (end_y - start_y) / 10.0 # 每次的移动距离
for i in range(10):
new_x = int(start_x + step_x * (i + 1))
new_y = int(start_y + step_y * (i + 1))
win32api.SetCursorPos((new_x, new_y))
time.sleep(0.1)
# 鼠标放开左键
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, end_x, end_y, 0, 0)
截取屏幕保存到目标位置
def jietu(hwnd,name):
import win32gui
from PIL import ImageGrab
rect = win32gui.GetClientRect(hwnd)
left, top, right, bottom = rect
# 截图并保存
img = ImageGrab.grab((left, top, right, bottom))
img.save(fr'C:\Users\Blue\Nox_share\ImageShare\Screenshots\{name}.png')
win32gui.GetWindowRect(hwnd) 函数与 win32gui.GetClientRect(hwnd) 函数类似,也是 Python Win32 扩展库中的一个函数,不同的是 GetWindowRect 获取的是指定窗口的外框矩形,而 GetClientRect 获取的是指定窗口的客户区域矩形。
具体来说,hwnd 是指定窗口的句柄,函数返回一个矩形(left, top, right, bottom),表示窗口的外框矩形的坐标和大小。其中,left 和 top 分别表示窗口左上角的 x 坐标和 y 坐标,而 right 和 bottom 则表示窗口右下角的 x 坐标和 y 坐标。
与此不同的是,GetClientRect 函数返回的是窗口的客户区域矩形,这个矩形是在窗口的边框内部的,而 GetWindowRect 函数返回的则是包括窗口边框在内的矩形。
总之,GetWindowRect 与 GetClientRect 的区别在于它们获取的是窗口的不同矩形区域,前者包括窗口的整个区域,后者仅包括窗口的客户区域。这些信息可以帮助开发者在处理窗口时,根据需要选择合适的矩形区域来定位和处理窗口内的控件和内容。
写入文本到记事本
import pyautogui
import os
import time
import multiprocessing
def one():
time.sleep(1)
pyautogui.hotkey('ctrl', 'a')
pyautogui.hotkey('ctrl', 'v')
pyautogui.hotkey('ctrl', 's')
os.system("taskkill /im notepad.exe /f")
if __name__=="__main__":
a_p = multiprocessing.Process(target=one, args=[]) # args里用list传参就行了,不要只写个参数,或者用元组(5,)应为只有一个参数不要忘记“,”号
a_p.start()
os.system(r"notepad d:\BlackTool\Microsoft VS Code\Python Code\Mode\out.txt")
用多进程写的原因
os.system(r"notepad d:\BlackTool\Microsoft VS Code\Python Code\Mode\out.txt")
不自己手动关闭就会一直运行,但我们是自动化
os.system(“taskkill /im notepad.exe /f”) 关闭,但前面还在运行我们要怎么关闭呢?
所以我们使用多进程,来进行,通过另一个进程来关闭它,然后使主进程继续运行
高级点击,匹配图片点击
import time
import pyautogui
# 获取图片方式1
im = pyautogui.screenshot() # 截取整个屏幕
im.save("img_S.png")
# 坐标截图软件就可以了
om = im.crop((184, 1306, 216, 1340)) # 根据截取的屏幕仅截取“带赞的手势图片”,可以用pyautogui.mouseInfo()获取图片的位置(284,416,302,438)
om.save("dianzan.png") # 将图片保存供pyautogui.locateOnScreen()使用
# 获取图片方式2 我更喜欢2
# im=ImageGrab.grab((401, 374, 460, 433)) # 要先导入库 from PIL import ImageGrad
# im.save("dianzan.png")
def point():
time.sleep(0.5)
xy = pyautogui.locateOnScreen('dianzan.png') # 是在寻找刚才保存点赞手势图片
center = pyautogui.center(xy) # 寻找图片的中心,返回图片中心在屏幕上的位置
pyautogui.click(center)
print('点赞成功!')
count = 10 # 为了防止一直运行下去,点一点数量的赞就结束,自己定义
while count:
if pyautogui.locateOnScreen('dianzan.png'):
point() # 调用点赞函数
count -= 1
else:
pyautogui.scroll(-500) # 本页没有图片后,滚动鼠标;
print('没有找到目标,屏幕下滚~')
print("完成")
自动化
学习的库有很多呀
win32gui 是 Python 中的一个模块,它提供了访问部分 Windows API 函数的能力,用于与 Windows 应用程序中的图形用户界面 (GUI) 元素进行交互。它可以用于自动化任务,例如在 Windows 程序中查找特定的窗口或控件,并模拟用户操作。
pyautogui 是一个 Python 库,用于自动化鼠标和键盘操作。它可以用于自动执行重复的任务、测试 GUI 应用程序或创建自动化脚本。
PIL (Python Imaging Library) 或 Pillow 是 Python 中一个图像处理库,它支持许多常用的图像格式,并提供了许多操作图像的功能,例如裁剪、旋转、缩放、调整亮度和对比度等。
pymouse 是一个 Python 库,用于控制鼠标的移动和点击。它可以用于编写自动化脚本,例如模拟鼠标操作来自动化一些任务。
Selenium 是一个用于自动化 Web 浏览器的 Python 库。它可以模拟用户在浏览器中的行为,例如打开网页、点击链接、填写表单等。它常用于测试 Web 应用程序或进行网络爬虫。