前情提要

进来新型肺炎闹得实在是厉害,学校要求学生每天打卡报平安,忘报晚报都会被短信电话轮番轰炸,属实烦人。
打卡系统是学校开发的,不使用微信账号登录,因此用selenium模拟打卡是可行的。
可惜我的笔记本期末之前烧坏了,一直没修(沙河一公寓楼下的电脑维修属实不行,送去半个月都没检测,一直拖到过年都没修,天天忙着卖二手手机)。
好在这样想的不是我一个人,已经有同学完成了这个工作,直接拿来用就行——本应该是这样的。

无法获取位置信息

用手机RD连接服务器,费了老大劲部署完毕,试运行wdnmd我人傻了啊。我们都知道win10在通知那里有个定位开关,想要获取定位就要打开这个开关。但是Windows Server 2012并没有这个开关,也就无法获取到位置信息。况且服务器和我本人不在一个省,就算获取到位置信息也没有用,必须要伪造一个。
打开F12,看一下获取位置信息的时候发生了什么。在network里可以看到有几个向amap.com的请求,也就是高德的api,现在无法返回位置信息。在more tools里打开sensors,设置一个虚拟的Geolocation,高德的api就能正确返回定位信息。因此我们要做的就是设置一个虚拟经纬度。
首先想到的就是插件,很遗憾我发现插件是无效的。因为定位信息原本就不存在,插件也就无法对这个不存在的信息进行修改。在sensors里随便设定一个坐标后,插件才能生效。那么既然我可以去设置sensors还用插件干什么……
其次是本地服务器伪造高德的api,但是没有电脑键盘,用手机做这个实在是强人所难。
最后只能回到第一步的思路,设置sensors里的定位。

通过CDP实现

参考文章:selenium调用Chrome Devtools Protocol实现模拟定位
首先在原代码第14行后加入如下代码:

prefs = {
    'profile.default_content_setting_values':
        {
            'notifications': 1,  # 允许通知
            'geolocation': 1  # 允许定位
        }
}
option.add_experimental_option('prefs', prefs)

不然浏览器就会弹出一个小窗询问是否允许通知和定位。
然后在第15行后插入:

browser.execute_cdp_cmd("Emulation.setGeolocationOverride", cmd_args={'latitude': 你的纬度, 'longitude': 你的经度,  'accuracy': 100})

END


本文编写时脚本已经完美运行半个月,绝对稳定可靠。
另外那个bat脚本是没有必要的,win下运行py可以直接双击代码文件,任务计划程序里可以把主程序设置为python.exe,参数设为代码路径。


挂科一时爽,一直挂科一直爽。
🀇🀇🀇🀈🀉🀊🀋🀌🀍🀎🀏🀏🀏 🀋