使用node实现社区自动签到
身为一个菜鸡,也没啥好水的,就写下自动签到吧
这个签到程序,跟着社区升级,更新了好几版,从最开始只要带着cookie请求签到页面就行,到后来需要先获取token,再到现在的需要更新cookie,中途踩了几个小坑,随便看看吧
1. 需求分析
自动签到嘛,只要到了指定时间带着身份信息去请求指定的页面或接口就行,最后以防万一,把签到结果发个邮件给自己的邮箱,好了,分析完毕
2. 初始化项目
首先,安装node,已安装,跳过。
然后PowerShell执行yarn init
,输入名称,描述啥的,还有入口文件,爱写啥写啥写,我写app.js
,然后在项目文件夹下建立入口文件,也就是app.js
,初始化完成。
3. 定时任务
本着能用别人的绝不自己写的原则,先安装定时任务模块
继续用yarn安装node-schedule:yarn add node-schedule
然后在app.js中引入
1 | const schedule = require('node-schedule'); |
其中scheduleJob
的第一个参数是* * * * * *
,6个星号,从左往右分别是秒 分 时 日 月 年
,因为我设定的是每天0点0分2秒开始签到,所以写2 0 0 * * *
,如果是每小时的第25分15秒执行,那么写15 25 * * * *
,可以设定每分钟执行一次测试定时任务有没有正常启动
4. 获取cookie
由于我懒得写登录,就直接F12拿cookie了,只需要JSESSIONID
和symphony
两个部分,搞一个数组存放,0放JSESSIONID,1放symphony,最后JSON.stringify(cookieArray)
一下转字符串写入项目文件夹下的cookie.txt中,大概长这样
1 | ["JSESSIONID=lallalala换成你自己的;Path=/","symphony=lalalalla换成你自己的;Path=/;Expires=Sun, 25-Aug-2019 16:00:03 GMT;Max-Age=604800;Secure;HttpOnly"] |
const request = require(‘request’);
const cheerio = require(‘cheerio’);
const fs = require(‘fs’); //用于读写文件
const hacpaiGetSignUrl = () => {
//先读取cookie,需要转成utf-8
let hacCookie = fs.readFileSync(‘cookie.txt’).toString(‘utf-8’);
hacCookie = JSON.parse(hacCookie)
let url = ‘https://hacpai.com/activity/checkin‘
//设定请求参数
let options = {
url: url,
headers: {
‘Upgrade-Insecure-Requests’: 1,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36’,
‘cookie’: hacCookie
}
}
let nowTime = new Date();
//发起请求
request(options, (err, res, body) => {
if (err) {
console.log(nowTime.toLocaleTimeString() + “—->签到获取地址失败—->\n” + err);
sendMailTast(“黑客派签到地址请求失败”, “”) //请求失败时直接发邮件
} else {
console.log(nowTime.toLocaleTimeString() + “—->签到获取地址成功—->\n”);
//如果返回头里包含set-cookie字段,需要更新cookie
if (res.headers[‘set-cookie’] != undefined) {
//更新cookie
writeCookie(res.headers[‘set-cookie’], hacCookie)
}
//开始解析网页
let $ = cheerio.load(body)
let signUrl = “”
try {
signUrl = $(‘.btn.green’).get(0).attribs.href;
console.log(“—–>签到地址” + signUrl + “\n”);
hacpaiSignRequest(signUrl) //获取地址成功,去请求即可签到成功
} catch (e) {
signUrl = ‘签到地址异常’
sendMailTast(“黑客派签到地址异常”, “”) //解析异常的时候直接发邮件
}
}
})
}
1 |
|
const writeCookie = (setCookie, oldCookie) => {
setCookie.forEach((e) => {
if (e.indexOf(‘JSESSIONID’) != -1) {
oldCookie[0] = e
}
if (e.indexOf(‘symphony’) != -1) {
oldCookie[1] = e
}
})
fs.writeFileSync(‘cookie.txt’, JSON.stringify(oldCookie))
}
1 |
|
//将请求地址作为参数传过来
const hacpaiSignRequest = (signUrl) => {
//读cookie
let hacCookie = fs.readFileSync(‘cookie.txt’).toString(‘utf-8’);
hacCookie = JSON.parse(hacCookie)
//设置请求参数
let options = {
url: signUrl,
headers: {
‘Referer’: ‘https://hacpai.com/activity/checkin‘,
‘Upgrade-Insecure-Requests’: 1,
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36’,
‘cookie’: hacCookie
}
}
let nowTime = new Date();
console.log(“时间:” + nowTime.toLocaleTimeString());
//发起请求
request(options, (err, res, body) => {
nowtime = new Date();
if (err) {
console.log(nowTime.toLocaleTimeString() + “—->签到请求失败—->\n” + err);
//请求失败发邮件
sendMailTast(“黑客派签到结果”, nowTime.toLocaleTimeString() + “—->签到请求失败—->\n” + err);
} else {
console.log(nowTime.toLocaleTimeString() + “—->签到请求成功—->\n”);
if (res.headers[‘set-cookie’] != undefined) {
writeCookie(res.headers[‘set-cookie’], hacCookie)
}
//解析网页获取今天签到获得的积分
let $ = cheerio.load(body)
let num = “0”
try {
num = $(‘code’).get(0).children[0].data;
} catch (e) {
num = ‘签到异常’
}
//签到完成,发送邮件
sendMailTast(“黑客派签到结果” + num, “获得积分:” + num + “ \n” + nowTime.toLocaleTimeString() + “—->签到请求成功—->\n” + “status—->” + res.statusCode + “\n签到获得积分–>” + num);
}
})
}
1 |
|
const nodemailer = require(‘nodemailer’);
const sendMailTast = (title, content) => {
let transporter = nodemailer.createTransport({
host: ‘smtp.163.com’,
port: 465,
secure: true,
auth: {
user: ‘你的用户名’,
pass: ‘授权码或密码,忘记了,理论上是要授权码,反正试试就行’
}
});
//邮件信息
let mailOptions = {
from: ‘“签到”<发件邮箱>’,
to: ‘接收邮箱’,
subject: title,
text: content
};
//发送邮件
transporter.sendMail(mailOptions, (error, info) => {
let nowTime = new Date();
if (error) {
//发送异常
console.log(“时间:” + nowTime.toLocaleTimeString() + title + “–>邮件发送失败—>\n” + error);
} else {
//发送成功
console.log(“时间:” + nowTime.toLocaleTimeString() + title + “–>邮件发送成功”);
}
//邮件发送完毕,今日签到完成
console.log(“—–>” + nowTime.toLocaleDateString() + title + “-签到结束<—–”);
})
}
邮箱的host和port可以去邮箱设置里找,SMTP默认非SSL为25端口,但是一般在服务器上这个端口是被禁的,所以改用SSL的465端口
### 8. 丢服务器跑起来
把`app.js`整理一下,把整个文件夹丢服务端,`node_modules`不用放,在服务端`yarn install`一下就可以了,最后`node app`启动就ok了,接下就只要每天早上看下邮件有没有正常签到就可以了
### 9. EOF
没了,后会有期