一百行代码实现!云函数版掘金自动签到&抽奖&邮件提醒~

8,801 阅读2分钟

之前写了一个挂在node环境下的脚本:《掘金免漏签&免费抽奖!三分钟搞一个跑在服务端的自动签到&抽奖脚本~》,评论区有xd想要一个云函数版的。之前没有研究过云函数,趁着这次机会看看这玩意儿怎么玩。

脚本

话不多说,先上完整版的脚本,如果有自己会新建云函数的,直接复制过去,cookie和邮箱的pass改一下,开个定时任务触发就行。

  • 注意:最终云函数src下应该有4个文件:
  1. package.json
  2. package-lock.json
  3. node_modules
  4. index.js

image.png

package.json

{
  "name": "juejin",
  "version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "axios": "^0.21.4",
    "nodemailer": "^6.6.3"
  }
}

index.js

"use strict"

/*---------------依赖-----------------*/
const nodeMailer = require('nodemailer');
const axios = require('axios');

/*---------------配置-----------------*/
const config = {
    "baseUrl": "https://api.juejin.cn",
    "apiUrl": {
        "getTodayStatus": "/growth_api/v1/get_today_status",
        "checkIn": "/growth_api/v1/check_in",
        "getLotteryConfig": "/growth_api/v1/lottery_config/get",
        "drawLottery": "/growth_api/v1/lottery/draw"
    },
    "cookie": "",
    "email": {
        "qq": {
            "user": "416556102@qq.com",
            "from": "416556102@qq.com",
            "to": "416556102@qq.com",
            "pass": ""
        }
    }
}

/*---------------掘金-----------------*/

// 签到
const checkIn = async () => {
    let {error, isCheck} = await getTodayCheckStatus();
    if (error) return console.log('查询签到失败');
    if (isCheck) return console.log('今日已参与签到');
    const {cookie, baseUrl, apiUrl} = config;
    let {data} = await axios({url: baseUrl + apiUrl.checkIn, method: 'post', headers: {Cookie: cookie}});
    if (data.err_no) {
        console.log('签到失败');
        await sendEmailFromQQ('今日掘金签到:失败', JSON.stringify(data));
    } else {
        console.log(`签到成功!当前积分:${data.data.sum_point}`);
        await sendEmailFromQQ('今日掘金签到:成功', JSON.stringify(data));
    }
}

// 查询今日是否已经签到
const getTodayCheckStatus = async () => {
    const {cookie, baseUrl, apiUrl} = config;
    let {data} = await axios({url: baseUrl + apiUrl.getTodayStatus, method: 'get', headers: {Cookie: cookie}});
    if (data.err_no) {
        await sendEmailFromQQ('今日掘金签到查询:失败', JSON.stringify(data));
    }
    return {error: data.err_no !== 0, isCheck: data.data}
}

// 抽奖
const draw = async () => {
    let {error, isDraw} = await getTodayDrawStatus();
    if (error) return console.log('查询抽奖次数失败');
    if (isDraw) return console.log('今日已无免费抽奖次数');
    const {cookie, baseUrl, apiUrl} = config;
    let {data} = await axios({url: baseUrl + apiUrl.drawLottery, method: 'post', headers: {Cookie: cookie}});
    if (data.err_no) return console.log('免费抽奖失败');
    console.log(`恭喜抽到:${data.data.lottery_name}`);
}

// 获取今天免费抽奖的次数
const getTodayDrawStatus = async () => {
    const {cookie, baseUrl, apiUrl} = config;
    let {data} = await axios({url: baseUrl + apiUrl.getLotteryConfig, method: 'get', headers: {Cookie: cookie}});
    if (data.err_no) {
        return {error: true, isDraw: false}
    } else {
        return {error: false, isDraw: data.data.free_count === 0}
    }
}

/*---------------邮件-----------------*/

// 通过qq邮箱发送
const sendEmailFromQQ = async (subject, html) => {
    let cfg = config.email.qq;
    if (!cfg || !cfg.user || !cfg.pass) return;
    const transporter = nodeMailer.createTransport({service: 'qq', auth: {user: cfg.user, pass: cfg.pass}});
    transporter.sendMail({
        from: cfg.from,
        to: cfg.to,
        subject: subject,
        html: html
    }, (err) => {
        if (err) return console.log(`发送邮件失败:${err}`, true);
        console.log('发送邮件成功')
    })
}

exports.juejin = async (event, context) => {
    console.log('开始');
    await checkIn();
    await draw();
    console.log('结束');
};

步骤

第一步:获取cookie

掘金官网 -> 开发者工具 -> 刷新页面,随便找一个请求 -> 找到cookie。然后复制到脚本的cookie里面。

  • 注意:之前文章里写的使用document.cookie复制出来的cookie不靠谱,不完整。

image.png

第二步:获取QQ邮箱pass

打开QQ邮箱 -> 设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> 生成授权码;然后复制到email.qq.pass属性上,再把user、from、to改成你自己的。

第三步:打开腾讯云函数控制台

console.cloud.tencent.com/scf

1、新建函数

image.png

2、基础配置

image.png

3、触发器配置

image.png

0 0 1 * * * * 代表每天的一点整。具体规则可以看这里:Cron相关文档

4、保存后安装依赖

函数管理 -> 函数代码 -> 代码编辑 -> 终端 -> 安装依赖

  • 这里应该是问题最多的,因为刚发文章的时候没有带上package.json😂
  1. 目录切到src下面
cd ./src
  1. 安装依赖(前提是已经把package.json文件放到目录里面了)
npm install

image.png

5、测试下看脚本能不能运行

image.png

6、就完事啦~~

点个赞吧