下面代碼區文本復制到空白文檔,起名為sited_test_manual.js。
```javascript
/*
* Author:wistn
* since:2019-04-12
* LastEditors:Do not edit
* LastEditTime:2019-10-25
* Description: Inspired by MrChen(magicdmer),SiteD Engine/APP is Created by noear.
* v2.5.2。本腳本方便多多貓SiteD插件者用電腦測試插件,目前支持schema=1/0多層節點的【手動流程化測試】。
* 1.需要環境:nodejs環境運行本js文件(先在下文配置好)。我是vscode打開本腳本后直接運行測試(需要vscode安裝Code Runner擴展)
* 2.手動范圍有:
2.1 節點名要手動填寫,特別是
<tags>
<item xxx/>或下一條的
<tags xxx/>或上一條的
</tags>兩層多節點
和只有一層的<tags xxx/>
2.2 parse、buildUrl/parseUrl都要手動填寫函數名
2.3 沒自動加載插件的header/ua/referer/cookie配置;
2.4 沒自動加載插件者自定義的require庫
* 3.更新日志 v2.5.2require多多貓版cheerio庫 v2.5同步請求庫sync-request訪問網頁(可能會比異步請求庫慢很多,以后再恢復增加異步版,也可能只是我網絡問題) v2.4原生cheerio解析sited插件 v2.3采用es6箭頭函數
*/
console.log(new Date().toLocaleTimeString()); //打印本地時間
var fs = require('fs');
var path = require('path');
// var http = require('http');
// var https = require('https');
var querystring = require('querystring');
function print(string) {
console.log(string);
} //定義插件里print命令
var cheerio = require('./lib/main_res_raw_cheerio.js'); //因為多多貓版cheerio庫對于原生cheerio庫有缺失,不能影響原插件運行find()效果所以保留多多貓版,并且使用cheerio名稱因為插件里也是cheerio。在http://sited.noear.org/addin/js/cheerio.js 下載到本地,然后尾行加上exports = module.exports = cheerio; 才能require()。
var native_cheerio = require('cheerio'); //引入原生cheerio庫,詳見后面
var urlencode = require('urlencode'); //可實現GBK編碼的urlencode
var request = require('sync-request'); //引入同步請求庫sync-request訪問網頁,同步版慢還是被網站拒絕?
var iconv = require('iconv-lite'); //處理gbk等編碼,UTF-8時默認去BOM頭
//沒sync-request等模塊的話就命令行里面進入本文件所在目錄本地安裝npm install -save cheerio urlencode sync-request iconv-lite 等等
var sited_file = fs.readFileSync(path.join(__filename, '../../../../../apachedocument/3.sited.xml'), 'utf-8'); //讀取sited或sited.xml插件文本。如果不懂fs模塊相對路徑的坑也不知道path.join的建議替換為readFileSync('文件絕對路徑')。
var $_ = native_cheerio.load(sited_file, {
normalizeWhitespace: false,
recognizeSelfClosing: true,
xmlMode: true,
recognizeCDATA: true,
decodeEntities: false
}) //定義$_通過原生cheerio庫讀取sited插件,以區別多多貓版cheerio庫解析html的$。因為多多貓版cheerio庫xml模式recognizeCDATA失敗(會把code節點里面有連起來的<和其他字符當作開標簽)
eval($_('code').text()); //運行插件script/code(兼容舊格式jscript/code)節點即js代碼部分
/*以上是腳本前期準備,以下是執行部分(手動填寫節點函數名測試流程)*/
var method = 'GET'; //或者
// var method = 'POST';根據原插件實際情況通過注釋來配置
var encoding = 'GB18030'; //或者'GBK'
// var encoding = 'utf8';
var postbody = querystring.stringify({
// keyword: '需要post時,關鍵詞填入這里再注釋掉'
});
var headers = {
//'Accept':'*/*',
//'accept-encoding':'gzip, deflate, br',//gzip是接收網頁壓縮的請求頭參數,我們插件者要注釋掉
//'Accept-Language':'zh-CN,zh;q=0.8',
//"content-type":"application/x-www-form-urlencoded",
// 'Connection': 'keep-alive',
//'Cookie':'xx',
// 'Host': url.match(/\/\/([^\/]+)/i)[1],
// 'Referer': url.match(/.+?\/\/[^\/]+/i)[0] + '/',
// 'User-Agent': 'iPhone',
}; //源網站、原插件需要特殊headers才配置這里。瀏覽器控制臺headers粘貼過來([^:\s]+):\s*(.+)$正則表達式替換為'$1':'$2',
var ddlog //把ddlog定義為某節點parse return出來的字符串,即多多貓調試模式log日志內容。
var u1 = $_('tags').children().eq(0).attr('url').replace(/amp;/ig, ''); //自己選擇從hots/updates/tags哪個節點url屬性開始測試。
var u2 = 'https://wap.fushutuan.net/'; //或者手動填寫url
var url = u1;
ddlog = tags_parse(url, iconv.decode(request(method, url, {
headers: headers,
body: postbody,
}).getBody(), encoding));
print('tags::' + JSON.stringify(JSON.parse(ddlog).slice(0, 3)) + '……\r\n'); //把上一條命令的log日志轉換為js數組后slice提取前3個條目再轉換為JSON字符串打印省空間。接下來根據第一個條目url進入下一層節點parse解析。
url = JSON.parse(ddlog)[0].url.replace(/@page/i, "1");
ddlog = tag_parse(url, iconv.decode(request(method, url, {
headers: headers,
body: postbody,
}).getBody(), encoding));
print('tag[1]::' + JSON.stringify(JSON.parse(ddlog).slice(0, 3)) + '……\r\n');
url = book_buildUrl(JSON.parse(ddlog)[0].url); //xx_buildUrl是原插件里面book節點函數,自己插件沒有的就直接寫等于JSON.parse(ddlog)[0].url
ddlog = book_parse(url, iconv.decode(request(method, url, {
headers: headers,
body: postbody,
}).getBody(), encoding));
print('book[1]::' + ddlog.slice(0, 500) + '……\r\n');
var search_url = $_('search').attr('url').replace(/amp;/ig, '').replace('@key', '') + urlencode('我的', encoding); //測試搜索節點時搜索詞語替換urlencode里面字符串
var searchlog = search_parse(search_url, iconv.decode(request(method, search_url, {
headers: headers,
body: postbody,
}).getBody(), encoding));
print('search::' + JSON.stringify(JSON.parse(searchlog).slice(0, 3)) + '……\r\n');
```
- 序言
- 第一章 基礎
- 1.1 Html基礎
- 1.2 CSS選擇器
- 1.2.1 標簽選擇器
- 1.2.2 class/id選擇器
- 1.2.3 屬性選擇器
- 1.3 JavaScript基礎
- 1.4 json基礎
- 第二章 中級
- 2.1 插件結構總覽
- 2.2 meta頭部節點講解
- 2.3 main主體節點講解
- 2.4 script腳本節點講解
- 2.5 插件的安裝調試與發布
- 第三章 高級
- 3.1 插件高級特性
- 3.2 常見內容保護突破方法
- 3.3 開發文檔所沒說的事
- 3.4 電腦js腳本測試插件
- 3.5 加login節點教程
- 3.6 使用yeoman生成器
- 3.7 自動化發布插件
- 第四章 附錄
- 4.1 markdown基本用法