前題
最近想做個ONE的小程序蔓挖,本來打算直接尋找現(xiàn)成的API接口,無奈網上的大部分都不符合自己需求馆衔。
于是在瀏覽官網的過程中瘟判,進行數(shù)據包攔截分析,最終分析出官方的API請求地址以及其他注意事項角溃。
我這里抓取的是【圖文】頁面拷获,其他頁面自行嘗試。
請求地址
抓取流量开镣,發(fā)現(xiàn)有一個json api請求:
http://m.wufazhuce.com/one/ajaxlist/0?_token=ebcfe13848eaca8d74f86140066c0186f22cf249
它會返回如下數(shù)據:
然后再頁面滾動刀诬,會自動加載下一頁API數(shù)據,地址是這樣的:
http://m.wufazhuce.com/one/ajaxlist/2088?_token=ebcfe13848eaca8d74f86140066c0186f22cf249
可能你已經看出來了邪财,這個/ajaxlist/2088
后邊的數(shù)字陕壹,是我們第一次/ajaxlist/0
請求得到的數(shù)據列表的最后一個數(shù)據id
所以我們通過這樣,就能無限地加載下一頁數(shù)據了树埠。
token獲取
當然糠馆,前邊的請求地址中的_token
參數(shù)是必須的,也是隨機的(每個瀏覽器中所生成的都不同)
那我們從哪獲取呢怎憋?
在html源碼里:
所以我們只能解析該html數(shù)據又碌,得到我們需要的token了,js代碼如下:
var token = data.split("One.token = '")[1].split("'")[0];
data為html文本數(shù)據
cookie獲取
就這么結束了嗎绊袋?
不是的毕匀!我們獲取到了token,但是請求的時候癌别,會直接返回錯誤的數(shù)據:
這是為什么呢皂岔?
經過多次嘗試,發(fā)現(xiàn)了問題所在:
_token是和Cookie相關聯(lián)的
所以展姐,我們還得去獲取到_token
對應的Cookie
躁垛,然后在請求的時候加上,就可以了圾笨。
代碼實現(xiàn)
當然上述的_token
和Cookie
獲取可以在一次請求中完成教馆,因為第一次請求,會返回一個Set-Cookie
的header:
所以我們直接封裝一個api.js
:
// 作者:https://nextstack.xyz
var TOKEN = '';
class API {
constructor () {
this.API = 'http://m.wufazhuce.com/one/ajaxlist/';
this.COOKIE = '';
}
/**
* 獲取token
*/
getToken () {
return new Promise((RES, REJ) => {
if (TOKEN) return RES(TOKEN);
wx.request({
url: 'http://m.wufazhuce.com/one',
responseType: 'text',
success: ret => {
this.COOKIE = ret.header['Set-Cookie'];
var _token = ret.data.split("One.token = '")[1].split("'")[0];
if (_token && (_token.length === 40)) {
TOKEN = _token;
return RES(_token);
}
REJ()
},
fail: REJ
})
})
}
/**
* 獲取數(shù)據
*/
getData (page = 0) {
return new Promise((RES, REJ) => {
this.getToken().then(token => {
var url = this.API + page + '?_token=' + token;
console.log('request->', url)
wx.request({
url,
header: {
'Cookie': this.COOKIE
},
success: data => {
console.log('data=', data);
RES(data);
},
fail: REJ
})
})
});
}
}
module.exports = new API();
調用方法:
var API = require('../utils/api.js');
API.getData().then(datas => {
//下一頁
API.getData(data.data[data.data.length - 1].id).then(next_datas => {})
})