ios_rule_script/script/tieba/tieba_signin.js

236 lines
37 KiB
JavaScript
Raw Normal View History

2022-09-14 23:17:52 +08:00
/*
百度贴吧签到增加重试机制减少签到失败的情况
脚本为串行执行通过设定batchSize的值<int>实现每批多少个贴吧并行签到一次
*/
const scirptName = "百度贴吧";
const batchSize = 20;
const retries = 10; // 签到失败重试次数
const interval = 5000; // 每次重试间隔
const tiebaCookieKey = "tieba_signin_cookie";
const tiebeGetCookieRegex1 = /https?:\/\/(c\.tieba\.baidu\.com|180\.97\.\d+\.\d+)\/c\/s\/login/;
const tiebeGetCookieRegex2 = /^https?:\/\/c\.tieba\.baidu\.com\/c\/s\/channelIconConfig/;
const tiebeGetCookieRegex3 = /https?:\/\/tiebac\.baidu\.com\/c\/u\/follow\/getFoldedMessageUserInfo/;
const $ = MagicJS(scirptName, "INFO");
let currentCookie = "";
function addCookie(config) {
config.headers["Cookie"] = currentCookie;
return config;
}
$.http.interceptors.request.use(addCookie);
function getTieBaList() {
return new Promise((resolve, reject) => {
$.http.get({
url: "https://tieba.baidu.com/mo/q/newmoindex",
headers: {
"Content-Type": "application/octet-stream",
"Referer": "https://tieba.baidu.com/index/tbwise/forum",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 12_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/16A366",
},
body: ""
}).then(resp => {
const obj = resp.body;
if (obj.error === "success") {
$.logger.info(`获取贴吧列表成功,共关注${obj.data.like_forum.length}个贴吧`);
resolve([obj.data.tbs, obj.data.like_forum])
}
}).catch(err => {
const errMsg = `获取贴吧列表失败,${err}`;
$.logger.error();
$.notification.post("获取贴吧列表失败,请查阅日志");
reject(errMsg);
})
})
}
function tiebaSignIn(tbs, tieba) {
const kw = tieba["forum_name"];
return new Promise((resolve, reject) => {
if (tieba["is_sign"] === 1) {
resolve(`[${kw}] 重复签到`);
}
else {
let msg = "";
const body = `tbs=${tbs}&kw=${kw}&ie=utf-8`;
$.http.post({
url: "https://tieba.baidu.com/sign/add",
headers: {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip,deflate,br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Connection": "keep-alive",
"Host": "tieba.baidu.com",
"Referer": "https://tieba.baidu.com/",
"x-requested-with": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63",
},
body: body
}).then(resp => {
const obj = resp.body;
if (obj.data.errmsg === "success" && obj.data.errno === 0 && obj.data.uinfo.is_sign_in === 1) {
msg = `[${kw}] 签到成功 排名 ${obj.data.uinfo.user_sign_rank} 积分 ${obj.data.uinfo.cont_sign_num}`;
$.logger.info(msg);
resolve(msg);
} else {
if (obj.no === 2150040) {
msg = `[${kw}] 签到失败need vcode`;
} else if (obj.no === 1011) {
msg = `[${kw}] 未加入此吧或等级不够`;
}
else if (obj.no === 1102) {
msg = `[${kw}] 签到过快`;
}
else if (obj.no === 1101) {
msg = `[${kw}] 重复签到`;
}
else if (obj.no === 1010) {
msg = `[${kw}] 目录出错`;
}
else {
msg = `[${kw}] 签到失败`;
}
$.logger.warning(`${msg}\n${JSON.stringify(obj)}`);
reject(msg);
}
}).catch(err => {
msg = `[${kw}] 签到异常`;
$.logger.warning(`${kw} 签到异常\n${err}`);
reject(msg);
})
}
})
}
function getUserInfo() {
return new Promise((resolve, reject) => {
$.http.get({
url: "https://tieba.baidu.com/mo/q/sync",
headers: {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Host": "tieba.baidu.com",
"Referer": "https://tieba.baidu.com/home/main"
}
}).then(resp => {
if (resp.body.no === 0 && resp.body.error === "success") {
resolve(resp.body.data.user_id);
}
}).catch(err => {
$.logger.error(`获取用户信息出现出现异常,${err}`);
reject(err);
})
});
}
async function multiUsersSignIn() {
const allSessionskey = $.data.allSessions(tiebaCookieKey);
if (allSessionskey.length === 0) {
$.logger.error(`没有需要签到的Cookie请先登录百度贴吧`);
$.notification.post(`没有需要签到的Cookie请先登录百度贴吧`);
$.done();
}
$.logger.info(`本次一共需要签到 ${allSessionskey.length} 个Cookies`);
for (let [index, sessionKey] of allSessionskey.entries()) {
currentCookie = $.data.read(tiebaCookieKey, null, sessionKey);
if (!currentCookie) {
continue;
}
else {
$.logger.info(`当前正在进行第 ${index + 1} 个Cookie签到`);
let content = "🥺很遗憾,以下贴吧签到失败:";
let success = 0;
let failure = 0;
const [tbs, tiebaList] = await $.utils.retry(getTieBaList, retries, interval)();
const tiebaCount = tiebaList.length;
const cycleNumber = Math.ceil(tiebaList.length / batchSize);
for (let i = 0; i < cycleNumber; i++) {
let batchTiebaPromise = [];
const batchTiebaList = tiebaList.splice(0, batchSize);
for (let tieba of batchTiebaList) {
batchTiebaPromise.push($.utils.retry(tiebaSignIn, retries, interval)(tbs, tieba));
}
await Promise.all(batchTiebaPromise).then((result) => {
result.forEach((element) => {
if (element.indexOf("签到成功") < 0 && element.indexOf("重复签到") < 0) {
failure += 1;
content += `\n${element}`;
} else {
success += 1;
}
});
});
}
$.notification.post(scirptName, `签到${tiebaCount}个,成功${success}个,失败${failure}个!`, !!failure > 0 ? content : "🎉恭喜,所有贴吧签到成功!!");
$.logger.info(`${index + 1} 个Cookie签到完毕`);
}
}
}
(async () => {
// 获取百度贴吧Cookie
if ($.isRequest && (
tiebeGetCookieRegex1.test($.request.url) ||
tiebeGetCookieRegex2.test($.request.url) ||
tiebeGetCookieRegex3.test($.request.url))
) {
const cookie = $.request.headers.Cookie;
currentCookie = cookie;
$.logger.info(`获取百度贴吧Cookies(请勿泄露):\n${cookie}`);
if (!!cookie) {
const userId = await getUserInfo();
if (!userId) {
userId = "default";
}
$.logger.info(`获取用户Id:${userId}`);
const result = $.data.update(tiebaCookieKey, cookie, userId);
if (result) {
const msg = "🎈获取百度贴吧Cookie成功";
$.notification.post(msg);
$.logger.info(msg);
}
else {
$.logger.info("Cookie没有变化无需更新")
}
const syncQinglong = $.data.read("tieba_sync_qinglong", false);
$.logger.info(`${syncQinglong === true ? "" : "不"}同步Cookie到青龙面板`);
if (syncQinglong === true) {
const msg = "🎈百度贴吧Cookie同步到青龙面板成功";
const syncQinglong = await $.qinglong.update(tiebaCookieKey, cookie, userId);
if (syncQinglong) {
$.notification.post(msg);
$.logger.info(msg);
}
}
}
}
// 签到
else {
await multiUsersSignIn();
}
$.done();
})();
/**
*
* $$\ $$\ $$\ $$$$$\ $$$$$$\ $$$$$$\
* $$$\ $$$ | \__| \__$$ |$$ __$$\ $$ ___$$\
* $$$$\ $$$$ | $$$$$$\ $$$$$$\ $$\ $$$$$$$\ $$ |$$ / \__| \_/ $$ |
* $$\$$\$$ $$ | \____$$\ $$ __$$\ $$ |$$ _____| $$ |\$$$$$$\ $$$$$ /
* $$ \$$$ $$ | $$$$$$$ |$$ / $$ |$$ |$$ / $$\ $$ | \____$$\ \___$$\
* $$ |\$ /$$ |$$ __$$ |$$ | $$ |$$ |$$ | $$ | $$ |$$\ $$ | $$\ $$ |
* $$ | \_/ $$ |\$$$$$$$ |\$$$$$$$ |$$ |\$$$$$$$\\$$$$$$ |\$$$$$$ | \$$$$$$ |
* \__| \__| \_______| \____$$ |\__| \_______|\______/ \______/ \______/
* $$\ $$ |
* \$$$$$$ |
* \______/
*
*/
function MagicJS(e = "MagicJS", t = "INFO") { const r = () => { const e = typeof $loon !== "undefined"; const t = typeof $task !== "undefined"; const n = typeof module !== "undefined"; const r = typeof $httpClient !== "undefined" && !e; const i = typeof $storm !== "undefined"; const o = typeof $environment !== "undefined" && typeof $environment["stash-build"] !== "undefined"; const s = r || e || i || o; const a = typeof importModule !== "undefined"; return { isLoon: e, isQuanX: t, isNode: n, isSurge: r, isStorm: i, isStash: o, isSurgeLike: s, isScriptable: a, get name() { if (e) { return "Loon" } else if (t) { return "QuantumultX" } else if (n) { return "NodeJS" } else if (r) { return "Surge" } else if (a) { return "Scriptable" } else { return "unknown" } }, get build() { if (r) { return $environment["surge-build"] } else if (o) { return $environment["stash-build"] } else if (i) { return $storm.buildVersion } }, get language() { if (r || o) { return $environment["language"] } }, get version() { if (r) { return $environment["surge-version"] } else if (o) { return $environment["stash-version"] } else if (i) { return $storm.appVersion } else if (n) { return process.version } }, get system() { if (r) { return $environment["system"] } else if (n) { return process.platform } }, get systemVersion() { if (i) { return $storm.systemVersion } }, get deviceName() { if (i) { return $storm.deviceName } } } }; const i = (n, e = "INFO") => { let r = e; const i = { SNIFFER: 6, DEBUG: 5, INFO: 4, NOTIFY: 3, WARNING: 2, ERROR: 1, CRITICAL: 0, NONE: -1 }; const o = { SNIFFER: "", DEBUG: "", INFO: "", NOTIFY: "", WARNING: "❗ ", ERROR: "❌ ", CRITICAL: "❌ ", NONE: "" }; const t = (e, t = "INFO") => { if (!(i[r] < i[t.toUpperCase()])) console.log(`[${t}] [${n}]\n${o[t.toUpperCase()]}${e}\n`) }; const s = e => { r = e }; return { setLevel: s, sniffer: e => { t(e, "SNIFFER") }, debug: e => { t(e, "DEBUG") }, info: e => { t(e, "INFO") }, notify: e => { t(e, "NOTIFY") }, warning: e => { t(e, "WARNING") }, error: e => { t(e, "ERROR") }, retry: e => { t(e, "RETRY") } } }; return new class { constructor(e, t) { this._startTime = Date.now(); this.version = "3.0.0"; this.scriptName = e; this.env = r(); this.logger = i(e, t); this.http = typeof MagicHttp === "function" ? MagicHttp(this.env, this.logger) : undefined; this.data = typeof MagicData === "function" ? MagicData(this.env, this.logger) : undefined; this.notification = typeof MagicNotification === "function" ? MagicNotification(this.scriptName, this.env, this.logger, this.http) : undefined; this.utils = typeof MagicUtils === "function" ? MagicUtils(this.env, this.logger) : undefined; this.qinglong = typeof MagicQingLong === "function" ? MagicQingLong(this.env, this.data, this.logger) : undefined; if (typeof this.data !== "undefined") { let e = this.data.read("magic_loglevel"); const n = this.data.read("magic_bark_url"); if (e) { this.logger.setLevel(e.toUpperCase()) } if (n) { this.notification.setBark(n) } } } get isRequest() { return typeof $request !== "undefined" && typeof $response === "undefined" } get isResponse() { return typeof $response !== "undefined" } get isDebug() { return this.logger.level === "DEBUG" } get request() { return typeof $request !== "undefined" ? $request : undefined } get response() { if (typeof $response !== "undefined") { if ($response.hasOwnProperty("status")) $response["statusCode"] = $response["status"]; if ($response.hasOwnProperty("statusCode")) $response["status"] = $response["statusCode"]; return $response } else { return undefined } } done = (e = {}) => { this._endTime = Date.now(); let t = (this._endTime - this._startTime) / 1e3; this.logger.info(`SCRIPT COMPLETED: ${t} S.`); if (typeof $done !== "undefined") { $done(e) } } }(e, t) } function MagicHttp(u, c) { const t = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1"; const n = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.59"