利用简单的PowerShell脚本实现尔雅网课暂停检测

俗话说:科技让生活更美好。面对让人头疼的思政课,尤其是以网课形式上的思政课,相信没有几个人有兴趣听下去。超星尔雅这个网课平台被很多高校使用,经过多年以来与学生斗智斗勇,它已经拥有各种防止刷课的机制:每个视频中间都会弹题,每一章内容都被细分到极致,鼠标离开播放器就暂停,甚至能检测出刷课软件。
于是,身边很多同学选择了妥协,他们中有的在刷网课的同时写作业、玩手机,有的用另一台设备播放网课。然而这两种方法有个共同的缺点:你必须留出一部分注意力去关注网课是否暂停,而这非常distractive。
我想,能不能让播放器更“智能”一点呢?即我们完全不用去刻意关注网课播放状态,甚至不用听声音,网课一旦暂停就会主动提醒我们去答题。
首先,对于鼠标离开视频就会暂停的问题,解决方式很容易:开个虚拟机播放网课,鼠标保持在视频框中按下Host Key,然后鼠标就自由了。
真正棘手的是检测网课暂停。我最先想到的是检测特定软件的音量。这并不是件容易的事,因为Windows并没有提供相关的API来实现这个功能,真要实现的话可能必须用虚拟声卡并绑定到虚拟机声卡。同样的道理,检测窗口变化也没那么容易,Windows也没有相关的API。
看起来最直接的两条路没那么好走。有没有更简单粗暴的方法呢?网课视频播放器很传统,用的Flash Player而不是HTML5,而Flash Player最大的特点就是消耗大量资源。解决方案显而易见了:检测CPU占用情况。视频播放时的CPU占用率一定比暂停时高,这一点在Flash Player上体现的更明显。
Windows提供了原生的API检测特定进程的CPU占用,直接使用系统内置的PowerShell就可以轻松调用。

接下来就是实际操作部分了。

安装虚拟机

安装虚拟机没啥好说的,不会的话网上教程一搜一大把。不管是windows、linux还是mac,只要能播放网课就没问题。
在这里需要强调的是:由于我们会使用检测CPU占用的方式
检测网课暂停,必须使用纯净的系统!而且请将虚拟CPU核心数设置为1!

何为纯净?网上乱飞的ghost版windows都内置了各种垃圾软件,它们都会对我们检测CPU占用进行干扰,甚至可能弹窗导致视频无故暂停。(当然如果你有兴趣一点一点把垃圾软件删干净也可以)
为何要单核?多核会削弱CPU总体占用率,而这不利于我们检测视频暂停。
我使用的是VMware Player 12+原版Windows xp sp3+IE8补丁。实测效果很不错,几乎没有误报漏报的情况。
一点优化:最好关闭屏幕保护、自动关闭显示器等一切节能功能,这些功能对虚拟机没有任何帮助。

编辑脚本

终于到了重头戏。废话少说,上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#参数设置
$cpucap=50
$lasttime=8
#脚本主体
$count=0
$wshell = New-Object -ComObject Wscript.Shell#和弹窗有关
while(1){
#vmware-vmx为vmware的虚拟机进程名,如果你使用的是其他虚拟机,请替换为相关进程名,不需要加上.exe。
$cpu=(powershell '((Get-Counter \"\Process(*)\% Processor Time\").CounterSamples|Where-Object {$_.InstanceName -eq \"vmware-vmx\"}).CookedValue')
echo $cpu
If ($cpu -lt $cpucap){$count++}
Else{$count=0}
echo $count
if ($count -eq $lasttime)
{
[System.Media.SystemSounds]::Hand.Play()#声音提示
$wshell.Popup("检测到视频暂停!",0,"通知",0x0)#弹窗提示
$count=0
}
}

将脚本保存在任何位置,扩展名为.ps1,右键点击脚本,选择“使用Power Shell运行”即可。
注意开头的两个参数:$cpucap$lasttime$cpucap指的是当指定进程(详见脚本注释)的CPU占用率达到多少以上判定为视频正在播放。$lasttime是指CPU占用率持续多少秒低于$cpucap的时候判定为视频已经暂停。这两个参数在每台电脑上肯定都不一样,你需要自己调整。最开始你可以将$cpucap设置为0,运行脚本,输出内容中的浮点数即为实时CPU占用,让视频处于播放和暂停状态,观察CPU占用率变化,选择最佳的$cpucap$lasttime组合。如果你发现误报率或漏报率较高,可以随时调整参数,保存后记得重新运行脚本。
一个秘诀:将视频清晰度调为720P会显著提高播放与暂停状态下CPU占用率的差距。
接下来是通知效果:

如果你不喜欢这种弹窗的方式,可以采用系统通知的方式,相关代码如下:
1
2
3
4
5
6
7
8
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$objNotifyIcon.Icon = "D:\icon.ico"#请修改为有效ico图标文件的绝对路径
$objNotifyIcon.BalloonTipIcon = "Info"
$objNotifyIcon.BalloonTipText = "检测到视频暂停!"
$objNotifyIcon.BalloonTipTitle = "通知"
$objNotifyIcon.Visible = $True
$objNotifyIcon.ShowBalloonTip(10000)

效果如下:

Enjoy it!

开始享受吧!你完全可以把虚拟机静音,放上喜欢的音乐,干自己想干的事,让脚本帮助你看网课就行了!
最后,也是最重要的是:Use at you own risk!

文章目录
  1. 1. 安装虚拟机
  2. 2. 编辑脚本
  3. 3. Enjoy it!
|