Python模拟屏幕点击自动完成词达人任务,附源码(详细改进篇)

您所在的位置:网站首页 词达人考试可以切屏吗 Python模拟屏幕点击自动完成词达人任务,附源码(详细改进篇)

Python模拟屏幕点击自动完成词达人任务,附源码(详细改进篇)

2023-12-19 02:27| 来源: 网络整理| 查看: 265

2021年12月,该项目已经停止更新了

(未经许可,禁止转载) 如何配置fiddler可以参考我之前的博客 该贴是以微信词达人为基础实践而写,如果我们并没有使用词达人,该源码中关键代码部分和模拟点击原理希望对大家有帮助。

某度API申请

进入百度AI控制台:百度AI控制台,没有账号就注册一个 在这里插入图片描述 在这里插入图片描述 随便填就行 在这里插入图片描述 立即创建后查看 在这里插入图片描述

过程解析

先上源代码

import sys import pyautogui import winsound import operator from pymouse import PyMouse import requests import base64 import os import json import time import time import win32gui, win32ui, win32con, win32api type = 0 lodec = 'C:\\responseBody.txt' APP_ID = '*****' # 刚才获取的 ID,下同 API_KEY = '******' SECRECT_KEY = '******' ACCESS_TOKEN = '你生成的access_token' #获取token #第一次使用请先在main中调用一次getToken(),将其返回值access_token填到全局变量ACCESS_TOKEN 中 def getToken(): # client_id 为官网获取的AK, client_secret 为官网获取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRECT_KEY response = requests.post(host) if response: return response.json().access_token def init(): print("=====================词达人小工具3.0=====================\n\n") time.sleep(1) print('第一次使用请先在main中调用一次getToken(),将其返回值access_token填到全局变量ACCESS_TOKEN 中') if os.path.getsize(lodec) == 0: print("没有在C盘中找到资源,检查办法:\n(1):手动答题一道然后再打开本程序(前面的听力部分不算)\n(2):查看C盘下是否存在responseBody.txt文件\n(3):检查Fidder配置\n程序将在10秒后自动退出") time.sleep(10) exit() print("资源检查成功,开始使用\n请将该窗口放置合适位置\n程序会每10题暂停3秒,3秒期间你可以操作你的电脑") time.sleep(1) #读取答案 def getAnswer(): print('搜寻答案....') answers = [] data = json.loads(open(lodec, "r", encoding='utf-8').read()); #多选 if data['data']['topic_mode'] in [31] : options = data['data']['options'] for option in options: if option['answer']==True : answers.append(option['content']) #单选 if data['data']['topic_mode'] in [11,22,42] : options = data['data']['options'] for option in options: if option['answer']==True : answers.append(option['content'].replace(' ', '').replace(';', ';').replace(',', ',').replace('.', '').replace('…', '')) #选词 if data['data']['topic_mode'] in [32] : options = data['data']['answer_content']['answer_arr'] for option in options: #print(option) answers.append(option) #填空 if data['data']['topic_mode'] in [51] : type = 1 answers.append(data['data']['answer_content']) for a in answers: print(a) return answers #抓取图片 def getPc(pcname): hwnd = 0 # 窗口的编号,0号表示当前活跃窗口 # 根据窗口句柄获取窗口的设备上下文DC(Divice Context) hwndDC = win32gui.GetWindowDC(hwnd) # 根据窗口的DC获取mfcDC mfcDC = win32ui.CreateDCFromHandle(hwndDC) # mfcDC创建可兼容的DC saveDC = mfcDC.CreateCompatibleDC() # 创建bigmap准备保存图片 saveBitMap = win32ui.CreateBitmap() # 获取监控器信息 MoniterDev = win32api.EnumDisplayMonitors(None, None) w = 480 h = 1040 # w,h   #图片大小 # 为bitmap开辟空间 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 高度saveDC,将截图保存到saveBitmap中 saveDC.SelectObject(saveBitMap) # 截取从左上角(0,0)长宽为(w,h)的图片 saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY) saveBitMap.SaveBitmapFile(saveDC, pcname) #文字位置 def getPosition(answers, pcname): positions = [] request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general" # 二进制方式打开图片文件 f = open(pcname, 'rb') img = base64.b64encode(f.read()) params = {"image":img} access_token = ACCESS_TOKEN request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) if response: for r in response.json()['words_result']: flag = False #如果包含中文 for ch in r['words']: if u'\u4e00' >= ch or ch >= u'\u9fff': flag = True if flag: w = r['words'][4:].replace('.', '') else: w = r['words'] for a in answers: if w.find(str(a)) != -1 or str(a).find(w) != -1: tu = [r['location']['left'], r['location']['top']] positions.append(tu) return positions #屏幕点击答题 def makeAnswer(positions): m = PyMouse() for p in positions: #m.move(p[0], p[1]) m.click(p[0], p[1]) #移动并且在(x,y)位置左击 time.sleep(0.5) m.click(400,1000) if __name__ == "__main__": pcname = 'answers.jpg' init() i = 0 while True: i += 1 #获取正确答案集合 answers = getAnswer() #截取图片 getPc(pcname) #根据正确答案找到答案位置 positions = getPosition(answers, pcname) #点击 makeAnswer(positions) #每10题停留3秒:避免不可控 if i>10: time.sleep(3) print("-------------暂停时期:3秒后继续答题-----------\n\n\n") i = 0

如果是白嫖,下面直接上使用方法

首先

我的电脑分辨率为19201080(如何查看分辨率:设置->系统->显示) 我们将词达人窗口防止左侧高度拉满,宽度最小为以下状态,使用截图软件截图后词达人窗口大小为4801040 在这里插入图片描述

其次

如果确实模块,直接pip install +模块名 + -i https://pypi.tuna.tsinghua.edu.cn/simple 这样飞快 其中注意的是出现下方问题 在这里插入图片描述 方法如下 这是pymouse的锅

解决办法是找到pymouse的安装路径,如果不知道在哪里可以用pip安装一下,如果已经安装了会自动提示安装路径,通常都是在python或者ide的Lib\site-packages里,比如我的在F:\Anacondea\Lib\site-packages。 进入pymouse的安装路径打开__init__.py文件;把92行的windows改为pymouse.windows. 改完后会出现 ModuleNotFoundError: No module named ‘pyHook’ 现在需要安装pyhook。推荐下载whl文件安装,可以去:https://www.lfd.uci.edu/~gohlke/pythonlibs/这里下载 cmd,然后到下载的路径。然后 pip install pyHook‑1.5.1‑cp36‑cp36m‑win_amd64.whl

接着

模块安装好之后,我们要改代码里的东西, 在这里插入图片描述 找到access_token最快的方法是:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + API_KEY + '&client_secret=' + SECRECT_KEY

在这里插入图片描述 把后面的复制下来到上面去

最后

解决这个问题(证书问题) 在这里插入图片描述 方法很简单 仅对我们需要的网站进行解密,就不会报这个错了,配fiddler可以参考我之前的方法 这一步很重要,关乎程序是否执行下去,如果加上了这个地址,点确定,然后重新打开(不出现txt一定要检查这一步) 在这里插入图片描述 下面是效果图 在这里插入图片描述

模拟点击对单选和多选准确率很高,对填空题准确率很低

这里我要感谢@江浒一只猫 参考博客:https://blog.csdn.net/SR02020/article/details/105497043 https://blog.csdn.net/qq_34696203/article/details/83029114

输入正确答案才能进入,答案在此博客中(加粗的字,不是加粗的标题) 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3