在大家被迫观看网课的时候,网课总是会不定时弹出一个窗口,让你点击下,或者拖动下滑块什么的,同时暂停播放。而如果你在挂机刷课,肯定就废了。
当然,有大佬可以改源码,发伪装好的数据包等等,但是都是高度定制化的,即换个平台就废。
同时,这种方法增大了被发现的概率。
如何更加真实?无疑是在网课程序(浏览器)外,进行模拟人的操作。
如何模拟人的操作?
第一,要能控制鼠标键盘等人体学输入设备。
第二,应该知道什么时候该控制。
什么时候该控制呢?
往往是暂停播放的时候。
那我们来解析下,暂停播放会对电脑产生什么影响?
1.音频不再输出。
2.电脑画面不再变化。
3.播放程序不再禁止电脑休眠。
以上三个方面,都可以作为一个判断的突破点,这次我们用到的是第三条。
播放设备不再禁止电脑休眠。
怎么查看有没有程序禁止电脑休眠呢?
Windows命令(管理员):
[Bash shell] 纯文本查看 复制代码 powercfg /requests
播放时返回示例:
[Bash shell] 纯文本查看 复制代码 DISPLAY:
[PROCESS] \Device\HarddiskVolume1\Program Files (x86)\Internet Explorer\iexplore.exe
Adobe Flash Player
SYSTEM:
[DRIVER] Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0257&SUBSYS_17AA2256&REV_1000\4&2e2b60f2&0&0001)
音频流当前正在使用中。
AWAYMODE:
无。
执行:
无。
PERFBOOST:
无。
ACTIVELOCKSCREEN:
无。
暂停播放时返回示例:
[Bash shell] 纯文本查看 复制代码 DISPLAY:
无。
SYSTEM:
无。
AWAYMODE:
无。
执行:
无。
PERFBOOST:
无。
ACTIVELOCKSCREEN:
无。
通过这个命令,我们就可以查看是否有目标程序禁止电脑休眠。
程序思路:
1.抛出上述系统命令。
2.判断是否有目标程序在列表中(这次是flash)
3.若存在,则模拟操作(这次是点击)
注:因该命令需要管理员权限,所以脚本必须以管理员权限运行。
付源码:
[Python] 纯文本查看 复制代码 import os,pyautogui,time
#os用来抛出系统级命令,pyautogui是孔控制鼠标的库
#pyautogui库功能非常丰富,可以单击,移动,拖动,右键等等
#初始化鼠标所需单击的位置,这次是模拟单击操作
mouseX=-1
mouseY=-1
#尝试读取鼠标位置保存文件,这个文件用于存储鼠标点击位置的数据,方便每次运行程序可以直接读取上次数据
#若文件不存在,则提示用户确定点击位置
try:
#尝试打开,读取鼠标位置数据
f=open('a.txt',mode='r')
f=str(f.read()).split(',')
mouseX=int(f[0])
mouseY=int(f[1])
except Exception:
pass
finally:
try:
f.close()
except Exception:
pass
#如果上述步骤没有读取成功,提醒用户把鼠标移动到想要程序自动点击的位置,回车。
#程序会自动记录位置,写入文件中,方便下次启动程序复用
if mouseX<0:
input('请将鼠标移至继续观看位置,回车')
mouseX, mouseY = pyautogui.position()
print('位置定位成功')
#将位置数据写入文件中,下次使用无需定位
try:
f=open('a.txt',mode='w')
masse=str(mouseX)+','+str(mouseY)
f.write(masse)
print('数据保存成功')
except Exception:
print('数据保存失败,下次使用需要重新定位,本次无影响。')
finally:
try:
f.close()
except Exception:
pass
print('定位鼠标位置为:%s,%s'%(mouseX,mouseY))
#进入无限循环,每次循环间隔20秒
while True:
#打印提示信息
print(str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+'执行检测')
#抛出系统命令
a=os.popen('powercfg /requests')
#获取系统返回的结果,顺便移除换行,方便判断
anser=str(a.read()).replace('\n','').replace('\r','')
#初始化变量,用来标记视频是否在播放
runStation=True
#如果发现flash程序的字样,存在于命令返回结果,则判断视频正在播放
if 'Flash' in anser or 'flash' in anser:
runStation=True
#如果发现返回数据中,关键变量缺失,说明用户使用的并不是管理员身份,报错退出
elif 'SYSTEM' not in anser and 'system' not in anser:
print('请以管理员身份运行程序')
break
#否则认为是程序播放已经暂停,标记变量
else:
runStation=False
print(str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))+'检测到播放暂停')
#变量现实程序播放暂停,开始执行模拟人工操做
if runStation==False:
#这里是将鼠标移动到标记地点,单击一下
#这个库支持复杂的鼠标操作,建议大家了解下
pyautogui.click(mouseX, mouseY, button='left')
#等待20秒后进行下次检测
#特别提醒,播放状态切换后,系统并不能实时的更新返回结果,所以强烈要求间歇时间不要低于10秒钟
#间歇时间过低,会导致重复性误判断
time.sleep(20)
注释赶上代码量了,我就不再解释了。
原创,允许转载和引用,请注明出处。
|