154 lines
4.8 KiB
JavaScript
154 lines
4.8 KiB
JavaScript
// Variables used by Scriptable.
|
||
// These must be at the very top of the file. Do not edit.
|
||
// icon-color: orange; icon-glyph: comments;
|
||
//
|
||
// iOS 桌面组件脚本 @「小件件」
|
||
// 开发说明:请从 Widget 类开始编写,注释请勿修改
|
||
// https://x.im3x.cn
|
||
//
|
||
|
||
|
||
// 添加require,是为了vscode中可以正确引入包,以获得自动补全等功能
|
||
if (typeof require === 'undefined') require = importModule
|
||
const { Base } = require("./「小件件」开发环境")
|
||
|
||
// @组件代码开始
|
||
class Widget extends Base {
|
||
constructor (arg) {
|
||
super(arg)
|
||
this.name = '微博热榜'
|
||
this.desc = '实时刷新微博热搜榜事件'
|
||
|
||
// 注册设置
|
||
this.registerAction('插件设置', this.actionSetting.bind(this))
|
||
}
|
||
|
||
async render () {
|
||
if (this.widgetFamily === 'medium') {
|
||
return await this.renderMedium()
|
||
} else if (this.widgetFamily === 'large') {
|
||
return await this.renderLarge()
|
||
} else {
|
||
return await this.renderSmall()
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 渲染小尺寸组件
|
||
*/
|
||
async renderSmall () {
|
||
let res = await this.httpGet('https://m.weibo.cn/api/container/getIndex?containerid=106003%26filter_type%3Drealtimehot')
|
||
let data = res['data']['cards'][0]['card_group']
|
||
// 去除第一条
|
||
data.shift()
|
||
let topic = data[0]
|
||
console.log(topic)
|
||
// 显示数据
|
||
let w = new ListWidget()
|
||
w = await this.renderHeader(w, 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2225458401,2104443747&fm=26&gp=0.jpg', '微博热搜')
|
||
let body = w.addStack()
|
||
let txt = body.addText(topic['desc'])
|
||
body.addSpacer()
|
||
txt.leftAlignText()
|
||
txt.font = Font.lightSystemFont(14)
|
||
|
||
w.addSpacer()
|
||
let footer = w.addStack()
|
||
footer.centerAlignContent()
|
||
let img = footer.addImage(await this.getImageByUrl(topic['pic']))
|
||
img.imageSize = new Size(18, 18)
|
||
footer.addSpacer(5)
|
||
if (topic['icon']) {
|
||
let hot = footer.addImage(await this.getImageByUrl(topic['icon']))
|
||
hot.imageSize = new Size(18, 18)
|
||
footer.addSpacer(5)
|
||
}
|
||
let num = footer.addText(String(topic['desc_extr']))
|
||
num.font = Font.lightSystemFont(10)
|
||
num.textOpacity = 0.5
|
||
|
||
w.url = this.actionUrl('open-url', topic['scheme'])
|
||
return w
|
||
}
|
||
/**
|
||
* 渲染中尺寸组件
|
||
*/
|
||
async renderMedium (count = 4) {
|
||
let res = await this.httpGet('https://m.weibo.cn/api/container/getIndex?containerid=106003%26filter_type%3Drealtimehot')
|
||
let data = res['data']['cards'][0]['card_group']
|
||
// 去除第一条
|
||
data.shift()
|
||
// 显示数据
|
||
let w = new ListWidget()
|
||
w = await this.renderHeader(w, 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2225458401,2104443747&fm=26&gp=0.jpg', '微博热搜')
|
||
|
||
// 布局:一行一个,左边顺序排序,中间标题,后边热/新
|
||
const body = w.addStack()
|
||
const bodyLeft = body.addStack()
|
||
bodyLeft.layoutVertically()
|
||
for (let i = 0; i < count; i ++) {
|
||
let topic = data[i];
|
||
let dom = bodyLeft.addStack()
|
||
dom.centerAlignContent()
|
||
let pic = dom.addImage(await this.getImageByUrl(topic['pic']))
|
||
pic.imageSize = new Size(18, 18)
|
||
dom.addSpacer(5)
|
||
let title = dom.addText(topic['desc'])
|
||
title.lineLimit = 1
|
||
title.font = Font.lightSystemFont(14)
|
||
dom.addSpacer(5)
|
||
if (topic['icon']) {
|
||
let iconDom = dom.addStack()
|
||
let icon = iconDom.addImage(await this.getImageByUrl(topic['icon']))
|
||
icon.imageSize = new Size(18, 18)
|
||
}
|
||
dom.addSpacer()
|
||
let extr = dom.addText(String(topic['desc_extr']))
|
||
extr.font = Font.lightSystemFont(12)
|
||
extr.textOpacity = 0.6
|
||
dom.url = this.actionUrl('open-url', topic['scheme'])
|
||
bodyLeft.addSpacer(5)
|
||
}
|
||
body.addSpacer()
|
||
|
||
w.url = this.actionUrl("setting")
|
||
|
||
return w
|
||
}
|
||
/**
|
||
* 渲染大尺寸组件
|
||
*/
|
||
async renderLarge () {
|
||
return await this.renderMedium(11)
|
||
}
|
||
|
||
async actionSetting () {
|
||
const settings = this.getSettings()
|
||
const arg = settings["type"] || "1"
|
||
let a = new Alert()
|
||
a.title="打开方式"
|
||
a.message="点击小组件浏览热点的方式"
|
||
a.addAction((arg==="0"?"✅ ":"")+"微博客户端")
|
||
a.addAction((arg==="1"?"✅ ":"")+"自带浏览器")
|
||
a.addCancelAction("取消设置")
|
||
let i = await a.presentSheet()
|
||
if (i===-1) return
|
||
this.settings["type"] = String(i)
|
||
this.saveSettings()
|
||
}
|
||
|
||
async actionOpenUrl (url) {
|
||
const settings = this.getSettings()
|
||
if (settings['type']==="1"){
|
||
Safari.openInApp(url, false)
|
||
} else {
|
||
let k = decodeURIComponent(url).split('q=')[1].split('&')[0]
|
||
Safari.open('sinaweibo://searchall?q=' + encodeURIComponent(k))
|
||
}
|
||
}
|
||
|
||
}
|
||
// @组件代码结束
|
||
|
||
const { Testing } = require("./「小件件」开发环境")
|
||
await Testing(Widget) |