本文的主要目的是带你写一个掘金定时(每天早上七点)签到的脚本,然后长期运行在服务器或者本地。
准备工作
新建一个目录 juejin-qiandao
进入目录,执行npm init --yes
,这一步的作用是初始化package.json
文件
新建文件index.js
,存放代码逻辑
在index.js
文件中添加以下代码
;(function(){
console.log('start!!!')
}())
执行node index.js
,会输出打印的内容,然后程序停止。每次修改代码都要重新执行node index.js
,如果你觉得麻烦的话可以使用nodemon
,它会在代码改变时重新执行代码。
安装依赖:
npm i nodemon -g
然后使用nodemon执行index.js:
nodemon index.js
然后修改代码,程序会自动进行更新.
下面开始正式步骤。
第一步,分析调用的接口
打开浏览器,按f12,点开Network
面板,在界面上点击按钮 我要签到
,看调用是哪个接口,在对应的接口上鼠标右键 Copy->Copy as fetch
一样的步骤,把自动抽奖的接口也复制下来
第二步,把对应的接口封装成函数
掘金在签到之后会赠送一次免费抽奖的机会,所以我们需要两个接口
- 签到接口
- 抽奖接口
在index.js
文件中,新建signIn
(签到)和luckyDraw
(抽奖)函数,把复制的接口放进去。
注意:有些版本的curl
不支持data-raw选项,需要改成data,如下图所示:
此外,为了便于替换用户凭证,我们要把COOKIE
作为一个变量提取出来,可以从外部文件中读入,也可以用一个变量写死,为了简单起见我这里是写死的。
复制完成之后代码会是这个样式:
//COOKIE要修改成你的cookie
const COOKIE=`_ga=GA1.2.151728167.1605962485; n_mh=QqqO9vdPyoUgGd.....`
// 签到
function signIn(){
return `
curl 'https://api.juejin.cn/growth_api/v1/check_in?_signature=_02B4Z6wo00101ko.H4gAAIDDtHNjubVswAZKOxsAAPOuAAlx6VxXpAuTLBl4IC1eYOBrCQaJL2bxRG2WMew4GQseXw5FTF7DWUseoJnrvSHnaYcWquty-lQ3DaLLkODkvNHe9Msoy7jWBaIz39' \
-H 'authority: api.juejin.cn' \
-H 'pragma: no-cache' \
-H 'cache-control: no-cache' \
-H 'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' \
-H 'content-type: application/json' \
-H 'accept: */*' \
-H 'origin: https://juejin.cn' \
-H 'sec-fetch-site: same-site' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'referer: https://juejin.cn/' \
-H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
-H 'cookie:${COOKIE} ' \
--data '{}' \
--compressed
`
}
// 抽奖
function luckyDraw(){
return `
curl 'https://api.juejin.cn/growth_api/v1/lottery/draw' \
-H 'authority: api.juejin.cn' \
-H 'pragma: no-cache' \
-H 'cache-control: no-cache' \
-H 'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"' \
-H 'sec-ch-ua-mobile: ?0' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' \
-H 'content-type: application/json' \
-H 'accept: */*' \
-H 'origin: https://juejin.cn' \
-H 'sec-fetch-site: same-site' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-dest: empty' \
-H 'referer: https://juejin.cn/' \
-H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
-H 'cookie: ${COOKIE}' \
--data '{}' \
--compressed
`
}
测试一下,我们在脚本中调用两个函数,写一个logic
的函数,在logic中分别调用signIn
和luckyDraw
方法。
在nodejs中执行一些命令需要用到shelljs
依赖,安装一下npm i shelljs -S
shell.exec()
用来执行命令,例如shell.exec('ls')
,会列出当前目录下所有文件。
我们引入shelljs
依赖,并应用执行我们的接口,在index.js
中添加以下代码:
const shell=require('shelljs')
function logic(){
try {
const res= JSON.parse(shell.exec(signIn(),{silent:true}))
// err_no为0表示签到成功 err_no为15001为重复签到
if(res.err_no==0){
// 签到成功,执行一次自动抽奖,因为签到成功之后有一次免费的自动抽奖
shell.exec(luckyDraw(),{silent:true})
}
} catch (error) {
// 如果自动签到失败,发送一封邮件通知自己
}
}
然后执行一下logic()
,我的个人编程习惯是把逻辑放到一个匿名函数中进行执行,这样做的好处是定义的变量是函数作用域的
//执行代码逻辑
;(function(){
logic()
}())
现在整个代码的结构如下:
已经完成的功能有:签到并在签到成功之后触发一次自动抽奖
接下来看一下如何每天定时执行该逻辑。
第三步 定时执行脚本
定时执行脚本需要使用node-schedule
模块.
npm i node-schedule -S
使用很简单,新建schedule.js
文件用于测试,输入以下代码,然后执行nodemon schedule.js
const schedule = require('node-schedule');
const scheduleCronstyle = ()=>{
//每分钟的第30秒定时执行一次:
schedule.scheduleJob('30 * * * * *',()=>{
console.log('scheduleCronstyle:' + new Date());
});
}
//执行定时器
scheduleCronstyle();
以上代码的作用是,每分钟的第30s执行一下 console.log('scheduleCronstyle:' + new Date());
假如我要每天早上7点执行,修改对应的规则即可:
schedule.scheduleJob({second:0,minute:0,hour:7},()=>{logic()})
在我们的index.js
中添加以下代码
const schedule = require('node-schedule');
//---other code
const scheduleTask = ()=>{
// 每天早上7点执行
schedule.scheduleJob({second:0,minute:0,hour:7},()=>{
logic()
});
}
//---other code
;(function(){
scheduleTask();
}())
我们现在就可以做到每天早上七点定时执行签到的脚本了,接下来看下如何在签到完成后发送邮件通知自己。发送邮件的步骤不是必须的,可以跳过,直接跳到最后一步部署。
node-schedule的更多用法,参考博客以及 官方文档
第四步 发送邮件
发送邮件也很简单,安装个依赖即可npm i nodemailer -S
使用如下:
nodemailer更详细的功能介绍,参考:这篇文章 以及 官方文档
完整代码
最后来看下完整的代码逻辑
源码地址: github.com/huangyangte…
部署
如果你有服务器的话,首先把代码使用stp软件传到服务器上(node_modules目录不要传),然后npm i
重新安装下依赖。
我的部署路径如下:
juejin-signin/
├── index.js
├── node-email.js
├── node_modules
├── package.json
└── package-lock.json
如果使用 node index.js
的话,窗口关闭,脚本就不会继续运行了。
所以要把脚本作为一个进程运行,安装依赖pm2
,npm i pm2 -g
进入目录,执行pm2 start index.js
,如果输出如下:
该程序就作为一个系统常驻进程存在了。
附一下pm2的基础使用命令
# 安装pm2
npm install -g pm2
# 启动进程
pm2 start app.js
# 查看进程
pm2 ls
# 结束进程
pm2 stop 进程id
# 删除进程
pm2 del 进程id
# 查看日志
pm2 logs
# 查看某个进程的日志
pm2 logs 进程id
# 重启应用
pm2 restart 进程id
如果你没有服务器的话,你可以跑在本机。设置一下开机自动执行脚本就可以。
MAC下,找个目录,新建一个run.sh
文件,输入以下内容:
pm2 start /xxx/xxx/xxx/index.js
然后给这个文件执行权限 chmod 777 run.sh
有了权限之后,右键文件,选择“显示简介”,将打开方式选择为终端打开
最后是往系统设置(在设置->用户与群组->登录项
)的登录项中添加启动文件:
Windows下有一点点区别,windows下执行的是.bat脚本,添加开机启动项的方式也有些区别,不过问题不大,百度一下添加即可。
总结
写掘金自动签到主要用到了以下依赖:
- shelljs 用于执行linux命令
- node-schedule 用于定时执行任务
- nodemailer 用于发送邮件
此外还用到两个工具
- nodemon 用于代码调试
- pm2 用于代码部署
有了这些工具,你就可以发挥你的创造力来做一些事情了。 例如:
- 后台下载某个网站的图片或者其他资源
- 定时给个人或者团队发送一些提醒邮件
- 爬取网站资源,做一些数据整理的工具,并发送到自己的邮箱
- ...
人的能力是有限的,想象力是无穷的。
尽情发挥想象力吧!
有问题请在评论区留言。