利用 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...

相关推荐
书语时17 分钟前
ES6 Promise 状态机
前端·javascript·es6
拉不动的猪1 小时前
管理不同权限用户的左侧菜单展示以及权限按钮的启用 / 禁用之其中一种解决方案
前端·javascript·面试
西陵1 小时前
前端框架渲染DOM的的方式你知道多少?
前端·javascript·架构
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
じ☆ve 清风°1 小时前
理解JavaScript中map和parseInt的陷阱:一个常见的面试题解析
开发语言·javascript·ecmascript
江城开朗的豌豆1 小时前
eval:JavaScript里的双刃剑,用好了封神,用不好封号!
前端·javascript·面试
江城开朗的豌豆2 小时前
JavaScript篇:前端定时器黑科技:不用setInterval照样玩转循环任务
前端·javascript·面试
江城开朗的豌豆2 小时前
JavaScript篇:自定义事件:让你的代码学会'打小报告'
前端·javascript·面试
lexiangqicheng3 小时前
JS-- for...in和for...of
开发语言·前端·javascript
smallluan3 小时前
JS设计模式(4):观察者模式
javascript·观察者模式·设计模式