之前用 phantomjs,发现有 2 个问题,1 是 phantomjs 太老了且停止维护,导致存在兼容性问题,比如有些网站的 js 无法正常解析导致点击或操作无效,2 有时脚本无法自动退出,我想可能还是兼容性问题,导致报错假死吧。
比如,之前用 phantomjs 实现链滴自动签到时就出现了这两个问题,只能通过 cookie 模拟登录然后再模拟签到,虽然勉强可用,但总归不完美。
于是,最近决定研究下 puppeteer,之前没用 puppeteer 的原因,主要考虑到 puppeteer 需要安装 node 环境等,没有 phantomjs 轻量级。
后来发现 puppeteer 比 phantomjs 功能强大且稳定多了,而且 node 环境感觉目前几乎已经是必备的运行时了。
于是动手重写了链滴社区自动签到的脚本,运行了几天,感觉还不错,还算稳定,现在分享给大家,有需要的朋友可以尝试下。
不知道这个脚本是否违规,如果有不妥之处,请管理员大大们告知下,第一时间删除。
脚本整体流程大概是,先访问签到页面,如果发现未登录则先模拟登录,登录完后再进入签到页进行签到,登录后会记录登录信息,下次再次访问签到页面时会带上登录的 cookie,不需要再次登录了。
2024-12-18 更新
增加了二次验证的支持 ,使用前需要执行 npm install otplib
安装 otplib 库,然后参数 twoFactorAuthKey
填写链滴的二次验证秘钥即可,二次验证秘钥可在链滴官网用户设置-> 安全设置-> 两步验证中获取,如果已绑定的需先解绑才能看到。
感谢 @EmptyLight 提供的方法!
代码:
使用方法:
- 先安装 node 环境,已具备的朋友请跳过,有不懂的朋友请自行搜索,教程很多。
- 安装 puppeteer,只要执行
npm i puppeteer 或 npm i puppeteer-core
即可。这里推荐npm i puppeteer-core
方式,因为这种方式不需要安装 200M+ 的 Chrome For Testing,使用 chrome 浏览器的无头模式即可。但本脚本理论上两种方式都支持,但仅在 puppeteer-core 模式下测试通过。 - 把以上脚本保存为 js 文件即可,比如,ld246_signin.js,然后运行
node ld246_signin.js
即可。puppeteer 脚本本质上就是 nodejs 脚本,puppeteer 只不过是 nodejs 的一个模块而已,所以,nodejs 环境下的其他库也可以在 puppeteer 中使用。 - 把
node ld246_signin.js
放到定时任务中即可,或者开机运行等。比如,我在 Mac 上是这样运行的0 */1 * * * cd /Users/xxxx/bin/ld246_sign_in/ && /usr/local/bin/node puppeteer_ld246_singin_wilsons.js > /dev/null 2>&1 &
,把它放到 crontab 中,每个整点运行一次,这样就保证总会有一次执行自动签到,如果你想提高命中率就把运行间隔设短一点,比如 10 分钟。不用担心重复运行,已签到的情况下,脚本会自动退出不会重复签到。 - 签到结果会放到运行脚本目录下的 log.txt 文件里,可以在这里查看每日签到结果及错误信息等。
注意事项:
- 用户名和密码必填,这主要用于未登录情况下的自动登录。
chromePath
这个参数是 chrome 浏览器的安装路径,如果你是 Mac 系统通常不需要变动,如果是 Windows 系统需要根据注释说明进行修改,注意,Windows 的路径需要用\
进行转义。如果你使用的是 puppeteer 模式而非 puppeteer-core 模式,这个路径设置为空即可,换句话说,如果这个路径为空,则自动使用 puppeteer 模式。- 通知路径脚本,是当签到产生异常时通知你的方式,这里使用 shell 脚本进行编写,你可以自己实现通知方式,如果没有保持为空即可。
userAgent
这个参数可以根据需要更改你自己的浏览器头信息,如果你不清楚勿动即可。- 脚本中的用户名和密码都是明文显示,如果你比较在意可以放到环境变量里,然后通过
process.env.xxxx
读取即可,具体请自行实现。 - 登录的 cookie 默认存储到脚本运行目录的 tmp 目录里,且明文保存,如果你担心安全问题,请自行实现加密和解密工作。
Mac 下的简单通知脚本如下:
notify 脚本
#/bin/bash
title="提示"
if [ "$2" != "" ] ;then
title=$2
fi
/usr/bin/osascript -e "display notification \" $1 \" with title \"$title\" sound name \"Frog\""
/usr/bin/osascript -e "say \"您有新的通知 $title $1\"";
alert 脚本
#/bin/bash
button="知道了"
if [ "$2" != "" ] ;then
button=$2
fi
/usr/bin/osascript -e "say \"您有确认信息 $1 请确认\"" &
/usr/bin/osascript -e "tell application \"System Events\" to display alert \"$1\" buttons {\"$button\"} default button 1"
其中,/usr/bin/osascript -e "say \"xxxx xxxx\""
是语音通知,如果你不需要语音通知,注释或删除即可。
alert 和 notify 的区别是,alert 在发生严重错误,导致流程中断时会弹出,比如登录失败,这个弹窗不会消失,除非用户手动点击;而通知则是简单提醒,通常过一会会自动消失。
但,如果是你自己实现的通知脚本,那就看你如何定义了。
最后,放一个签到脚本的整体流程图吧。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于