天域至尊 发表于 2020-3-18 10:28

解决网课播放不定时交互防离开问题的思路,赠源码

在大家被迫观看网课的时候,网课总是会不定时弹出一个窗口,让你点击下,或者拖动下滑块什么的,同时暂停播放。而如果你在挂机刷课,肯定就废了。


当然,有大佬可以改源码,发伪装好的数据包等等,但是都是高度定制化的,即换个平台就废。
同时,这种方法增大了被发现的概率。
如何更加真实?无疑是在网课程序(浏览器)外,进行模拟人的操作。


如何模拟人的操作?
第一,要能控制鼠标键盘等人体学输入设备。
第二,应该知道什么时候该控制。



什么时候该控制呢?

往往是暂停播放的时候。



那我们来解析下,暂停播放会对电脑产生什么影响?
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:31

看,六眼飞鱼 发表于 2020-3-18 11:00
这什么学校要求这么变态,我还以为有人能做出来老师语言点名自动扣1呢

我就喜欢你这种有趣的评论,来来来,我给你一个思路。

1.把手机和一个小米音箱的小爱同学的唤醒词改成你的名字。
2.在手机上增加一个小爱同学训练,内容是“我在”,操作是自动扣一。

老师在点到你名字的时候,手机和小米会被同时唤醒,小米音箱会说“我在”,然后手机听到了“我在”的内容,就会自动扣一。

你试试,看看可行不?

情景模拟:
老师:张三!
手机:叮~
小米音箱:我在
手机:扣一
{:301_997:}

天域至尊 发表于 2020-3-23 10:51

lntuer 发表于 2020-3-19 13:48
浏览器后台运行,pyatuogui好像不是很好使

对的,浏览器不能后台运行,必须在前台。如果肯丰富操作逻辑的话,理论上是可行的。例如:
1.被触发条件触发后,单击任务栏浏览器位置,等待5秒。
2.单击弹窗。
3.单击最小化。

我这个设计的初衷是在一个闲置设备上挂机的,就是我的树莓派,在这种限制的机器上,浏览器永远都是在前台,而且Linux环境没有那么多弹窗,所以用起来少了很多麻烦。

vagrantear 发表于 2020-3-18 10:34

拿下首评!!

segirls 发表于 2020-3-18 10:44

感谢老的分享,python小白学习了。

dsl1976 发表于 2020-3-18 10:46


感谢分享!

陳小賢 发表于 2020-3-18 10:50

太棒了,就是需要思路类型的分析,受教了!

QRQF001 发表于 2020-3-18 10:54

支持一下

青春作伴 发表于 2020-3-18 10:58

python没学过,没安装 ,可发个成品不?

看,六眼飞鱼 发表于 2020-3-18 11:00

这什么学校要求这么变态,我还以为有人能做出来老师语言点名自动扣1呢

小k666 发表于 2020-3-18 11:08

支持一下。

PPZ丿皮皮智 发表于 2020-3-18 11:27

刚入门python正好来学习一下
页: [1] 2 3
查看完整版本: 解决网课播放不定时交互防离开问题的思路,赠源码