mirror of
https://github.com/DIYgod/RSSHub.git
synced 2025-12-05 04:11:26 +08:00
* fix(route): 修复 newrank 列举公众号文章的 URL; 增加缺少的 n-token 参数; 文档中说明必须自建 * fix(route): newrank: code review update * feat(route): 获取 newrank 得出的微信公众号链接的全文 * refactor: migrate to v2 ---------
113 lines
3.5 KiB
JavaScript
113 lines
3.5 KiB
JavaScript
const md5 = require('@/utils/md5');
|
|
const got = require('@/utils/got');
|
|
const config = require('@/config').value;
|
|
const newrank_cookie_token = 'newrank_cookie_token';
|
|
const query_count = 'newrank_cookie_count';
|
|
const max_query_count = 30;
|
|
|
|
const random_nonce = (count) => {
|
|
const arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
|
|
const shuffled = arr.slice(0);
|
|
let i = arr.length,
|
|
temp,
|
|
index,
|
|
str = '';
|
|
const min = i - count;
|
|
while (i-- > min) {
|
|
index = Math.floor((i + 1) * Math.random());
|
|
temp = shuffled[index];
|
|
str = str + temp;
|
|
}
|
|
return str;
|
|
};
|
|
|
|
const decrypt_login_xyz = (username, decrypt_password, nonce) => {
|
|
const str = '/nr/user/login/loginByAccount?AppKey=joker&account=' + username + '&password=' + decrypt_password + '&state=1&nonce=' + nonce;
|
|
return md5(str);
|
|
};
|
|
|
|
const decrypt_wechat_detail_xyz = (uid, nonce) => {
|
|
const str = '/xdnphb/detail/v1/rank/article/lists?AppKey=joker&account=' + uid + '&nonce=' + nonce;
|
|
return md5(str);
|
|
};
|
|
|
|
const decrypt_douyin_account_xyz = (nonce) => {
|
|
const str = '/xdnphb/nr/cloud/douyin/detail/accountInfoAll?AppKey=joker&nonce=' + nonce;
|
|
return md5(str);
|
|
};
|
|
|
|
const decrypt_douyin_detail_xyz = (nonce) => {
|
|
const str = '/xdnphb/nr/cloud/douyin/detail/aweme?AppKey=joker&nonce=' + nonce;
|
|
return md5(str);
|
|
};
|
|
|
|
const flatten = (arr) => arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
|
|
|
|
function shouldUpdateCookie(ctx, forcedUpdate = false) {
|
|
if (forcedUpdate) {
|
|
ctx.cache.set(query_count, 0);
|
|
} else {
|
|
const count = ctx.cache.get(query_count);
|
|
if (!count) {
|
|
ctx.cache.set(query_count, 1);
|
|
} else {
|
|
if (count > max_query_count) {
|
|
ctx.cache.set(query_count, 0);
|
|
clearCookie(ctx);
|
|
} else {
|
|
ctx.cache.set(query_count, count + 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function clearCookie(ctx) {
|
|
ctx.cache.set(newrank_cookie_token, null);
|
|
}
|
|
|
|
// 加了验证码失效了
|
|
async function getCookie(ctx) {
|
|
// Check if this key should be replace? every 30 times should be fine.
|
|
shouldUpdateCookie(ctx);
|
|
let token = await ctx.cache.get(newrank_cookie_token);
|
|
const username = String(config.newrank.username);
|
|
const password = md5(md5(String(config.newrank.password)) + 'daddy');
|
|
const nonce = random_nonce(9);
|
|
const xyz = decrypt_login_xyz(username, password, nonce);
|
|
if (!token) {
|
|
const indexResponse = await got({
|
|
method: 'post',
|
|
url: 'https://www.newrank.cn/nr/user/login/loginByAccount',
|
|
form: {
|
|
account: username,
|
|
password,
|
|
state: 1,
|
|
nonce,
|
|
xyz,
|
|
},
|
|
});
|
|
const set_cookie = indexResponse.headers['set-cookie'];
|
|
if (set_cookie) {
|
|
for (const e of set_cookie) {
|
|
if (e.indexOf('token') === 0) {
|
|
token = e.split(';')[0];
|
|
}
|
|
}
|
|
}
|
|
ctx.cache.set(newrank_cookie_token, token, 600);
|
|
// We have acquired new cookie. It may due to cache timeout.
|
|
// Force update counter and don't wait it finished.
|
|
shouldUpdateCookie(ctx, true);
|
|
}
|
|
return token;
|
|
}
|
|
|
|
module.exports = {
|
|
getCookie,
|
|
random_nonce,
|
|
decrypt_wechat_detail_xyz,
|
|
decrypt_douyin_account_xyz,
|
|
decrypt_douyin_detail_xyz,
|
|
flatten,
|
|
};
|