之前写了一个挂在
node
环境下的脚本:《掘金免漏签&免费抽奖!三分钟搞一个跑在服务端的自动签到&抽奖脚本~》,评论区有xd想要一个云函数
版的。之前没有研究过云函数
,趁着这次机会看看这玩意儿怎么玩。
脚本
话不多说,先上
完整版
的脚本,如果有自己会新建云函数的,直接复制过去,cookie和邮箱的pass改一下,开个定时任务触发就行。
- 注意:最终云函数src下应该有4个文件:
- package.json
- package-lock.json
- node_modules
- index.js
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
不靠谱,不完整。
第二步:获取QQ邮箱pass
打开QQ邮箱 -> 设置 -> 账户 -> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 -> 生成授权码;然后复制到
email.qq.pass
属性上,再把user、from、to
改成你自己的。
第三步:打开腾讯云函数控制台
1、新建函数
2、基础配置
3、触发器配置
0 0 1 * * * *
代表每天的一点整。具体规则可以看这里:Cron相关文档
4、保存后安装依赖
函数管理 -> 函数代码 -> 代码编辑 -> 终端 -> 安装依赖
- 这里应该是问题最多的,因为刚发文章的时候没有带上package.json😂
- 目录切到
src
下面
cd ./src
- 安装依赖(前提是已经把package.json文件放到目录里面了)
npm install