[淦!]掘金矿石马上就可以兑换奖品了,来写一个定时签到赚取矿石的脚本吧!

·  阅读 2717
[淦!]掘金矿石马上就可以兑换奖品了,来写一个定时签到赚取矿石的脚本吧!

本文的主要目的是带你写一个掘金定时(每天早上七点)签到的脚本,然后长期运行在服务器或者本地。

准备工作

新建一个目录 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

image.png

image.png 一样的步骤,把自动抽奖的接口也复制下来

第二步,把对应的接口封装成函数

掘金在签到之后会赠送一次免费抽奖的机会,所以我们需要两个接口

  1. 签到接口
  2. 抽奖接口

index.js文件中,新建signIn(签到)和luckyDraw(抽奖)函数,把复制的接口放进去。

注意:有些版本的curl不支持data-raw选项,需要改成data,如下图所示:

image.png

此外,为了便于替换用户凭证,我们要把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中分别调用signInluckyDraw方法。

在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()
}())

现在整个代码的结构如下:

image.png

已经完成的功能有:签到并在签到成功之后触发一次自动抽奖

接下来看一下如何每天定时执行该逻辑。

第三步 定时执行脚本

定时执行脚本需要使用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 使用如下:

image.png

nodemailer更详细的功能介绍,参考:这篇文章 以及 官方文档

完整代码

最后来看下完整的代码逻辑

image.png

源码地址: 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的话,窗口关闭,脚本就不会继续运行了。

所以要把脚本作为一个进程运行,安装依赖pm2npm i pm2 -g

进入目录,执行pm2 start index.js,如果输出如下:

image.png 该程序就作为一个系统常驻进程存在了。

附一下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

有了权限之后,右键文件,选择“显示简介”,将打开方式选择为终端打开

image.png

最后是往系统设置(在设置->用户与群组->登录项)的登录项中添加启动文件:

image.png

Windows下有一点点区别,windows下执行的是.bat脚本,添加开机启动项的方式也有些区别,不过问题不大,百度一下添加即可。

总结

写掘金自动签到主要用到了以下依赖:

  • shelljs 用于执行linux命令
  • node-schedule 用于定时执行任务
  • nodemailer 用于发送邮件

此外还用到两个工具

  • nodemon 用于代码调试
  • pm2 用于代码部署

有了这些工具,你就可以发挥你的创造力来做一些事情了。 例如:

  • 后台下载某个网站的图片或者其他资源
  • 定时给个人或者团队发送一些提醒邮件
  • 爬取网站资源,做一些数据整理的工具,并发送到自己的邮箱
  • ...

人的能力是有限的,想象力是无穷的。

尽情发挥想象力吧!

有问题请在评论区留言。

分类:
前端
分类:
前端
收藏成功!
已添加到「」, 点击更改