Skip to content

Commit

Permalink
Fix jandon pic algorithm (DIYgod#219)
Browse files Browse the repository at this point in the history
* Fix jandon pic algorithm

Signed-off-by: Xuanwo <[email protected]>

* Make eslint happy

Signed-off-by: Xuanwo <[email protected]>

* Use Buffer.from instead for new Buffer

Signed-off-by: Xuanwo <[email protected]>
  • Loading branch information
Xuanwo authored and DIYgod committed May 27, 2018
1 parent 2c26875 commit af90cf7
Showing 1 changed file with 3 additions and 76 deletions.
79 changes: 3 additions & 76 deletions routes/jandan/pic.js
Original file line number Diff line number Diff line change
@@ -1,75 +1,11 @@
const axios = require('../../utils/axios');
const cheerio = require('cheerio');
const crypto = require('crypto');
const config = require('../../config');

const md5 = (i) =>
crypto
.createHash('md5')
.update(i)
.digest()
.toString('hex');

const base64_decode = (i) => new Buffer(i, 'base64').toString('binary');

const chr = (i) => String.fromCharCode(i);

const ord = (i) => i.charCodeAt();

const time = () => parseInt(new Date().getTime() / 1000);

// jandan_magic will load a magic string from jandan's script, which will be used in jandan_decode.
const jandan_magic = async (url) => {
const script = await axios({
method: 'get',
url: 'http:' + url,
headers: {
'User-Agent': config.ua,
Referer: 'http://jandan.net',
},
});
const regex = /e,"([a-zA-Z0-9]{32})"/;
return script.data.match(regex)[1];
};
const base64_decode = (i) => Buffer.from(i, 'base64').toString('binary');

// jandan_decode is borrowed from jandan.net, which is used in function jandan_load_img.
const jandan_decode = (m, r) => {
const q = 4;
r = md5(r);
const o = md5(r.substr(0, 16));
const n = md5(r.substr(16, 16));
const l = m.substr(0, q);
const c = o + md5(o + l);
let k;
m = m.substr(q);
k = base64_decode(m);

const h = new Array(256);
for (let g = 0; g < 256; g++) {
h[g] = g;
}
const b = new Array(256);
for (let g = 0; g < 256; g++) {
b[g] = c.charCodeAt(g % c.length);
}
for (let f = 0, g = 0; g < 256; g++) {
f = (f + h[g] + b[g]) % 256;
[h[g], h[f]] = [h[f], h[g]];
}

let t = '';
k = k.split('');
for (let p = 0, f = 0, g = 0; g < k.length; g++) {
p = (p + 1) % 256;
f = (f + h[p]) % 256;
[h[p], h[f]] = [h[f], h[p]];
t += chr(ord(k[g]) ^ h[(h[p] + h[f]) % 256]);
}
if ((t.substr(0, 10) === '0' || t.substr(0, 10) - time() > 0) && t.substr(10, 16) === md5(t.substr(26) + n).substr(0, 16)) {
t = t.substr(26);
}
return t;
};
const jandan_decode = (m) => base64_decode(m);

module.exports = async (ctx) => {
const response = await axios({
Expand All @@ -83,15 +19,6 @@ module.exports = async (ctx) => {

const $ = cheerio.load(response.data);

let script_url = '';
$('script').each((index, item) => {
const s = $(item).attr('src');
if (s && s.startsWith('//cdn.jandan.net/static/min/')) {
script_url = s;
}
});
const magic_string = await jandan_magic(script_url);

const items = Array();
$('.commentlist > li').each((_, item) => {
// Get current comment id, if comment_id is 'adsense', just need to skip..
Expand All @@ -118,7 +45,7 @@ module.exports = async (ctx) => {
if (img_url === null) {
return;
}
img_url = jandan_decode(img_url, magic_string);
img_url = jandan_decode(img_url);
img_url = img_url.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, '$1large$3');

// TODO: should load user's comments.
Expand Down

0 comments on commit af90cf7

Please sign in to comment.