有趣的项目

做了一个可以让大家视奸我的网站

缘起

没别的,之前就看到有类似的项目了,不过那个项目是部署在Docker上的,需要依赖服务器运行,我就在想能不能前后端分离,将项目直接部署到EdgeOne或者Vercel上。

于是有了这个项目:Looking-me

Flygeon
/
Looking-me
Waiting for api.github.com...
00K 0K 0K Waiting...

效果预览

预览

架构设计

flowchart LR
    subgraph A["本地采集端"]
        A1[Python]
        A2[win32gui 捕获窗口]
        A3[每 30s 心跳]
    end

    subgraph B["云端服务"]
        B1[Supabase]
        B2[PostgreSQL]
        B3[Storage 图标]
    end

    subgraph C["前端展示"]
        C1[EdgeOne 静态页面]
        C2[HTML/CSS]
        C3[supabase-js]
    end

    A -->|REST API 写入 + 图标上传| B
    B -->|Realtime 订阅变更| C

1. 本地采集端 (Python)

win32gui 获取当前活动窗口标题,psutil 获取进程名,通过 Supabase REST API 写入:

# 获取活动窗口
hwnd = win32gui.GetForegroundWindow()
title = win32gui.GetWindowText(hwnd)

# 通过 REST API 写入 Supabase
rest_post("windows", {
    "id": 1,
    "title": title,
    "process": exe_name,
    "updated_at": "now()",
})

# 同时累积使用时长
usage[prev_process] += elapsed
rest_post("usage_stats", {"process": proc, "seconds": secs})

每 30 秒轮询一次,窗口变化时立即推送,同时每轮发送心跳保持在线状态。

2. 前端 (HTML + supabase-js)

前端是一个纯静态 HTML 文件,通过 supabase-js 的 Realtime 功能订阅数据库变更:

// 订阅 realtime 变更
sb.channel('w')
  .on('postgres_changes', {
    event: '*',
    schema: 'public',
    table: 'windows',
    filter: 'id=eq.1'
  }, (payload) => {
    show(payload.new);   // 实时更新界面
  })
  .subscribe();

窗口切换时毫秒级响应,离线超过 60 秒自动显示 “似了” 骷髅。

部署教程

第一步:创建 Supabase 项目

  1. 打开 supabase.com,注册/登录
  2. 点击 New Project,填写名称和密码,完成创建

第二步:建表

在 SQL Editor 执行:

-- 当前窗口表
CREATE TABLE public.windows (
  id          INTEGER PRIMARY KEY DEFAULT 1,
  title       TEXT NOT NULL DEFAULT '',
  process     TEXT NOT NULL DEFAULT '',
  updated_at  TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- 使用统计表
CREATE TABLE public.usage_stats (
  process    TEXT PRIMARY KEY,
  seconds    INTEGER NOT NULL DEFAULT 0,
  icon_url   TEXT,
  updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);

-- Realtime
ALTER PUBLICATION supabase_realtime ADD TABLE public.windows;
ALTER PUBLICATION supabase_realtime ADD TABLE public.usage_stats;

-- RLS
CREATE POLICY "allow_anon" ON public.windows FOR ALL USING (id = 1) WITH CHECK (id = 1);
CREATE POLICY "allow_anon" ON public.usage_stats FOR ALL USING (true) WITH CHECK (true);

INSERT INTO public.windows (id, title, process) VALUES (1, '', '');

然后执行 github里的 migration_icons.sql 创建图标存储桶。

第三步:获取 API 凭据

Supabase 控制台 → SettingsAPI Keys,记下:

  • Project URL(形如 https://xxxx.supabase.co
  • anon public key(以 eyJhbGci... 开头)

第四步:配置本地采集端

打开 window_monitor.py,修改第 5-6 行:

SUPABASE_URL = "https://你的项目.supabase.co"
SUPABASE_KEY = "你的anon key"

第五步:上传前端

将生成的 index.htmlstyles.css 以及 icon.png 上传到 EdgeOne Pages:

第六步:启动

python window_monitor.py

看到 [OK] Connected, tracking... 即表示成功。打开 EdgeOne 地址即可实时查看窗口活动。

访问 me.flygeon.top即可看到我在干啥~~(如果我还没似的话)~~

继续阅读

相关
经过再三考虑,最终放弃了Fuwari,重构了博客

将原Fuwari的博客迁移成Vue架构,重新设计了博客UI,本篇文章讲述重构的前因后果以及开发流程

有趣的项目2026-08-28
相关
介绍Filebase免费对象存储,以及快速搭建图床教程

本文主要介绍Filebase这个新的免费对象存储平台提供5 GB的免费存储空间,兼容S3端点,非常适合搭建图床服务

有趣的项目2026-07-27
对个人主页进行了重构并迁移了框架相关
对个人主页进行了重构并迁移了框架

将原来的Svelte的个人主页重构为Next.js,大幅重构了页面,整体屎山得到优化

有趣的项目2026-07-25
随机
博客更新日志

将会记录博客的更新内容。

未分类2026-05-30
对 Bangumi 反向代理,解决大陆地区访问问题随机
对 Bangumi 反向代理,解决大陆地区访问问题

使用 Cloudflare Workers 搭建 Bangumi 反向代理,解决大陆地区访问困难的问题。

教程2026-05-30
邪道,让你的个人站点也能显示博客的文章随机
邪道,让你的个人站点也能显示博客的文章

本文主要讲述了神人站长为了给自己的个人页集成博客的功能,但又不想迁移原有的 Astro 博客,而发动鬼脑想出了邪道手法——让个人页显示博客文章的摘要

折腾记录2026-07-26