index.js
4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const cheerio = require('cheerio');
const superAgent = require('superagent');
const NO_MAGAZINE_ID = '无效的电子刊编号'; // 没有杂志id
const READ_MAGAZINE_URL_ERROR = '电子刊内容读取失败,请重试'; // superagent抓取页面内容失败
const NO_HYPE_CONTAINER_ID = '电子刊格式错误!'; // 找不到hype_container的id
const NO_HYPE_SCRIPT = '无效的电子刊内容!'; // 找不到hype_script
const WRONG_INVIROMENT = '电子刊获取失败!'; // 不在有货app也不在小程序中打开的时候提示
const ERROR_MSG = {
4001: '您未购买该电子刊',
4002: '未获取到电子刊信息',
4003: '该电子刊已被删除',
4004: '阅读码未兑换'
};
const headerModel = require('../../../doraemon/models/header');
const indexModel = require('../models/index');
/**
* 获取到杂志的url之后使用superAgent读取html内容并进行处理后输出
* @param req
* @param res
* @param next
*/
const index = async function(req, res, next) {
let {e_id} = req.query;
let isApp = req.yoho.isApp;
/**
* 用于渲染错误结果页面
* @param result
* @returns {*}
*/
function renderErroPage(result) {
return res.render('index/error', {
pageHeader: headerModel.setNav({
navTitle: false,
navBtn: false
}),
module: 'magazine',
page: 'error',
title: '错误提示',
localCss: true,
result: result
});
}
// 如果不在小程序或app中打开则返回
if (!isApp) {
return renderErroPage({msg: WRONG_INVIROMENT});
}
// 没有杂志id,返回
if (!e_id) {
return renderErroPage({msg: NO_MAGAZINE_ID});
}
// 查看session中是否有登录信息
if (!req.user.uid || !req.user.uid.toString() || !req.user.uid.sessionKey) {
return res.redirect(`//m.yohobuy.com/magazine/${e_id}.html`);
}
// 通过接口获取到杂志对应的实际的url,并进行处理
let magazineInfo = await req.ctx(indexModel).getMagazineInfo(req.user.uid, e_id).catch(next);
// console.log(req.user, magazineInfo);
if (magazineInfo && magazineInfo.code === 200 && magazineInfo.data) {
let code = magazineInfo.data.code;
// 4000:获取成功 4001: 未购买该电子刊 4002:未获取到电子刊 4003:电子刊已删除
if (code === 4000) {
let url = magazineInfo.data.link;
if (!url) {
return renderErroPage({msg: '杂志地址获取失败'});
}
let resourceUrl = url.substring(0, url.lastIndexOf('/') + 1);
superAgent.get(url).end(function(err, response) {
if (err) {
return renderErroPage({msg: READ_MAGAZINE_URL_ERROR});
}
let $ = cheerio.load(response.text);
let idMatch = response.text.match(/id="(.*)_hype_container"/);
// HYPE生成的html有其固定格式的div id,此处获取的也是这个hype创建时的名称,此名称对应插入的js
if (idMatch && idMatch.length >= 2) {
let name = idMatch[1];
let id = `${name}_hype_container`;
let script = $(`#${id}`).html();
let scriptSrc = script.match(/src="(.*)"/);
// 获取到对应div里面的script的src,并替换成带有域名的地址,可以让所有图片地址指向js对应的域名
if (scriptSrc && scriptSrc.length >= 2) {
let src = scriptSrc[1];
let newScript = '<script type="text/javascript" charset="utf-8" src="' +
resourceUrl + src + '">';
$(`#${id}`).html(newScript);
return res.send($.html()); // 输出修改过的html
} else {
return renderErroPage({msg: NO_HYPE_SCRIPT});
}
} else {
return renderErroPage({msg: NO_HYPE_CONTAINER_ID});
}
});
} else {
return renderErroPage({msg: ERROR_MSG[code] || '购买信息校验失败'});
}
} else {
return res.redirect(`//m.yohobuy.com/magazine/${e_id}.html`);
}
};
module.exports = {
index
};