解决网课播放不定时交互防离开问题的思路,赠源码
在大家被迫观看网课的时候,网课总是会不定时弹出一个窗口,让你点击下,或者拖动下滑块什么的,同时暂停播放。而如果你在挂机刷课,肯定就废了。当然,有大佬可以改源码,发伪装好的数据包等等,但是都是高度定制化的,即换个平台就废。
同时,这种方法增大了被发现的概率。
如何更加真实?无疑是在网课程序(浏览器)外,进行模拟人的操作。
如何模拟人的操作?
第一,要能控制鼠标键盘等人体学输入设备。
第二,应该知道什么时候该控制。
什么时候该控制呢?
往往是暂停播放的时候。
那我们来解析下,暂停播放会对电脑产生什么影响?
1.音频不再输出。
2.电脑画面不再变化。
3.播放程序不再禁止电脑休眠。
以上三个方面,都可以作为一个判断的突破点,这次我们用到的是第三条。
播放设备不再禁止电脑休眠。
怎么查看有没有程序禁止电脑休眠呢?
Windows命令(管理员):
powercfg /requests
播放时返回示例:
DISPLAY:
\Device\HarddiskVolume1\Program Files (x86)\Internet Explorer\iexplore.exe
Adobe Flash Player
SYSTEM:
Realtek High Definition Audio (HDAUDIO\FUNC_01&VEN_10EC&DEV_0257&SUBSYS_17AA2256&REV_1000\4&2e2b60f2&0&0001)
音频流当前正在使用中。
AWAYMODE:
无。
执行:
无。
PERFBOOST:
无。
ACTIVELOCKSCREEN:
无。
暂停播放时返回示例:
DISPLAY:
无。
SYSTEM:
无。
AWAYMODE:
无。
执行:
无。
PERFBOOST:
无。
ACTIVELOCKSCREEN:
无。
通过这个命令,我们就可以查看是否有目标程序禁止电脑休眠。
程序思路:
1.抛出上述系统命令。
2.判断是否有目标程序在列表中(这次是flash)
3.若存在,则模拟操作(这次是点击)
注:因该命令需要管理员权限,所以脚本必须以管理员权限运行。
付源码:
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)
mouseY=int(f)
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)
注释赶上代码量了,我就不再解释了。
原创,允许转载和引用,请注明出处。
看,六眼飞鱼 发表于 2020-3-18 11:00
这什么学校要求这么变态,我还以为有人能做出来老师语言点名自动扣1呢
我就喜欢你这种有趣的评论,来来来,我给你一个思路。
1.把手机和一个小米音箱的小爱同学的唤醒词改成你的名字。
2.在手机上增加一个小爱同学训练,内容是“我在”,操作是自动扣一。
老师在点到你名字的时候,手机和小米会被同时唤醒,小米音箱会说“我在”,然后手机听到了“我在”的内容,就会自动扣一。
你试试,看看可行不?
情景模拟:
老师:张三!
手机:叮~
小米音箱:我在
手机:扣一
{:301_997:} lntuer 发表于 2020-3-19 13:48
浏览器后台运行,pyatuogui好像不是很好使
对的,浏览器不能后台运行,必须在前台。如果肯丰富操作逻辑的话,理论上是可行的。例如:
1.被触发条件触发后,单击任务栏浏览器位置,等待5秒。
2.单击弹窗。
3.单击最小化。
我这个设计的初衷是在一个闲置设备上挂机的,就是我的树莓派,在这种限制的机器上,浏览器永远都是在前台,而且Linux环境没有那么多弹窗,所以用起来少了很多麻烦。 拿下首评!! 感谢老的分享,python小白学习了。
感谢分享! 太棒了,就是需要思路类型的分析,受教了! 支持一下 python没学过,没安装 ,可发个成品不? 这什么学校要求这么变态,我还以为有人能做出来老师语言点名自动扣1呢 支持一下。 刚入门python正好来学习一下