折腾:
【未解决】模拟mp.codeup.cn中调用queryAllPageByEbookId.do返回json数据
期间,需要去分析,感觉是此处能请求成功的核心参数:
- _timestamp
- _nonce
- _sign
结果:
_timestamp的:
1583157835
_nonce的:
491fd5fc-b046-4bd7-870b-ccae94ccc23b
_sign的
47CBFDFACD3E0A0746E2391C7F78AD00
都搜不到。。。
看来是js内部生成的
搜:
queryAllPageByEbookId.do

http://mp.codeup.cn/book/index.js?id=2020218
function fetch(params) {
var url ='/ebookpageservices/queryAllPageByEbookId.do';
if(params.data.bookId!=null){
url='/ebookpageservices/queryAllPageByBookId.do'
}
crossDomainPost(PROJECT_NAME_BIZ,url,
params.data,
function (json) {
params.success(json);
});
}去搜:PROJECT_NAME_BIZ
能找到:
http://mp.codeup.cn/book/js/ytrequest.js var PROJECT_NAME_BIZ='biz';
去找:
fetch(

结果一直在搜索,没法结束。
关闭页面,重新调试。
重新调试:
把
完全下载下载到本地,去看看代码
function fetch(params) {
var url ='/ebookpageservices/queryAllPageByEbookId.do';
if(params.data.bookId!=null){
url='/ebookpageservices/queryAllPageByBookId.do'
}
crossDomainPost(PROJECT_NAME_BIZ,url,
params.data,
function (json) {
params.success(json);
});
}
找到当前文件中被调用的地方:
function initData(id,bookId) {
queryAllPages(id,bookId);
}
function queryAllPages(id,bookId) {
fetch({
data: { 'bookId':bookId,'ebookId': id,'edit':editor},
success: function (res) {
var pageList = res.data.data;
var onlineStatus = res.data.onlineStatus;
ebookConf = res.data.ebookConf;
allPages = res.data.data;
window.title=res.data.bookName;
if(editor!=1 && onlineStatus == 0){
$('.unauthorized-warp').css('display', 'flex');
$('.unauthorized-tip1').html('电子样书暂时下架,请上架后再来哦');
$('.unauthorized-tip1+a').attr('href', HOST.replace('mp','www'));
$('.ebook-spin').css({"display":"none"});
return;
}
if(ebookConf.formId){
$('.userFeedback').show();
queryFormModules(ebookConf.formId);
}
if(pageList.length) {
initFilpbook(pageList, ebookConf || {})
;
setShareData(ebookConf.ebookId ,bookId, res.data.thumbnails);
} else {
$('.unauthorized-warp').css('display', 'flex');
$('.unauthorized-tip1+a').attr('href', HOST.replace('mp','www'));
$('.ebook-spin').css({"display":"none"});
}
$('.opts .preview .preview-hover-wrap img').attr('src', HOST+'/qrService/genCommonQr.do?v=2&size=256&qrText='+HOST+'/book/sample2.htm?id='+ebookConf.ebookId);
}
})
}
var flipBookW, flipBookH;
window.onload = function () {
var Request=new Object();
Request=GetRequest();
var bookId=Request['bookId'];
editor=Request['edit'];
var id=Request['id'];
var bookshelfId=Request['shelfId'];
var bookMallId=Request['mallId'];
initData(id,bookId);
// getLoginQr();
。。。所以是:
window的onload -> initData -> queryAllPages -> fetch
然后发现
Request=GetRequest();
也是当前文件,且是从输入中分析要的值:
function GetRequest(){
var url = location.search;//获取url中?后的字串
var theRequest = new Object();
if(url.indexOf("?") != -1){
var str = url.substr(1),//抽取从 start 下标开始的指定数目的字符
strs = str.split("&");
for(var i = 0; i < strs.length; i++){
theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
}
}
return theRequest;
}此处先去自己从url
http://mp.codeup.cn/book/sample2.htm?id=52365&shelfId=4824&share_=6765370&sh=sh&vt_=1583111113754&_logined=1
分出:
id = 52365 shelfId = 4824 share_ = 6765370 sh = sh vt_ = 1583111113754 _logined = 1
->
id = 52365
此处没有bookId
发现不影响,核心是id,即bookId
然后主要是:
分析crossDomainPost,搞清楚sign等参数的逻辑
此处没有crossDomainPost的定义。
去找:

下载下来
拷贝出代码:
function crossDomainPost(projectName,api,data,callback) {
$.ajax({
type: "post",
url: genRequestUrl(HOST,projectName,api),
data: requestSign(data),
dataType: "json",
crossDomain: true,
//jquery.js
xhrFields: {
withCredentials: true
},
//zepto.js
beforeSend: function (xhr, settings) {
xhr.withCredentials=true;
},
success: function (result, status, xhr) {
if ($.isFunction(callback)) callback(result);
},
error: function (xhr, errorType, error) {
},
complete: function (xhr, status) {
}
})
}以及:
// ajax封装,请求接口加密
function requestSign(options) {
// 加入时间戳和uuid参数
options['_timestamp'] = Date.parse(new Date())/1000;
options['_nonce'] = requestUuidV4();
// 生成加密参数
var hash ='';
var newKeys = Object.keys(options).sort();
for (var i = 0; i < newKeys.length; i++) {
var key=newKeys[i];
var val=options[key];
hash+=( val=== null || val=== undefined)? '' : (val + '')+key+ '';
}
options['_sign'] =hex_md5(hash).toUpperCase();
return options;
}
// 生成uuid
function requestUuidV4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}TODO:
看来是都有源码,剩下就是:
有空,需要时,再去转换成python代码
暂时不需要。
转载请注明:在路上 » 【未解决】分析mp.codeup.cn中核心参数_timestamp、_nonce、_sign逻辑