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

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

其次

如果确实模块,直接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

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

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jun_军

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值