最近总是要填问卷星问题多达30个,每天一次非常麻烦,于是打算写个脚本自动完成。
本来想用python的selenium配合可开发的火狐浏览器驱动实现(毕竟网上大家都是这么做的)。可是由于以下几个问题让我取消了这个念头:

  1. 【主要原因】不知道网怎么了就是打不开github下载不了驱动。
  2. 本质上还需要对网页布局和js进行针对性的分析,感觉还是写个js脚本,然后复制到 浏览器的console中运行算了。

就这样我先用 js 写出自动填写脚本,然后交给浏览器运行。之后还是想体验一下自动化过程,于是想到如果能控制鼠标,进行鼠标键盘操作就可以了,这样pyautogui就出现在我的视野中,其对鼠标位置的定位是通过屏幕图片搜索的,这个很让我吃惊(以前搞过通过程序控件的id确定位置)。

那就分章节简单介绍

js 脚本

需要根据网页自行分析,有时还需要分析js脚本。通过火狐或者谷歌浏览器。

给个示例

function getById(idnm){ return document.getElementById(idnm) }
function getCurrentDate() {
    var now = new Date();
    var year = now.getFullYear(); //得到年份
    var month = now.getMonth();//得到月份
    var date = now.getDate();//得到日期
    month = month + 1;
    if (month < 10) month = "0" + month;
    if (date < 10) date = "0" + date;
    return year + "-" + month + "-" + date;
}

getById("q1").value="xx"
getById("q2_1").parentNode.click()
getById("q6").value="xxx"
getById("q7").value=getCurrentDate()

getById("ctlNext").click()

半自动填写

就是用谷歌, ctrl+shift+j 把代码贴上回车就完成。
火狐是 ctrl+shift+k

使用pyautogui 全自动填写

自己把上面的过程走一次,这样就可以针对性的写程序。用到鼠标定位的部分,就自己提前截好图片。

下面的脚本运行过程包括。打开火狐浏览器找到输入网址的地方,输入网址(主要不要用那个什么typewrite),回车,等待网页加载结束, ctrl+shift+k 打开console,代码复制里面,回车。

其中用了三张图片。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这三个图片的作用分别为:

  1. 确定地址框的位置
  2. 确定console的位置
  3. 确定目标网页是否加载完成

使用的顺序是 1->3->2

import time
def p(*info): print(*info)
import os

url="https://www.wjx.top/m/xxxx.aspx"
os.system(r'"C:\Program Files\Mozilla Firefox\firefox.exe"')
time.sleep(1)
while True:
    cposition = pyautogui.locateOnScreen('pics/ff1.png')
    if cposition: break
    time.sleep(0.5)

cc = pyautogui.center(cposition)
_bias=cposition.width
pyautogui.moveTo(cc[0]+_bias,cc[1]) 
pyautogui.click(clicks=1) # 点一下
set_text( url )
pyautogui.hotkey("Ctrl","v")
pyautogui.keyDown('Enter')

time.sleep(2)
while True:
    cposition = pyautogui.locateOnScreen('pics/ff3.png')
    if cposition: break
    time.sleep(0.5)
    
cc = pyautogui.center(cposition)
pyautogui.moveTo(cc[0],cc[1])  
pyautogui.click(clicks=1)
pyautogui.hotkey("Ctrl","Shift","k")

time.sleep(1)
while True:
    cposition = pyautogui.locateOnScreen('pics/ff2.png')
    if cposition: break
    time.sleep(0.5)

with open("casia.js", encoding='UTF-8') as fp:
    #code=fp.readlines()
    code=fp.read()

set_text( code )
pyautogui.hotkey("Ctrl","v")
#pyautogui.click(clicks=1)

pyautogui.keyDown('Enter')

里面用到一个剪贴板复制的函数

import win32con
import win32clipboard

def set_text(string):
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, string)
    win32clipboard.CloseClipboard()

总结

这种思路下,其实很多软件都可以自动执行了。以前真没有想到可以借助图片来辅助定位。当然图片一定要选择有特点的,否则会出现检测不到的情况。另外还要注意延时等待。

图片匹配的算法如果自己写的话可以参考 这里

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐