提交 a36ad1a1 编写于 作者: AndroidLeaves's avatar AndroidLeaves

update

上级 88f99459
......@@ -696,7 +696,7 @@ class BaseWidget {
/**
* Http Get 请求接口
* @param {string} url 请求的url
* @param {bool} jsonFromat 返回数据是否为json,默认true
* @param {bool} jsonFormat 返回数据是否为json,默认true
* @param {object} headers 请求头
* @param {boolean} logable 是否打印数据,默认true
* @param {boolean} useICloud 是否使用iCloud
......@@ -707,7 +707,7 @@ class BaseWidget {
let data;
try {
const defaultOptions = {
jsonFromat: true,
jsonFormat: true,
headers: null,
logable: false,
useICloud: false,
......@@ -717,7 +717,7 @@ class BaseWidget {
...defaultOptions,
...options
};
const { jsonFromat, headers, logable, useICloud, scriptName } = options;
const { jsonFormat, headers, logable, useICloud, scriptName } = options;
// 根据URL进行md5生成cacheKey
const cacheFileName = this.md5(url);
const ufm = this.useFileManager({ useICloud, scriptName });
......@@ -738,7 +738,7 @@ class BaseWidget {
console.log(`🤖 Get请求响应:${localCache}`);
}
this.logDivider();
return jsonFromat ? JSON.parse(localCache) : localCache;
return jsonFormat ? JSON.parse(localCache) : localCache;
}
console.log(`🚀 Get在线请求:${url}`);
let req = new Request(url);
......@@ -746,15 +746,15 @@ class BaseWidget {
if (headers != null && headers != undefined) {
req.headers = headers;
}
data = await (jsonFromat ? req.loadJSON() : req.loadString());
data = await (jsonFormat ? req.loadJSON() : req.loadString());
// 判断数据是否为空(加载失败)
if (!data && canLoadCache) {
console.log(`🤖 Get读取缓存:${url}`);
this.logDivider();
return jsonFromat ? JSON.parse(localCache) : localCache;
return jsonFormat ? JSON.parse(localCache) : localCache;
}
// 存储缓存
ufm.writeStringCache(cacheFileName, jsonFromat ? JSON.stringify(data) : data);
ufm.writeStringCache(cacheFileName, jsonFormat ? JSON.stringify(data) : data);
// 是否打印响应数据
if (logable) {
console.log(`🤖 Get请求响应:${JSON.stringify(data)}`);
......@@ -776,7 +776,7 @@ class BaseWidget {
* Http Post 请求接口
* @param {string} url 请求的url
* @param {Array} parameterKV 请求参数键值对数组
* @param {bool} jsonFromat 返回数据是否为json,默认true
* @param {bool} jsonFormat 返回数据是否为json,默认true
* @param {object} headers 请求头
* @param {boolean} logable 是否打印数据,默认true
* @param {boolean} useICloud 是否使用iCloud
......@@ -787,7 +787,7 @@ class BaseWidget {
let data;
try {
const defaultOptions = {
jsonFromat: true,
jsonFormat: true,
headers: null,
logable: false,
useICloud: false,
......@@ -797,7 +797,7 @@ class BaseWidget {
...defaultOptions,
...options
};
const { jsonFromat, headers, logable, useICloud, scriptName } = options;
const { jsonFormat, headers, logable, useICloud, scriptName } = options;
// 根据URL进行md5生成cacheKey
const cacheFileName = this.md5(url);
const ufm = this.useFileManager({ useICloud, scriptName });
......@@ -818,7 +818,7 @@ class BaseWidget {
console.log(`🤖 Post请求响应:${localCache}`);
}
this.logDivider();
return jsonFromat ? JSON.parse(localCache) : localCache;
return jsonFormat ? JSON.parse(localCache) : localCache;
}
console.log(`🚀 Post在线请求:${url}`);
let req = new Request(url);
......@@ -829,15 +829,15 @@ class BaseWidget {
for (const parameter of parameterKV) {
req.addParameterToMultipart(Object.keys(parameter)[0], Object.values(parameter)[0])
}
data = await (jsonFromat ? req.loadJSON() : req.loadString());
data = await (jsonFormat ? req.loadJSON() : req.loadString());
// 判断数据是否为空(加载失败)
if (!data && canLoadCache) {
console.log(`🤖 Post读取缓存:${url}`);
this.logDivider();
return jsonFromat ? JSON.parse(localCache) : localCache;
return jsonFormat ? JSON.parse(localCache) : localCache;
}
// 存储缓存
ufm.writeStringCache(cacheFileName, jsonFromat ? JSON.stringify(data) : data);
ufm.writeStringCache(cacheFileName, jsonFormat ? JSON.stringify(data) : data);
// 是否打印响应数据
if (logable) {
console.log(`🤖 Post请求响应:${JSON.stringify(data)}`);
......@@ -1775,7 +1775,7 @@ class BaseWidget {
const headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36"
};
const html = await this.httpGet(url, { jsonFromat: false, headers });
const html = await this.httpGet(url, { jsonFormat: false, headers });
const webview = new WebView();
await webview.loadHTML(html);
const getData = `
......@@ -2822,7 +2822,7 @@ class BaseWidget {
// ===================================
const { scriptURL } = data;
const response = await this.httpGet(scriptURL, { jsonFromat: true });
const response = await this.httpGet(scriptURL, { jsonFormat: true });
const { author, icon, apps } = response;
const headerRow = new UITableRow();
headerRow.isHeader = true;
......
......@@ -7,7 +7,7 @@
*/
// -------------------------------------------------------
// 是否是开发环境,配合手机端调试使用,正式发布设置为false
const isDev = true;
const isDev = false;
console.log(`开发环境 👉👉👉👉👉 ${isDev ? 'DEV' : 'RELEASE'}`);
console.log(`----------------------------------------`);
const remoteRoot = 'https://gitcode.net/enoyee/scriptable/-/raw/master/';
......@@ -27,16 +27,155 @@ const { BaseWidget } = require(dependencyFileName);
class Widget extends BaseWidget {
defaultPreference = {
domain: 'https://tophub.today',
hotban: { title: '微博 · 热搜榜', url: 'https://tophub.today/n/KqndgxeLl9' },
// 网络请求头
phoneHeaders: {
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1",
},
computerHeader: {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36",
},
};
getValueByKey = (key) => this.readWidgetSetting()[key] ?? this.defaultPreference[key];
titleColorFun = () => this.getValueByKey('titleColor');
getHotban = () => JSON.parse(this.base64Decode(this.getSettingValueByKey('hotban', this.base64Encode(JSON.stringify(this.defaultPreference.hotban)))));
constructor(scriptName) {
super(scriptName);
}
async renderSearchResultView(response) {
const { coverArr = [], linkArr = [], titleArr = [], tipArr = [] } = response;
// =========================================================
const style = `
.list__body {
margin-top: 10px;
background: var(--card-background);
border-radius: var(--card-radius);
overflow: hidden;
}
.form-label {
display: flex;
align-items: center;
}
.form-item {
display: flex;
align-items: center;
justify-content: space-between;
min-height: 4em;
padding: 0.5em 18px;
position: relative;
}
.form-item--link .icon-arrow-right {
color: #86868b;
}
.form-item-cover {
width: 40px;
height: 40px;
border-radius: 6px;
border: 0;
}
.form-item-tite {
margin: 0px 12px;
font-size: 14px;
font-weight: 700;
}
.form-item-desc {
color: #999;
margin: 0px 12px;
font-size: 13px;
}
`;
// =========================================================
const js = `
(() => {
// const settingItems = JSON.parse('${JSON.stringify(settingItems)}')
// window.invoke = (title, url) => {
// window.dispatchEvent(
// new CustomEvent(
// 'JBridge',
// { detail: { title, url } }
// )
// )
// }
// const fragment = document.createDocumentFragment()
// for (const item of settingItems) {
// }
// document.getElementById('form').appendChild(fragment)
})()`;
// =========================================================
const html = `
<html>
<head>
<meta name='viewport' content='width=device-width, user-scalable=no'>
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3791881_bf011w225k4.css" type="text/css">
<style>${style}</style>
</head>
<body>
<div class="list">
<form id="form" class="list__body" action="javascript:void(0);">
<label id="author" class="form-item form-item--link">
<div class="form-label">
<img class="form-item-cover" src="https://file.ipadown.com/tophub/assets/images/media/s.weibo.com.png_160x160.png"/>
<div>
<div class="form-item-tite">微博</div>
<div class="form-item-desc">热搜榜</div>
</div>
</div>
<i class="iconfont icon-arrow-right"></i>
</label>
</form>
</div>
<script>${js}</script>
</body>
</html>`;
// 预览web
const previewWebView = new WebView();
await previewWebView.loadHTML(html, 'https://tophub.today');
const injectListener = async () => {
const event = await previewWebView.evaluateJavaScript(
`(() => {
try {
const controller = new AbortController()
const listener = (e) => {
completion(e.detail)
controller.abort()
}
window.addEventListener(
'JBridge',
listener,
{ signal: controller.signal }
)
} catch (e) {
alert("搜索界面出错:" + e);
throw new Error("搜索界面处理出错: " + e);
return;
}
})()`, true).catch((err) => {
console.error(err);
this.ERRS.push(err);
if (!config.runsInApp) {
this.notify('APP主界面', `🚫 ${err}`);
} else {
throw err
}
});
////////////////////////////////////
const { code, data } = event;
}
injectListener().catch((e) => {
console.error(e);
});
previewWebView.present();
}
async getAppViewOptions() {
return {
widgetProvider: {
......@@ -52,7 +191,7 @@ class Widget extends BaseWidget {
type: 'cell',
icon: { name: 'flame', color: '#EB3323', },
needLoading: true,
default: '微博 · 热搜榜',
default: this.getHotban().title,
},
],
// cell类型的item点击回调
......@@ -66,8 +205,60 @@ class Widget extends BaseWidget {
options: [{ hint: '请输入关键字', value: '' }]
}, async (inputArr) => {
const keyword = inputArr[0].value;
widgetSetting.covArea = area;
insertDesc = area;
let response = undefined;
try {
//////
const html = await this.httpGet(`${this.defaultPreference.domain}/search?q=${encodeURIComponent(keyword)}`, { jsonFromat: false, headers: this.defaultPreference.phoneHeaders });
let webview = new WebView();
await webview.loadHTML(html);
// 通过dom操作把HTML里面的热榜内容提取出来
const getData = `
function getData() {
// 图片封面
coverArr = []
// 链接
linkArr = []
// 标题
titleArr = []
// 描述
tipArr = []
// 图片封面
let allItemNodeList = document.getElementsByClassName('weui-media-box__thumb radius');
for(let node of allItemNodeList) {
coverArr.push(node.src)
}
// 链接
allItemNodeList = document.getElementsByClassName('weui-media-box weui-media-box_appmsg weui-cell');
for(let node of allItemNodeList) {
linkArr.push(node.href)
}
// 标题
allItemNodeList = document.getElementsByClassName('weui-media-box__title');
for(let node of allItemNodeList) {
titleArr.push(node.innerText)
}
// 订阅人数
allItemNodeList = document.getElementsByClassName('weui-media-box__desc');
for(let node of allItemNodeList) {
tipArr.push(node.innerText)
}
return { coverArr, linkArr, titleArr, tipArr };
}
getData()
`
// 热榜数据
response = await webview.evaluateJavaScript(getData, false);
const { linkArr = [] } = response;
if (linkArr.length === 0) {
await this.generateAlert('热榜搜索', '搜索结果为空', ['确定']);
} else {
await this.renderSearchResultView(response);
}
//////
} catch (error) {
console.error(`🚫 热榜搜索出错===>${error}`);
await this.generateAlert('热榜搜索', '🚫热榜搜索出错了', ['确定']);
};
});
break;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册