Scriptables/Scripts/「源码」百度热榜.js

138 lines
4.2 KiB
JavaScript
Raw Normal View History

2022-06-02 17:00:01 +08:00
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: blue; icon-glyph: fire;
//
// iOS 桌面组件脚本 @「小件件」
// 开发说明:请从 Widget 类开始编写,注释请勿修改
// https://x.im3x.cn
//
// 添加require是为了vscode中可以正确引入包以获得自动补全等功能
if (typeof require === 'undefined') require = importModule
const { Base } = require("./「小件件」开发环境")
// @组件代码开始
class Widget extends Base {
/**
* 传递给组件的参数可以是桌面 Parameter 数据也可以是外部如 URLScheme 等传递的数据
* @param {string} arg 自定义参数
*/
constructor (arg) {
super(arg)
this.name = '百度热榜'
this.logo = 'https://www.baidu.com/cache/icon/favicon.ico'
this.desc = '百度搜索风云榜,实时更新网络热点'
}
/**
* 渲染函数函数名固定
* 可以根据 this.widgetFamily 来判断小组件尺寸以返回不同大小的内容
*/
async render () {
const data = await this.getData()
switch (this.widgetFamily) {
case 'large':
return await this.renderLarge(data)
case 'medium':
return await this.renderMedium(data)
default:
return await this.renderSmall(data)
}
}
/**
* 渲染小尺寸组件
*/
async renderSmall (data) {
let w = new ListWidget()
await this.renderHeader(w, this.logo, this.name)
const t = w.addText(data['hotsearch'][0]['pure_title'])
t.font = Font.lightSystemFont(16)
w.addSpacer()
w.url = this.actionUrl('open-url', decodeURIComponent(data['hotsearch'][0]['linkurl']))
return w
}
/**
* 渲染中尺寸组件
*/
async renderMedium (data, num = 4) {
let w = new ListWidget()
await this.renderHeader(w, this.logo, this.name)
data['hotsearch'].slice(0, num).map((d, i) => {
const cell = w.addStack()
cell.centerAlignContent()
const idx = cell.addText(String(i+1))
idx.font = Font.boldSystemFont(14)
if (i === 0) {
idx.textColor = new Color('#fe2d46', 1)
} else if (i === 1) {
idx.textColor = new Color('#ff6600', 1)
} else if (i === 2) {
idx.textColor = new Color('#faa90e', 1)
} else {
idx.textColor = new Color('#9195a3', 1)
}
cell.addSpacer(10)
let _title = d['pure_title']
_title = _title.replace(/"/g, '"')
const cell_text = cell.addText(_title)
cell_text.font = Font.lightSystemFont(14)
cell_text.lineLimit = 1
let _url = decodeURIComponent(d['linkurl'])
_url = _url.replace("://www.", "://m.")
cell.url = this.actionUrl("open-url", _url)
cell.addSpacer()
w.addSpacer()
})
// w.addSpacer()
// let lbg = new LinearGradient()
// lbg.locations = [0, 1]
// lbg.colors = [
// Color.dynamic(new Color('#cfd9df', 1), new Color('#09203f', 1)),
// Color.dynamic(new Color('#e2ebf0', 1), new Color('#537895', 1))
// ]
// w.backgroundGradient = lbg
return w
}
/**
* 渲染大尺寸组件
*/
async renderLarge (data) {
return await this.renderMedium(data, 11)
}
/**
* 获取数据函数函数名可不固定
*/
async getData () {
const req = new Request("https://www.baidu.com/")
req.method = "GET"
req.headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.55"
}
const res = await req.loadString()
// console.log(res)
const tmp = res.split(`<textarea id="hotsearch_data" style="display:none;">`)[1].split(`</textarea>`)[0]
console.log(tmp)
const data = eval(`(${tmp})`)
console.log(data)
// const data = JSON.parse(tmp)
// console.log(data['hotsearch'].length)
return data
}
/**
* 自定义注册点击事件 actionUrl 生成一个触发链接点击后会执行下方对应的 action
* @param {string} url 打开的链接
*/
async actionOpenUrl (url) {
Safari.openInApp(url, false)
}
}
// @组件代码结束
const { Testing } = require("./「小件件」开发环境")
await Testing(Widget)