利用 Scriptable 实现iOS 小组件实时查看网站访问数据

📊 利用 Scriptable 实现 iOS 小组件实时查看网站访问数据(基于 51LA)

你是否想随时在 iPhone 主屏查看自己网站的访问数据?

如果你使用的是 51LA 网站统计,配合 iOS 上的 Scriptable 工具,只需几十行代码,就能实现一个美观实用的小组件,实时显示网站的访问统计数据。

本文将手把手教你实现这个小工具。


🧰 所需工具

Scriptable

一个可以通过使用JavaScript来创建我们自己想要的小组件的应用(App Store 免费下载)

51.LA访问统计

www.51.la/

国内网站访问统计平台

你的网站

可以添加自定义 <script> 标签的网站


⚙️ 第一步:获取 51LA 统计代码(如有即可跳过)

  1. 前往 v6.51.la/report/setu...,根据网站教程安装统计代码

🧑‍💻 第二步:在 Scriptable 中创建脚本

打开 Scriptable,点击右上角「+」新建脚本,粘贴以下代码,并将其中的 你的ID 替换为你的统计代码 ID(即第一步图中打码的ID)

javascript 复制代码
// 获取访问数据
async function fetchVisitorStats() {
  try {
    const url = "https://v6-widget.51.la/v6/你的ID/quote.js?";
    const request = new Request(url);
    const result = await request.loadString();
    const numbers = result.match(/(?<=<\/span><span>).*?(?=<\/span><\/p>)/g);
    return {
      todayVisitors: numbers[1],
      yesterdayVisitors: numbers[3],
      monthlyVisits: numbers[5],
      totalVisits: numbers[6]
    };
  } catch (error) {
    console.error("Failed to fetch visitor stats:", error);
    return {
      todayVisitors: '加载中',
      yesterdayVisitors: '加载中',
      monthlyVisits: '加载中',
      totalVisits: '加载中'
    };
  }
}

// 添加千位分隔符格式化函数
function formatNumberWithCommas(numStr) {
  if (!/^\d+$/.test(numStr)) return numStr;
  return numStr.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

// 渲染 widget
async function createWidget(data) {
  const widget = new ListWidget();

  // 设置背景图片
  const bgImgUrl = "https://img.picui.cn/free/2025/06/06/6842b18d06be0.png";
  const bgReq = new Request(bgImgUrl);
  const bgImage = await bgReq.loadImage();
  widget.backgroundImage = bgImage;

  widget.setPadding(12, 14, 12, 14);

  // 格式化所有数据
  const formattedData = {
    todayVisitors: formatNumberWithCommas(data.todayVisitors),
    yesterdayVisitors: formatNumberWithCommas(data.yesterdayVisitors),
    monthlyVisits: formatNumberWithCommas(data.monthlyVisits),
    totalVisits: formatNumberWithCommas(data.totalVisits)
  };

  // 顶部标签
  const tagStack = widget.addStack();
  tagStack.layoutHorizontally();
  tagStack.setPadding(2, 8, 2, 8);
  tagStack.backgroundColor = new Color("#FFFFFF", 0.2);
  tagStack.cornerRadius = 12;

  const tagText = tagStack.addText("个站数据");
  tagText.font = Font.regularSystemFont(9);
  tagText.textColor = new Color("#FFFFFF");

  widget.addSpacer(6);

  // 总访问量区域
  const countStack = widget.addStack();
  countStack.layoutHorizontally();
  countStack.centerAlignContent();

  // 左边数字
  const totalVisitsText = countStack.addText(formattedData.totalVisits);
  totalVisitsText.font = new Font("DIN Alternate", 30);
  totalVisitsText.textColor = new Color("#FFFFFF");

  countStack.addSpacer(6);

  // 右边文字下移 10px
  const rightStack = countStack.addStack();
  rightStack.layoutVertically();
  rightStack.addSpacer(10);

  const descText = rightStack.addText("总访问量");
  descText.font = Font.regularSystemFont(11);
  descText.textColor = new Color("#698F9F");

  widget.addSpacer(8);

  // 添加访问数据行
  function addVisitRow(label, value) {
    const row = widget.addStack();
    row.layoutHorizontally();

    const left = row.addText(label);
    left.font = Font.regularSystemFont(13);
    left.textColor = new Color("#FFFFFF");

    row.addSpacer();

    const right = row.addText(value.toString());
    right.font = new Font("DIN Alternate", 13);
    right.textColor = new Color("#31BDF9");
  }

  addVisitRow("今日访问", formattedData.todayVisitors);
  widget.addSpacer(4);
  addVisitRow("昨日访问", formattedData.yesterdayVisitors);
  widget.addSpacer(4);
  addVisitRow("本月访问", formattedData.monthlyVisits);

  return widget;
}

// 主逻辑
const data = await fetchVisitorStats();
const widget = await createWidget(data);
Script.setWidget(widget);
Script.complete();
widget.presentSmall();

📱 第三步:添加小组件到桌面

1.长按 iPhone 桌面进入编辑模式

2.点击左上角「+」,搜索并添加 Scriptable 小组件

3.长按组件 → 编辑 → 选择你刚刚创建的脚本

💡 延伸玩法

你可以与AI工具"友好对话"让他帮你创造出更多好玩的小组件。

示例:请你帮我使用 JS 在 Scriptable 中创建一个XXX小组件,请注意查询 Scriptable 官方文档,编写的代码要符合官方文档要求。

参考资料:

51la统计美化

blog.leonus.cn/2022/51la.h...

Scriptable 官方文档
docs.scriptable.app/


我有一个设计周刊

每周,我都会塞几样小东西进这封信里:

一个页面的转角、一个工具的灵性、一段话的温度。 没人知道它会改变谁的哪一天。

xiaobot.net/p/DesignStr...

相关推荐
你也向往长安城吗16 分钟前
推荐一个三维导航库:three-pathfinding-3d
javascript·算法
karrigan26 分钟前
async/await 的优雅外衣下:Generator 的核心原理与 JavaScript 执行引擎的精细管理
javascript
wycode34 分钟前
Vue2实践(3)之用component做一个动态表单(二)
前端·javascript·vue.js
wycode2 小时前
Vue2实践(2)之用component做一个动态表单(一)
前端·javascript·vue.js
第七种黄昏2 小时前
Vue3 中的 ref、模板引用和 defineExpose 详解
前端·javascript·vue.js
我是哈哈hh2 小时前
【Node.js】ECMAScript标准 以及 npm安装
开发语言·前端·javascript·node.js
张元清3 小时前
电商 Feeds 流缓存策略:Temu vs 拼多多的技术选择
前端·javascript·面试
pepedd8643 小时前
浅谈js拷贝问题-解决拷贝数据难题
前端·javascript·trae
@大迁世界3 小时前
useCallback 的陷阱:当 React Hooks 反而拖了后腿
前端·javascript·react.js·前端框架·ecmascript
小高0073 小时前
📌React 路由超详解(2025 版):从 0 到 1 再到 100,一篇彻底吃透
前端·javascript·react.js