侧边栏壁纸
博主头像
刹那烟雨博主等级

行动起来,活在当下

  • 累计撰写 36 篇文章
  • 累计创建 9 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

utools插件 feed-hub之页面规则

落雨不悔
2024-09-09 / 0 评论 / 0 点赞 / 5 阅读 / 30470 字

基础

在了解页面规则之前,我们先了解一下页面规则中可以使用的方法

插件提供

interface ParserEngine {

    /**
     * 根据规则解析为字符串
     * @param select 规则
     */
    parseToString(select: string): string;

    /**
     * 根据规则解析为引擎数组,每个元素为一个引擎实例
     * @param select 规则
     */
    parseToEngines(select: string): Array<ParserEngine>;

    /**
     * 解析正则列表
     * @param regex 正则表达式
     * @param selects 选择器列表
     * @deprecated 请使用 parseToString
     */
    parseRegexToStrings(regex: string, selects: Array<string | undefined>): Array<Array<string>>;

    /**
     * 将当前内容转为字符串
     */
    toString(): string;

    /**
     * 将当前内容转为 HTML 字符串,包含元素本身
     */
    toHTML(): string;

    /**
     * 将当前内容转为 HTML 字符串,不包含元素本身
     */
    toInnerHTML(): string;

}

interface DbRecord<T> {

    id: string;

    record: T;

    rev?: string;

}

interface HttpRequestCore {

    /**
     * 请求方式,默认GET
     */
    method?: 'GET' | 'POST' | 'PUT' | 'DELETE';

    /**
     * JSON字符串
     */
    headers: string;

    /**
     *
     */
    cookie: string;

    /**
     * 超时时间,默认5000ms
     */
    timeout: number;

    /**
     * 编码,默认UTF-8
     */
    charset: string;

    /**
     * 使用uBrowser进行请求
     */
    webview: boolean;

    /**
     * webview等待时间,默认10000ms
     */
    wait: string;

}

interface HttpRequest<D = any> {

    baseURL?: string;

    url: string;

    method?: 'GET' | 'POST' | 'PUT' | 'DELETE';

    timeout?: number;

    responseType?: 'json' | 'arraybuffer' | 'blob';

    data?: D;

    headers?: Record<string, string>;

    /**
     * 编码
     */
    charset?: string;

    /**
     * 使用uBrowser进行请求
     */
    webview?: boolean;

    /**
     * webview等待[时间|元素选择器],默认10000ms
     */
    wait?: string;
}

interface HttpResponse<T = string, D = any> {

    /**
     * 响应数据
     */
    data: T;

    status: number;

    statusText: string;

    /**
     * 响应头
     */
    headers: Record<string, string>;

    /**
     * 请求内容
     */
    config: HttpRequest<D>;

    /**
     * 请求耗时
     */
    requestTime: number;

}

/**
 * 视频播放列表
 */
interface VideoPlayGroupProps {
    /**
     * 分组名
     */
    name: string;
    /**
     * 播放列表
     */
    list: VideoPlayProps[];
}

interface AudioPlayProps {
    /**
     * 音频地址
     */
    url?: string;
    /**
     * 音频名
     */
    name?: string;
    /**
     * 封面地址
     */
    cover?: string;
    /**
     * 歌手名
     */
    artist?: string;
    /**
     * 歌词地址
     */
    lrc?: string;

    /**
     * 异步获取音频信息,如果存在此方法,则忽略上面的属性
     */
    getProps(): Promise<Omit<AudioPlayProps, 'getProps'>>;
}

interface AudioPlayGroupProps {
    list: AudioPlayProps[];
    index: number;
}

interface VideoPlayProps {
    /**
     * 视频地址
     */
    url?: string;
    /**
     * 视频名
     */
    name?: string;
    /**
     * 视频类型,默认mp4
     */
    type?: 'mp4' | 'flv' | 'm3u8';

    /**
     * 异步获取音频信息,如果存在此方法,则忽略上面的属性
     */
    getProps?: () => Promise<Omit<VideoPlayProps, 'getProps'>>;
}

interface Func {
    message: {
        /**
         * 显示成功消息
         * @param msg 消息
         * @since 1.2.0
         */
        success(msg: string): void;
        /**
         * 显示信息消息
         * @param msg 消息
         * @since 1.2.0
         */
        info(msg: string): void;
        /**
         * 显示错误消息
         * @param msg 消息
         * @param e 错误对象
         * @since 1.2.0
         */
        error(msg: string, e?: Error): void;
        /**
         * 显示警告消息
         * @param msg 消息
         * @since 1.2.0
         */
        warning(msg: string): void;
    },
    dbStorage: {
        /**
         * 获取本地存储
         * @param key 键名
         * @return 值
         * @since 1.2.0
         */
        getItem(key: string): any;
        /**
         * 设置本地存储
         * @param key 键名
         * @param value 值
         * @since 1.2.0
         */
        setItem(key: string, value: any): void;
        /**
         * 移除本地存储
         * @param key 键名
         * @since 1.2.0
         */
        removeItem(key: string): void;
    },
    db: {
        /**
         * 设置数据库记录
         * @param key 键名
         * @param value 值
         * @param rev 恢复值,修改时需要提供
         * @param err 错误回调
         * @return 恢复值,设置成功时返回新的rev值
         * @since 1.2.0
         */
        setItem(key: string, value: any, rev?: string, err?: (e: Error) => void): Promise<undefined | string>;
        /**
         * 获取数据库记录
         * @param key 键名
         * @return 值
         * @since 1.2.0
         */
        getItem(key: string): Promise<DbRecord<any>>;
        /**
         * 移除数据库记录
         * @param key 键名
         * @param ignoreError 忽略错误,默认false
         * @since 1.2.0
         */
        removeItem(key: string, ignoreError?: boolean): Promise<void>;
    },
    cookie: {
        /**
         * 获取cookie值
         * @param domain 域名
         * @param key 键名
         * @since 1.2.0
         */
        get(domain: string, key: string): string;
        /**
         * 设置cookie值
         * @param domain 域名
         * @param key 键名
         * @param value 值
         * @since 1.2.0
         */
        set(domain: string, key: string, value: string);
        /**
         * 移除cookie值
         * @param domain 域名
         * @param key 键名
         * @since 1.2.0
         */
        remove(domain: string, key: string);
        /**
         * 获取所有cookie值
         * @param domain 域名
         * @since 1.2.0
         */
        getAll(domain: string): string;
    },
    http: {
        /**
         * 发送HTTP请求
         * @param url 请求地址
         * @param options 请求选项
         * @return 响应体
         * @since 1.2.0
         */
        request(url: string, options?: HttpRequestCore): Promise<HttpResponse<string, any>>;
        /**
         * 格式转换相关
         */
        iconv: {
            parseBuffer(buffer: Buffer, charset: string): string;
            /**
             * 将ArrayBuffer转换为字符串
             * @param arrayBuffer   要转换的ArrayBuffer
             * @param charset       原始字符集
             * @return              转换后的字符串
             * @since 1.2.0
             */
            parseArrayBuffer(arrayBuffer: ArrayBuffer, charset: string): string;
            /**
             * 字符串转换编码
             * @param str           要转换的字符串
             * @param fromCharset   原始字符集
             * @param toCharset     目标字符集,默认UTF-8
             * @return              转换后的字符串
             * @since 1.2.0
             */
            convertCharset(str: string, fromCharset: string, toCharset?: string): string;
        },
        /**
         * 解析HTML字符串为ParserEngine实例
         * @param html HTML字符串
         * @return ParserEngine实例
         * @since 1.2.0
         */
        parseHtml(html: string): ParserEngine;
    },
    open: {
        /**
         * 播放音乐
         * @param props 参数
         * @since 1.2.0
         */
        audio: (props: AudioPlayProps) => void;
        /**
         * 播放音乐列表
         * @param props 音乐列表参数
         * @since 1.2.0
         */
        audioMulti: (props: AudioPlayGroupProps) => void;
        /**
         * 播放一个视频
         * @param props 参数
         * @since 1.2.0
         */
        video: (props: VideoPlayProps) => void;
        /**
         * 播放视频列表
         * @param props 参数
         * @param group 分组索引,从0开始,默认0
         * @param index 视频索引,从0开始,默认0
         * @since 1.2.0
         */
        videoMulti: (props: VideoPlayGroupProps[], group: number, index: number) => void;
        /**
         * 打开页面
         * @param sign 页面标识
         * @param args 参数
         * @since 1.2.0
         */
        page: (sign: string, args: Record<any, any>) => void;
        /**
         * 打开搜索页面
         * @deprecated 暂不可用
         * @since 1.2.0
         */
        search: (sign: string, args: Record<any, any>) => void;
        /**
         * 打开下载页面
         * @param url 下载地址
         * @param name 下载名称
         * @since 1.2.0
         */
        download: (url: string, name?: string) => void;
        /**
         * 打开外部链接
         * @param url 链接地址
         * @since 1.2.0
         */
        url: (url: string) => void;
    },
    page: {
        /**
         * 刷新页面
         * @since 1.2.0
         */
        refresh: () => void;
        /**
         * 返回上一页
         * @since 1.2.0
         */
        back: () => void;
    },
    util: {
        /**
         * 是否是空字符串
         * @param str
         * @since 1.2.0
         */
        isEmptyString(str: string): boolean;
        /**
         * 是否不是空字符串
         * @param str
         * @since 1.2.0
         */
        isNotEmptyString(str: string): boolean;
        /**
         * 是否是空数组
         * @param arr
         * @since 1.2.0
         */
        isEmptyArray(arr: any[]): boolean;
        /**
         * 是否不是空数组
         * @param arr
         * @since 1.2.0
         */
        isNotEmptyArray(arr: any[]): boolean;
        /**
         * 去除字符串前后空格
         * @param str
         * @since 1.2.0
         */
        trimString(str: string): string;
        /**
         * 解决图片防盗链问题
         * @param url 图片链接
         * @since 1.2.0
         */
        renderImage(url: string): string;
        /**
         * 复制文本到剪贴板
         * @param text 文本
         * @since 1.2.0
         */
        copyText(text: string): void;
        /**
         * 下载文件
         * @param data 文件内容
         * @param fileName 文件名
         * @param mineType 文件类型
         * @since 1.2.0
         */
        download(data: string | ArrayBuffer | Blob, fileName: string, mineType: string): void;
    },
    ext: {
        /**
         * 请求页面数据
         * @param pageSign 页面标识
         * @param data 请求参数
         * @return 页面数据
         * @since 1.2.1
         */
        require(pageSign: string, data: Record<any, any>): Promise<any>;
    }
}

// 可以使用的方法
declare const func: Func;
// 传入的参数,比如page,比如keyword,如果是页面规则,则是页面路径中的参数
declare const data: Record<string, any>;

uTools

interface UBrowser {
  /**
   * 设置 User-Agent
   */
  useragent(userAgent: string): this;
  /**
   * 前往
   * @param url 链接地址,支持 http 或 file 协议
   * @param headers 请求头参数
   * @param timeout 加载超时,默认 60000 ms(60秒)
   */
  goto(url: string, headers?: { Referer: string, userAgent: string }, timeout?: number): this;
  /**
   * 页面大小
   */
  viewport(width: number, height: number): this;
  /**
   * 隐藏 ubrowser 窗口
   */
  hide(): this;
  /**
   * 显示 ubrowser 窗口
   */
  show(): this;
  /**
   * 注入样式
   */
  css(css: string): this;
  /**
   * 键盘按键
   */
  press(key: string, ...modifier: ('ctrl' | 'shift' | 'alt' | 'meta')[]): this;
  /**
   * 粘贴
   * @param text 如果是图片的base64编码字符串,粘贴图片,为空只执行粘贴动作
   */
  paste(text?: string): this;
  /**
   * 页面截图
   * @param arg 1.字符串 - 要截取的DOM元素, 2.对象 - 截图位置和大小, 3.空 - 为截取整个窗口
   * @param savePath 截图保存路径,可以是文件夹 或 .png文件完全路径, 默认保存临时目录
   */
  screenshot(arg: string | { x: number, y: number, width: number, height: number }, savePath?: string): this;
  /**
   * 保存为PDF
   * @param options 选项
   * @param savePath PDF保存路径,可以是文件夹 或 .pdf文件完全路径, 默认保存临时目录
   */
  pdf(options?: { marginsType: 0 | 1 | 2, pageSize: ('A3' | 'A4' | 'A5' | 'Legal' | 'Letter' | 'Tabloid') | ({ width: number, height: number }) }, savePath?: string): this;
  /**
   * 模拟设备
   */
  device(arg: ('iPhone 11' | 'iPhone X' | 'iPad' | 'iPhone 6/7/8 Plus' | 'iPhone 6/7/8' | 'iPhone 5/SE' | 'HUAWEI Mate10' | 'HUAWEI Mate20' | 'HUAWEI Mate30' | 'HUAWEI Mate30 Pro') | { size: { width: number, height: number }, useragent: string }): this;
  /**
   * 获取 cookie
   * @param name 为空获取全部cookie
   */
  cookies(name?: string): this;
  /**
   * 设置Cookie
   */
  setCookies(name: string, value: string): this;
  /**
   * 设置Cookie
   */
  setCookies(cookies: { name: string, value: string }[]): this;
  /**
   * 删除 cookie
   */
  removeCookies(name: string): this;
  /**
   * 清空cookie
   * @param url 在执行"goto"前执行 url参数必需
   */
  clearCookies(url?: string): this;
  /**
   * 打开开发者工具
   */
  devTools(mode?: 'right' | 'bottom' | 'undocked' | 'detach'): this;
  /**
   * 执行JS计算 并获得结果
   * @param func 在目标网页中执行
   * @param params 传到 func 中的参数
   */
  evaluate(func: (...params: any[]) => any, ...params: any[]): this;
  /**
   * 等待时间
   * @param ms 毫秒
   */
  wait(ms: number): this;
  /**
   * 等待元素出现
   * @param selector DOM元素
   * @param timeout 超时 默认60000 ms(60秒)
   */
  wait(selector: string, timeout?: number): this;
  /**
   * 等待 JS函数 执行返回 true
   * @param func 执行的JS函数
   * @param timeout 超时 默认60000 ms(60秒)
   * @param params 传到 func 中的参数
   */
  wait(func: (...params: any[]) => boolean, timeout?: number, ...params: any[]): this;
  /**
   * 当元素存在时执行直到碰到 end
   * @param selector DOM元素
   */
  when(selector: string): this;
  /**
   * 当 JS函数执行返回 true 时执行直到碰到 end
   * @param func 执行的JS函数
   * @param params 传到 func 中的参数
   */
  when(func: (...params: any[]) => boolean, ...params: any[]): this;
  /**
   * 配合 when 使用
   */
  end(): this;
  /**
   * 单击元素
   */
  click(selector: string): this;
  /**
   * 元素触发按下鼠标左键
   */
  mousedown(selector: string): this;
  /**
   * 元素触发释放鼠标左键
   */
  mouseup(selector: string): this;
  /**
   * 赋值 file input
   * @param selector <input type='file' /> 元素
   * @param payload 1. string - 文件路径 或 图片的base64编码,2. string[] - 文件路径集合,3. Uint8Array[]
   */
  file(selector: string, payload: string | string[] | Uint8Array): this;
  /**
   * input textarea select 等元素赋值并触发 input 或 change事件
   */
  value(selector: string, value: string): this;
  /**
   * checkbox radio 元素选中或取消选中
   */
  check(selector: string, checked: boolean): this;
  /**
   * 元素获得焦点
   */
  focus(selector: string): this;
  /**
   * 滚动到元素位置
   */
  scroll(selector: string): this;
  /**
   * Y轴滚动
   */
  scroll(y: number): this;
  /**
   * X轴和Y轴滚动
   */
  scroll(x: number, y: number): this;
  /**
   * 下载文件
   */
  download(url: string, savePath?: string): this;
  /**
   * 启动一个 ubrowser 运行
   * 当运行结束后,窗口如果为隐藏状态将自动销毁窗口
   * @param options
   */
  run(options: {
    show?: boolean,
    width?: number,
    height?: number,
    x?: number,
    y?: number,
    center?: boolean,
    minWidth?: number,
    minHeight?: number,
    maxWidth?: number,
    maxHeight?: number,
    resizable?: boolean,
    movable?: boolean,
    minimizable?: boolean,
    maximizable?: boolean,
    alwaysOnTop?: boolean,
    fullscreen?: boolean,
    fullscreenable?: boolean,
    enableLargerThanScreen?: boolean,
    opacity?: number
  }): Promise<any[]>;
  /**
   * 运行在闲置的 ubrowser 上
   * @param ubrowserId 1. run(options) 运行结束后, 当 ubrowser 实例窗口仍然显示时返回 2. utools.getIdleUBrowsers() 中获得
   */
  run(ubrowserId: number): Promise<any[]>;
}

interface Display {
  accelerometerSupport: ('available' | 'unavailable' | 'unknown');
  bounds: { x: number, y: number, width: number, height: number };
  colorDepth: number;
  colorSpace: string;
  depthPerComponent: number;
  id: number;
  internal: boolean;
  monochrome: boolean;
  rotation: number;
  scaleFactor: number;
  size: { width: number, height: number };
  touchSupport: ('available' | 'unavailable' | 'unknown');
  workArea: { x: number, y: number, width: number, height: number };
  workAreaSize: { width: number, height: number };
}

interface DbDoc {
  _id: string,
  _rev?: string,
  [key: string]: any
}

interface DbReturn {
  id: string,
  rev?: string,
  ok?: boolean,
  error?: boolean,
  name?: string,
  message?: string
}

interface UToolsApi {
  /**
   * 插件应用进入时触发
   */
  onPluginEnter(callback: (action: {code: string, type: string, payload: any, option: any }) => void): void;
  /**
  * 向搜索面板推送消息
  */
  onMainPush(callback: (action: {code: string, type: string, payload: any }) => { icon?: string, text: string, title?: string }[], selectCallback: (action: {code: string, type: string, payload: any,  option: { icon?: string, text: string, title?: string }}) => void): void;
  /**
   * 插件应用隐藏后台或完全退出时触发
   */
  onPluginOut(callback: (processExit: boolean) => void): void;
  /**
   * 插件应用分离时触发
   */
  onPluginDetach(callback: () => void): void;
  /**
   * 插件应用从云端拉取到数据时触发
   */
  onDbPull(callback: (docs: { _id: string, _rev: string }[]) => void): void;
  /**
   * 隐藏主窗口
   * @param isRestorePreWindow 是否焦点回归到前面的活动窗口,默认 true
   */
  hideMainWindow(isRestorePreWindow?: boolean): boolean;
  /**
   * 显示主窗口
   */
  showMainWindow(): boolean;
  /**
   * 设置插件应用自身高度
   */
  setExpendHeight(height: number): boolean;
  /**
   * 设置子输入框
   * @param onChange 修改时触发
   * @param placeholder 占位符, 默认为空
   * @param isFocus 是否获得焦点,默认为 true
   */
  setSubInput(onChange: ({text: string}) => void, placeholder?: string, isFocus?: boolean): boolean;
  /**
   * 移除子输入框
   */
  removeSubInput(): boolean;
  /**
   * 赋值子输入框
   */
  setSubInputValue(value: string): boolean;
  /**
   * 子输入框获得焦点
   */
  subInputFocus(): boolean;
  /**
   * 子输入框获得焦点并选中
   */
  subInputSelect(): boolean;
  /**
   * 子输入框失去焦点,插件应用获得焦点
   */
  subInputBlur(): boolean;
  /**
   * 创建独立窗口
   * @param url 相对路径 html 文件
   * @param options 参考 https://www.electronjs.org/docs/api/browser-window#new-browserwindowoptions
   * @param callback url 加载完成时的回调
   */
  createBrowserWindow(url: string, options: { width?: number, height?: number }, callback?: () => void): { id: number, [key: string]: any, webContents: { id: number, [key: string]: any } };
  /**
   * 隐藏插件应用到后台
   */
  outPlugin(): boolean;
  /**
   * 是否深色模式
   */
  isDarkColors(): boolean;
  /**
   * 获取用户
   */
  getUser(): { avatar: string, nickname: string, type: string } | null;
  /**
   * 获取用户服务端临时令牌
   */
  fetchUserServerTemporaryToken(): Promise<{ token: string, expiredAt: number }>;
  /**
   * 是否插件应用的付费用户
   */
  isPurchasedUser(): boolean;
  /**
   * 打开付费 (软件付费)
   * @param callback 购买成功触发
   */
  openPurchase(options: {
    /**
     * 商品 ID,在「开发者工具」插件应用中创建
     */
    goodsId: string,
    /**
     * 第三方服务生成的订单号(可选)
     */
    outOrderId?: string,
    /**
     * 第三方服务附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用(可选)
     */
    attach?: string
  }, callback?: () => void): void;
  /**
   * 打开支付 (付费)
   * @param callback 支付成功触发
   */
  openPayment(options: {
    /**
     * 商品 ID,在「开发者工具」插件应用中创建
     */
    goodsId: string,
    /**
     * 第三方服务生成的订单号(可选)
     */
    outOrderId?: string,
    /**
     * 第三方服务附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用(可选)
     */
    attach?: string
  }, callback?: () => void): void;
  /**
   * 获取用户支付记录
   */
  fetchUserPayments(): Promise<{ order_id: string, total_fee: number, body: string, attach: string, goods_id: string, out_order_id: string, paid_at: string }[]>;
  /**
   * 设置插件应用动态功能
   */
  setFeature(feature: {
    code: string,
    explain: string,
    platform: ('darwin' | 'win32' | 'linux') | (Array<'darwin' | 'win32' | 'linux'>),
    icon?: string,
    cmds: (string | {
      type: 'img' | 'files' | 'regex' | 'over' | 'window',
      label: string
    })[]
  }): boolean;
  /**
   * 移除插件应用动态功能
   */
  removeFeature(code: string): boolean;
  /**
   * 获取插件应用动态功能,参数为空获取所有动态功能
   */
  getFeatures(codes?: string[]): {
    code: string,
    explain: string,
    platform: ('darwin' | 'win32' | 'linux') | (Array<'darwin' | 'win32' | 'linux'>),
    icon?: string,
    cmds: string | {
      type: 'img' | 'files' | 'regex' | 'over' | 'window',
      label: string
    }[]
  }[];
  /**
   * 插件应用间跳转
   */
  redirect(label: string | string[], payload: string | { type: 'text' | 'img' | 'files', data: any }): void;
  /**
   * 获取闲置的 ubrowser
   */
  getIdleUBrowsers(): { id: number, title: string, url: string}[];
  /**
   * 设置 ubrowser 代理 https://www.electronjs.org/docs/api/session#sessetproxyconfig
   */
  setUBrowserProxy(config: {pacScript?: string, proxyRules?: string, proxyBypassRules?: string}): boolean;
  /**
   * 清空 ubrowser 缓存
   */
  clearUBrowserCache(): boolean;
  /**
   * 显示系统通知
   */
  showNotification(body: string): void;
  /**
   * 弹出文件选择框
   */
  showOpenDialog(options: {
    title?: string,
    defaultPath?: string,
    buttonLabel?: string,
    filters?: { name: string, extensions: string[] }[],
    properties?: Array<'openFile' | 'openDirectory' | 'multiSelections' | 'showHiddenFiles' | 'createDirectory' | 'promptToCreate' | 'noResolveAliases' | 'treatPackageAsDirectory' | 'dontAddToRecent'>,
    message?: string,
    securityScopedBookmarks?: boolean
  }): (string[]) | (undefined);
  /**
   * 弹出文件保存框
   */
  showSaveDialog(options: {
    title?: string,
    defaultPath?: string,
    buttonLabel?: string,
    filters?: { name: string, extensions: string[] }[],
    message?: string,
    nameFieldLabel?: string,
    showsTagField?: string,
    properties?: Array<'showHiddenFiles' | 'createDirectory' | 'treatPackageAsDirectory' | 'showOverwriteConfirmation' | 'dontAddToRecent'>,
    securityScopedBookmarks?: boolean
  }): (string) | (undefined);
  /**
   * 插件应用页面中查找
   */
  findInPage(text: string, options?: {
    forward?: boolean,
    findNext?: boolean,
    matchCase?: boolean,
    wordStart?: boolean,
    medialCapitalAsWordStart?: boolean
  }): void;
  /**
   * 停止插件应用页面中查找
   */
  stopFindInPage (action: 'clearSelection' | 'keepSelection' | 'activateSelection'): void;
  /**
   * 拖拽文件
   */
  startDrag(file: string | string[]): void;
  /**
   * 屏幕取色
   */
  screenColorPick(callback: (color: { hex: string, rgb: string }) => void): void;
  /**
   * 屏幕截图
   */
  screenCapture(callback: (imgBase64: string) => void): void;
  /**
   * 获取本地 ID
   */
  getNativeId(): string;
  /**
   * 获取软件版本
   */
  getAppVersion(): string;
  /**
   * 获取软件名称
   */
  getAppName(): string;
  /**
   * 获取路径
   */
  getPath(name: 'home' | 'appData' | 'userData' | 'cache' | 'temp' | 'exe' | 'module' | 'desktop' | 'documents' | 'downloads' | 'music' | 'pictures' | 'videos' | 'logs' | 'pepperFlashSystemPlugin'): string;
  /**
   * 获取文件图标
   */
  getFileIcon(filePath: string): string;
  /**
   * 获取当前窗口类型, 'main' 主窗口 | 'detach' 分离窗口 | 'browser' 由 createBrowserWindow 创建的窗口
   */
  getWindowType(): 'main' | 'detach' | 'browser';
  /**
   * 复制文件到剪贴板
   */
  copyFile(file: string | string[]): boolean;
  /**
   * 复制图片到剪贴板
   * @param img base64、buffer、图片路径
   */
  copyImage(img: string | Uint8Array): boolean;
  /**
   * 复制文本到剪贴板
   */
  copyText(text: string): boolean;
  /**
   * 获取复制的文件或文件夹
   */
  getCopyedFiles(): { isFile: boolean, isDirectory: boolean, name: string, path: string }[];
  /**
   * 读取当前文件管理器路径(linux 不支持)
  */
  readCurrentFolderPath(): Promise<string>;
  /**
   * 读取当前浏览器窗口的URL(linux 不支持)
   * MacOs 支持浏览器 Safari、Chrome、Opera、Vivaldi、Brave
   * Windows 支持浏览器 Chrome、Firefox、Edge、IE、Opera、Brave
   * Linux 不支持
   */
  readCurrentBrowserUrl(): Promise<string>;
  /**
   * 默认方式打开给定的文件
   */
  shellOpenPath(fullPath: string): void;
  /**
   * 删除文件到回收站
   */
  shellTrashItem(filename: string): Promise<void>;
  /**
   * 在文件管理器中显示给定的文件
   */
  shellShowItemInFolder(fullPath: string): void;
  /**
   * 系统默认的协议打开URL
   */
  shellOpenExternal(url: string): void;
  /**
   * 播放哔哔声
   */
  shellBeep(): void;
  /*
  * 键入字符串
  */
  hideMainWindowTypeString(str: string): void;
  /*
  * 粘贴文件
  */
  hideMainWindowPasteFile(file: string | string[]): void;
  /*
  * 粘贴图像
  */
  hideMainWindowPasteImage(img: string): void;
  /*
  * 粘贴文本
  */
  hideMainWindowPasteText(text: string): void;
  /**
   * 模拟键盘按键
   */
  simulateKeyboardTap(key: string, ...modifier: ('control' | 'ctrl' | 'shift' | 'option' | 'alt' | 'command' | 'super')[]): void;
  /**
   * 模拟鼠标单击
   */
  simulateMouseClick(x?: number, y?: number): void;
  /**
   * 模拟鼠标右击
   */
  simulateMouseRightClick(x?: number, y?: number): void;
  /**
   * 模拟鼠标双击
   */
  simulateMouseDoubleClick(x?: number, y?: number): void;
  /**
   * 模拟鼠标移动
   */
  simulateMouseMove(x: number, y: number): void;
  /**
   * 获取鼠标绝对位置
   */
  getCursorScreenPoint(): { x: number, y: number };
  /**
   * 获取主显示器
   */
  getPrimaryDisplay(): Display;
  /**
   * 获取所有显示器
   */
  getAllDisplays(): Display[];
  /**
   * 获取位置所在的显示器
   */
  getDisplayNearestPoint(point: { x: number, y: number }): Display;
  /**
   * 获取矩形所在的显示器
   */
  getDisplayMatching(rect: { x: number, y: number, width: number, height: number }): Display;
  /**
   * 屏幕物理坐标转 DIP 坐标
   */
  screenToDipPoint(point: { x: number, y: number }): { x: number, y: number };
  /**
   * 屏幕 DIP 坐标转物理坐标
   */
  dipToScreenPoint(point: { x: number, y: number }): { x: number, y: number };
  /**
   * 屏幕物理区域转 DIP 区域
   */
  screenToDipRect(rect: { x: number, y: number, width: number, height: number }): { x: number, y: number, width: number, height: number };
    /**
   * 屏幕 DIP 区域转物理区域
   */
  dipToScreenRect(rect: { x: number, y: number, width: number, height: number }): { x: number, y: number, width: number, height: number };
  /**
   * 录屏源
   */
  desktopCaptureSources(options: { types: string[], thumbnailSize?: { width: number, height: number }, fetchWindowIcons?: boolean }):Promise<{appIcon: {}, display_id: string, id: string, name: string, thumbnail: {} }>;
  /**
   * 是否开发中
   */
  isDev(): boolean;
  /**
   * 是否 MacOs 操作系统
   */
  isMacOS(): boolean;
  /**
   * 是否 Windows 操作系统
   */
  isWindows(): boolean;
  /**
   * 是否 Linux 操作系统
   */
  isLinux(): boolean;

  db: {
    /**
     * 创建/更新文档
     */
    put(doc: DbDoc): DbReturn;
    /**
     * 获取文档
     */
    get(id: string): DbDoc | null;
    /**
     * 删除文档
     */
    remove(doc: string | DbDoc): DbReturn;
    /**
     * 批量操作文档(新增、修改、删除)
     */
    bulkDocs(docs: DbDoc[]): DbReturn[];
    /**
     * 获取所有文档 可根据文档id前缀查找
     */
    allDocs(key?: string): DbDoc[];
    /**
     * 存储附件到新文档
     * @param docId 文档ID
     * @param attachment 附件 buffer
     * @param type 附件类型,示例:image/png, text/plain
     */
    postAttachment(docId: string, attachment: Uint8Array, type: string): DbReturn;
    /**
     * 获取附件
     * @param docId 文档ID
     */
    getAttachment(docId: string): Uint8Array | null;
    /**
     * 获取附件类型
     * @param docId 文档ID
     */
    getAttachmentType(docId: string): string | null;
    /**
     * 云端复制数据状态 (null: 未开启数据同步、0: 已完成复制、1:复制中)
     */
    replicateStateFromCloud(): null | 0 | 1;
    /**
     * 异步
     */
    promises: {
      /**
       * 创建/更新文档
       */
      put(doc: DbDoc): Promise<DbReturn>;
      /**
        * 获取文档
        */
      get(id: string): Promise<DbDoc | null>;
      /**
        * 删除文档
        */
      remove(doc: string | DbDoc): Promise<DbReturn>;
      /**
        * 批量操作文档(新增、修改、删除)
        */
      bulkDocs(docs: DbDoc[]): Promise<DbReturn[]>;
      /**
        * 获取所有文档 可根据文档id前缀查找
        */
      allDocs(key?: string): Promise<DbDoc[]>;
      /**
        * 存储附件到新文档
        * @param docId 文档ID
        * @param attachment 附件 buffer
        * @param type 附件类型,示例:image/png, text/plain
        */
      postAttachment(docId: string, attachment: Uint8Array, type: string): Promise<DbReturn>;
      /**
        * 获取附件
        * @param docId 文档ID
        */
      getAttachment(docId: string): Promise<Uint8Array | null>;
      /**
        * 获取附件类型
        * @param docId 文档ID
        */
      getAttachmentType(docId: string): Promise<string | null>;
      /**
       * 云端复制数据状态 (null: 未开启数据同步、0: 已完成复制、1:复制中)
       */
      replicateStateFromCloud(): Promise<null | 0 | 1>;
    }
  };

  dbStorage: {
    /**
     * 键值对存储,如果键名存在,则更新其对应的值
     * @param key 键名(同时为文档ID)
     * @param value 键值
     */
    setItem (key: string, value: any): void;
    /**
     * 获取键名对应的值
     */
    getItem (key: string): any;
    /**
     * 删除键值对(删除文档)
     */
    removeItem (key: string): void;
  };

  ubrowser: UBrowser;
}

declare var utools: UToolsApi;

上面的定义,应用于:列表自定义规则搜索自定义规则页面规则中,内容规则没有上面的定义

注意:不要使用uTools提供的db方法,可能造成数据污染,导致插件无法使用,导入别人的插件时,也注意甄别。

返回规则

正常返回

正常情况返回一个数组,类型定义如下:


/**
 * 渲染类型
 */
export type SubscribeRenderResultType =
    'list'
    | 'card'
    | 'search'
    | 'html'
    | 'radio'
    | 'button'
    | 'input'
    | 'input-password'
    | 'textarea'
    | 'image';

export interface SubscribePageResult {

    // 如果是个表单,此值必填
    key: string;
    // 标题
    title: string;
    description: string;
    // 标签
    tags: Array<string>;
    author: string;
    image: string;

    /**
     * 链接
     */
    link: string;

    /**
     * 内容
     */
    content: string;

    /**
     * 组件类型,默认card
     */
    type?: SubscribeRenderResultType;

    col: {
        /**
         * 栅格占位格数,默认24
         */
        span?: number;

        /**
         * 栅格左侧的间隔格数,间隔内不可以有栅格,默认0
         */
        offset?: number;

        /**
         * 对元素进行排序,默认0
         */
        order?: number;

        // <576px响应式栅格
        xs?: number;
        // >= 576px响应式栅格
        sm?: number;
        // >= 768px响应式栅格
        md?: number;
        // >= 992px响应式栅格
        lg?: number;
        // >= 1200px响应式栅格
        xl?: number;
        // >= 1600px响应式栅格
        xxl?: number;

        /**
         * 设置 flex 布局属性
         */
        flex?: string;
    }


    /**
     * 事件,如果存在的话,第一项为当前对象
     * @param args 事件参数
     */
    onEvent?: (...args: any[]) => Promise<void>;

    /**
     * 样式,json对象,用于自定义栅格样式
     */
    style?: any;

    // 额外数据
    extra?: Record<string, any>

}

此处重点说明一下额外数据,所谓的额外数据其实就是绑定到使用的组件上的属性,比如:

button:https://arco.design/vue/component/button#API

image:https://arco.design/vue/component/image#API

等等,都是arco design中的组件,具体的可以查看文档

空返回

有的时候,你可能只是执行一些脚本,此时不需要返回任何东西,会在执行完成自动关闭页面

0

评论区