普通视图

如何导出 GitHub Discussions / Giscus 数据

2025年11月21日 08:00

如果你的静态博客使用了 Giscus 作为评论系统,那么所有评论内容实际上都会存储在你对应仓库的 GitHub Discussions 中。 这种方式免去了自建数据库和后端的麻烦,但很多人会关心一个问题:能否把评论备份导出? 答案是:可以!因为 GitHub 提供了完整的 API 来读取 Discussions 的全部数据。下面是一份 python 脚本,可以一键导出 Discussions 的数据成 json 格式。 **准备工作:** 脚本放在最下方,我们先需要得到几个关键数据: - token(GITHUB_TOKEN)只需 `read:discussion` 权限 - 用户名(REPO_OWNER) - 仓库名(REPO_NAME) - Giscus 分类 ID(CATEGORY_ID) 前三者很好得到,暂不提,分类 ID 可以在之前部署 Giscus 看到,也就是 `data-category-id` 的值。 ![](https://imgurl.zishu.me/2025/11/1763689961720.webp) **开始爬取** 在本地新建一个 `export_giscus.py` 文件,复制下面的代码进去,然后将这几个信息都填到配置中,最后在终端执行 `python export_giscus.py`。 程序会生成一个 `.json`文件,里面就是所有的 Giscus 评论数据。 ```py import requests import json # 配置 GITHUB_TOKEN = "YOUR_GITHUB_TOKEN" # 填你的 token REPO_OWNER = "your_owner" # 仓库 owner REPO_NAME = "your_repo" # 仓库名 CATEGORY_ID = "your_category_id" # 绑定 giscus 的 Discussion 分类 ID # GraphQL Endpoint API_URL = "https://api.github.com/graphql" HEADERS = {"Authorization": f"Bearer {GITHUB_TOKEN}"} def run_query(query, variables=None): r = requests.post(API_URL, headers=HEADERS, json={'query': query, 'variables': variables}) if r.status_code != 200: raise Exception(f"Query failed with status code {r.status_code}: {r.text}") return r.json() def export_discussions(): discussions_data = [] has_next_page = True end_cursor = None query = """ query($owner:String!, $name:String!, $categoryId:ID!, $after:String) { repository(owner: $owner, name: $name) { discussions(first: 50, categoryId: $categoryId, after: $after) { nodes { id title url createdAt author { login, url } body comments(first: 100) { nodes { id createdAt author { login, url } body } } } pageInfo { endCursor hasNextPage } } } } """ while has_next_page: variables = { "owner": REPO_OWNER, "name": REPO_NAME, "categoryId": CATEGORY_ID, "after": end_cursor } result = run_query(query, variables) repo_data = result["data"]["repository"]["discussions"] for discussion in repo_data["nodes"]: discussions_data.append(discussion) end_cursor = repo_data["pageInfo"]["endCursor"] has_next_page = repo_data["pageInfo"]["hasNextPage"] with open(f"{REPO_OWNER}-{REPO_NAME}-giscus.json", "w", encoding="utf-8") as f: json.dump(discussions_data, f, ensure_ascii=False, indent=2) print(f"导出完成,共 {len(discussions_data)} 个 Discussion,保存到 {REPO_OWNER}-{REPO_NAME}-giscus.json") if __name__ == "__main__": export_discussions() ```

  •  

小区门口的烩面

2025年10月24日 08:00

很久没有在小区门口看到摆摊的小贩了,之前还有很多,最近一个月突然销声匿迹,经常能看到城管在巡逻,应该是维持卫生秩序,不让摆摊。 然后昨天晚上下班后,和女友路过小区门口看到一家摆着河南烩面招牌的小摊,价格很公道只需要 12 元,来自家乡的味道,本来晚上不打算吃东西的,但是激烈思考了几秒钟后,决定和女友一起吃一碗。 毕竟也好久没吃了,我都记不起上次吃河南烩面是什么时候。 大致看了一下确实是羊肉汤煮的,能闻到些许羊膻味,感觉还是蛮正宗的。当时阿姨正在做的时候没怎么关注,只顾着和女友聊天了。 等到做完之后发现用一个塑料袋打包的,我们还略微吐槽了一下,第一次见用塑料袋打包汤面的,往常都会给一个塑料盒,不过也没怎么在意,分量还是很大的,想着是缩减成本然后就回家了。 等到家之后,拿出一个大碗把袋子套在里面,一打开就能闻到非常香的羊肉味(膻味),点缀着一些葱花香菜,看起来非常有食欲,汤里还带有一些羊杂、千张,甚至还有一颗鸡蛋,这让我们很惊喜。 虽然说成本不高,但是在杭州这个地方,遇到这个价位的食物,里面给出这些配料,非常之良心了。最后我们几乎是把汤都喝的干干净净。 ps: 另外想起来上回女友在公司楼下吃的一碗招牌牛肉面,25 元一碗,真的是清汤清水,喝了一口汤尝尝味道,连面都没吃直接走了。 哎,一言难尽。

  •  

局域网用 Gitea 同步代码 --- 纯图形界面

2025年10月22日 08:00

因为一些需求,需要和同事之间同步一些代码,但是前提是不上云,也不想走公司内部的 svn 存储。因此打算在本地局域网起一个 git 服务,想要多台电脑像操作 GitHub 一样在本地执行各种拉取合并操作。 我锁定了开源项目 [Gitea](https://github.com/go-gitea/gitea),可以在任何一台机器上部署类似 GitHub 的服务,支持各个系统。当然也支持我的电脑环境本地 Windows。 只需要一台电脑长期开着充当服务器的角色,其他电脑在同一个局域网下就可以连接。 打开网站 https://dl.gitea.com/gitea/ ,找到最新版本,此时我的最新版本是 `1.24.6`,进去之后找到符合我电脑的版本。 ![](https://imgurl.zishu.me/2025/10/1761123101201.webp) 搜索 `windows-4.0-amd64.exe`,找到 `gitea-1.24.6-windows-4.0-amd64.exe`,点击下载,然后把这个文件放在一个指定的位置,比如我放在了 `D:\Gitea\` 目录下,然后再双击运行,就会弹出一个 cmd 窗口,不要关闭放在那里即可。 接下来打开 `http://localhost:3000/` ,就可以看到本地运行的服务。 ![](https://imgurl.zishu.me/2025/10/1761123704853.webp) 此时已经成功了一半,接下来就是配置时间。 - 数据库类型选择 SQLite3,不需要另外安装数据库 - 服务器域名填写本地 ip:192.168.xx.xx 这个(在终端执行 ipconfig 可以看到) - SSH 端口留空不写,因为我们只走 http,禁用 ssh 即可,HTTP 服务端口默认 3000 - 其他程序配置保持默认即可 **注意:关于管理员账号** 如果没有在配置服务时填入管理员账号,那么默认第一个注册的用户就是管理员。 ![](https://imgurl.zishu.me/2025/10/1761124074379.webp) 一切准备就绪后就完成了,让同事登录 `http://192.168.xx.xx:3000`,使用方式和 GitHub 一致。 终于可以愉快的写代码了~

  •  

随手拍 - 山间高速风景

2025年10月9日 08:00

好久没更新日常了,国庆出去耍了一下...不过不是旅行办了一些私事,因此也没有拍什么照片。 第一次跑全程 3000km 的高速路线,杭州 - 重庆 - 杭州,看到了路上很多不同的风景,穿梭在云端的高速,遇山钻洞,遇水架桥。 ![](https://imgurl.zishu.me/2025/10/1759981636595.webp) 中秋节后一天看到的月亮,又大又圆,不过手机像素限制了。 ![](https://imgurl.zishu.me/2025/10/1759982089638.webp)

  •  

大明山牵牛岗露营游记

2025年8月11日 08:00
上周于天气太过炎热,不开空调几乎不能待,所以拉着对象说去大明山上露营看星星,最重要的是可以避暑,查了一下“天文通”APP,山顶温度刚过 20°。 这一次的行程安排的比较充分,带着帐篷,充气床垫(自从上次去过象山回来后下单,至今还未使用),厨具(卡式炉锅碗瓢盆等),以及一些食材,螺狮粉,火锅丸子若干,方便面,然后还买了西瓜和卤味,准备的是相当充分。 周六早上起个大早收拾了一下,顺便洗洗水果,原本想的是中午之前能到目的地,结果在城区堵车了将近一个小时,两个多小时的车程硬生生跑了三个多小时,将近四个小时。 不过也不着急,一边聊天一边慢慢跑,安全第一。大概在 12 点也是到达了大明山山脚下,看到很多民宿和旅游团,我们慢悠悠的晃。此时距离目的地还有 20km 左右,剩下的全是盘山公路,上次跑这种公路还是在去年 12 月份,去了一趟寺坞岭看日出。 从山脚下往上看,重岩叠嶂,非常雄壮。公路不是很宽,会车时需要停下来慢点过,并且弯道处视线很不好,原本是打算鸣笛示意的,但是考虑到山区落石比较多,非必要情况下就不鸣笛了,避免和落石发生共振(不知道这种做法有没有问题),反正就是开的很慢,安全第一。 一路上没有遇到上山的车,可能因为我们去的比较早,下山的车基本也很少,偶尔遇到几辆,问了一下山上人多吗,说现在人不多,我们还在庆幸。 ![](https://imgurl.zishu.me/2025/08/1754878425058.webp) 大概跑了半个小时终于看到山顶的气象台,我们的目的地就在这个气象台的旁边。 ![](https://imgurl.zishu.me/2025/08/1754878674744.webp) 基本没有车,随便找了个不碍事的位置停一下。跟对象溜达了一圈,感叹风景非常不错,也很凉快大概只有 20° 出头,想着晚上估计会很冷,不过我们带了被子也没有太担心。 ![](https://imgurl.zishu.me/2025/08/1754878704495.webp) ![](https://imgurl.zishu.me/2025/08/1754878857593.webp) 随后我们就从车里搬东西,拉着小推车到观景平台准备搭帐篷露营,旁边还有厕所,有水源,挺方便的不是很脏,还比较满意。 找了个宽敞的位置,没有遮挡,可以直接俯瞰群山,景色秀丽。 ![](https://imgurl.zishu.me/2025/08/1754878839930.webp) 花了半个小时把帐篷搭起来,桌子摆一下,食材收拾一下,终于可以坐下来休息休息了。我们一边吃一边聊天,此时平台的人也渐渐多了起来,很多人准备来露营。幸好我们来的早,位置也比较宽阔。 ![](https://imgurl.zishu.me/2025/08/1754880032401.webp) 等吃完饭收拾一下,也差不多三四点了,有些疲惫就躺帐篷休息了。 --- 说实话,去的那天晚上观星条件不是很好,因为正好赶上满月,月亮很圆很大,导致星星就被遮盖住了。终于理解了那句古话, “萤火之光岂能与皓月争辉。” 不过也没有太在意,本来就是打算出来玩露营的,避避暑凉快一些。 第二天早上起来发现好多帐篷,附上一张图,我们洗漱了一下准备看看日出。不是很浓郁,但也有一番风味。 ![](https://imgurl.zishu.me/2025/08/1754879201404.webp) ![](https://imgurl.zishu.me/2025/08/1754878795687.webp) 然后我们去停车的地方准备拿点东西,发现人非常之多,震惊到我了,听旁边人说,昨天夜里路边跟集市一样,人满为患,还好我们在观景平台,人相对来说比较少。 跟管理员聊了一下,说车都停到 2 公里之外了,本来都停在侧边的,后面上来的车直接把路堵住了,上面的车想走都走不掉,他已经疏通了不少,只剩下眼前这几百米了。 ![](https://imgurl.zishu.me/2025/08/1754879518248.webp) 然后我们在路边看到了一些露营的人垃圾都不收拾好,风一吹刮的到处都是,部分垃圾飞下山坡,想清理都做不到,非常污染环境。管理员在旁边看着等他们人出来沟通一下,事后不清楚怎么样了。 反正我是垃圾都时刻装在袋子里,每次出门都带着垃圾袋,方便一起扔掉,毕竟这种非运营的地方又不收费,全靠自觉了。 ![](https://imgurl.zishu.me/2025/08/1754879537127.webp) --- 回到我们的营地,吃了个早饭,风很大,就打算打道回府了,总体来说此次旅程还是比较满意的。
  •  

南京游八月三日

2025年8月3日 08:00

很久没出去旅游,有事来了趟南京顺便玩两天。虽然离杭州很近,但一直没有机会。 预约了侵华日军南京大暑杀遇难同胞纪念馆,非常庄严肃穆,刚好赶上淅淅沥沥的小雨,心情也变得沉重起来,感叹和平来之不易。 随后逛了总统府,了解了民国这一块的相关史实。 天色渐晚,又下起小雨,打消了前往秦淮河夫子庙的旅程,再会。 --- **侵华日军南京大暑杀遇难同胞纪念馆** ![30 万遇难者](https://imgurl.zishu.me/2025/08/1754227832698.webp) ![](https://imgurl.zishu.me/2025/08/1754227945379.webp) ![雕像](https://imgurl.zishu.me/2025/08/1754227914143.webp) **总统府** ![临时大总统府办公室](https://imgurl.zishu.me/2025/08/1754227569953.webp) ![孙中山雕像](https://imgurl.zishu.me/2025/08/1754227586781.webp)

  •  

如何登录旧版本 Bitwarden 密码管理器

2025年7月25日 08:00

**2025/07/30 更新:** 发现 Bitwarden 可以关闭二次验证,可以通过以下方式,进入 https://vault.bitwarden.com/#/settings/account 我的账户页面。 在登录旧版扩展前,先点击底部 `停用新设备登陆保护`,登录之后再打开这个选项,提高安全性。 ![危险操作](https://imgurl.zishu.me/2025/07/1753853607383.webp) --- Bitwarden 是一款非常知名的密码管理器,其功能我就不赘述了,我来讲讲如何登录旧版本的 Bitwarden 密码管理器。 旧版官方安装包:[https://github.com/bitwarden/clients/releases/tag/browser-v2024.11.2](https://github.com/bitwarden/clients/releases/tag/browser-v2024.11.2) 肯定也有不少小伙伴喜欢旧版的 UI,因此就没有使用最新的版本,我用的是 `v2024.11.2`,也是官方更新 UI 前最后一个稳定版本,喜欢旧版的推荐用这个。 ## 1.前景原因 但是在这个过程中,我发现了一个问题,那就是一旦退出登录旧版后,就再也登陆不上。 因为新版 Bitwarden 引入了一个输入二次密码的功能。也就是填写完主密码后,会给邮箱发一份邮件验证,填写验证后才可以登录。 而旧版是不存在二次密码这个功能的,因此正常输入主密码后接口会直接报错,从而导致无法登录。 我昨天就遇到了这个问题,研究了几个小时,还真让我找到一个办法,亲测非常简单好用,分享给大家。 核心就是获取新版的登录 cookie,手动插入到旧版中,就可以获取登录权限了。 --- 话不多说,直接上教学。 首先下载一个新版 Bitwarden,这样扩展中就存在两个 Bitwarden 了。 ![](https://imgurl.zishu.me/2025/07/1753405287321.webp) ## 2.复制 session 数据 正常登录新版 Bitwarden,然后在扩展中右键进入检查,点击 `console`,输入一条指令。 ```js // 读取 chrome.storage.session 数据 chrome.storage.session.get(null, data => console.log(JSON.stringify(data))); ``` 这样你就可以获取到扩展的 `session` 数据,复制一下,替换到下面的数据,然后复制整段代码,打开旧版 Bitwarden,然后在扩展中右键进入检查,点击 `console`,粘贴即可。 ```js const sessionData = { key1: "value1", key2: "value2" }; // 替换为你的数据 // 存入 chrome.storage.session chrome.storage.session.set(sessionData, () => { console.log("Session 数据导入成功!"); }); ``` ## 3.复制 local 数据 同理,local 数据也是一样的流程,在新版 Bitwarden 获取 local; ```js // 读取 chrome.storage.local 数据 chrome.storage.local.get(null, data => console.log(JSON.stringify(data))); ``` 到旧版粘贴数据进去; ```js const localData = { key1: "value1", key2: "value2" }; // 替换为你的数据 // 存入 chrome.storage.local chrome.storage.local.set(localData, () => { console.log("local 数据导入成功!"); }); ``` ## 4.重启扩展 大功告成,在旧版 Bitwarden 扩展右键刷新一下,这时候你会发现一个问题,那就是扩展图标为什么是灰色不可用状态,不用着急,回到浏览器扩展页面,点击 `刷新` 重启扩展即可。 又可以流畅使用 Bitwarden 了! 顺便吐槽一句,新版 Bitwarden 真是一团 shit.

  •  

AI 驱动的验证码自动识别之旅:从困扰到解放

2025年7月7日 08:00

在当今互联网世界,验证码作为人机验证的重要工具无处不在。然而,频繁输入验证码对用户体验造成了不小的困扰。今天,我想分享一个名为 "CAPTCHA-automatic-recognition" 的开源项目,它巧妙地运用 AI 技术,实现了网页验证码的自动识别与填充。 ## 1. 解决日常痛点 作为一名经常需要在不同网站注册和登录的开发者,我深受验证码困扰。有时仅仅是查询一个信息,就需要输入验证码;有时验证码字符扭曲到难以辨认,需要多次尝试才能通过。 这些小小的摩擦积累起来,浪费了大量时间。我想:既然现代 AI 视觉模型已经如此强大,为什么不利用它们来自动识别验证码,节省我们的时间和精力呢? 于是,"CAPTCHA-automatic-recognition" 项目诞生了。 我选择了以油猴脚本的形式实现这个功能,因为它可以轻松地集成到各种网站上,无需修改网站源码。 - GitHub: [https://github.com/anghunk/UserScript/tree/main/CAPTCHA-automatic-recognition](https://github.com/anghunk/UserScript/tree/main/CAPTCHA-automatic-recognition) - Greasyfork: [https://greasyfork.org/scripts/540822](https://greasyfork.org/scripts/540822) ![CAPTCHA-automatic-recognition](https://imgurl.zishu.me/2025/07/1751870273918.webp) ## 2. 迭代与优化 最初的版本非常简单,仅支持 OpenAI 和 Google Gemini 格式,识别文字验证码,需要用户需要手动点击识别按钮,后期则升级支持自动填充。 关键问题是如何准确获取网页中的验证码图片,我简单做了一套图像检测程序,通过选择器找到可能是验证码的图片元素,比如: ```js captchaSelectors: [ 'img[src*="captcha"]', 'img[src*="verify"]', // ... ], ``` 随着用户的反馈,我加入了对阿里云通义千问的 API 支持,用户可以根据自己的需求和偏好选择不同的 AI 模型。 并且我加强了对 prompt 的优化,根据网友的建议升级了 prompt,让模型更加准确地识别验证码。 来源:[https://linux.do/t/topic/756503/135](https://linux.do/t/topic/756503/135) ```js export const DEFAULT_PROMPT = `# Role: 验证码识别专家 ## Profile - language: 中文 - description: 一个专为高精度识别验证码而设计的AI模型。能够快速、准确地从复杂的图像中提取字符或计算数学表达式的结果,并能有效对抗常见的干扰元素。 - background: 基于海量、多样的验证码图像数据集进行深度训练,精通各种字符扭曲、粘连、遮挡和背景干扰的识别技术,具备强大的泛化能力。 - personality: 精确、高效、客观、直接。只关注任务本身,不产生任何与结果无关的额外信息。 - expertise: 计算机视觉、高级光学字符识别(OCR)、图像预处理与去噪、模式识别、基础算术逻辑。 - target_audience: 需要自动化处理验证码的开发者、自动化测试工程师、数据科学家。 ## Skills 1. 核心识别能力 - 高精度字符识别: 准确识别大小写英文字母、数字,并能精确区分外形相似的字符(如:0和O,1和l,g和9)。 - 数学运算处理: 识别并解析图片中的数学算式(如:3+5*2),并计算出最终的数值结果。 - 强抗干扰能力: 自动过滤和忽略图像中的干扰线、噪点、斑块、背景纹理等非关键信息。 - 字符分割技术: 即使在字符粘连、重叠或间距不等的情况下,也能有效地将其分离以便独立识别。 2. 辅助处理能力 - 图像预处理: 自动对输入图像进行灰度化、二值化、去噪等操作,以提升识别的准确率。 - 快速响应: 以极低的延迟返回识别结果,满足实时性要求。 - 结果格式化: 严格按照指定的格式输出,确保输出的纯净性,便于程序调用。 - 鲁棒性: 对于不同字体、大小、颜色、角度的字符组合均有较高的识别成功率。 ## Rules 1. 基本原则: - 结果唯一: 输出内容必须是且仅是验证码的识别结果。 - 绝对精确: 尽最大努力确保字符识别的大小写和数值计算的准确性。 - 任务聚焦: 仅处理验证码内容,忽略图像中的任何其他元素。 - 保持静默: 除最终结果外,不输出任何提示、标签、解释或说明。 2. 行为准则: - 直接输出结果: 若为字符型验证码,直接返回字符串;若为计算题,直接返回计算后的数字。 - 严格区分大小写: 必须准确识别并返回字符的原始大小写形式(例如'W'和'w'是不同字符)。 - 精准区分易混淆字符: 必须对数字“0”和字母“O”、数字“1”和字母“l”等易混淆字符进行准确区分。 - 自动执行运算: 遇到数学表达式时,必须完成计算并仅返回最终的阿拉伯数字结果。 3. 限制条件: - 禁止任何解释: 不得对识别过程、结果的置信度或遇到的困难进行任何说明。 - 禁止附加文本: 返回的最终结果前后不能有任何空格、引号、标签或“答案是:”等引导性词语。 - 禁止互动: 不得向用户提问或请求更清晰的图片。 - 禁止失败提示: 即使无法完全识别,也应根据已识别内容尽力输出,而不是返回“无法识别”之类的自然语言。 ## Workflows - 目标: 接收一张验证码图片,精准、快速地返回其内容或计算结果。 - 步骤 1: 接收图像并进行分析,判断验证码类型(字符型或数学计算型)。 - 步骤 2: 应用图像预处理技术,对图像进行降噪、增强和二值化,以凸显关键字符,消除干扰线和背景。 - 步骤 3: 对处理后的图像进行字符分割,然后逐一识别。对于数学题,则识别数字和运算符。 - 步骤 4: 整合识别结果。如果是字符,则按顺序拼接成字符串;如果是数学题,则执行运算。 - 步骤 5: 输出最终结果。确保输出内容绝对纯净,符合Rules中的所有规定。 - 预期结果: 一个不包含任何多余信息的字符串(如“aB5fG”)或一个数字(如“28”)。 ## Initialization 作为验证码识别专家,你必须遵守上述Rules,按照Workflows执行任务。 ``` 经过测试,可以大大提升对验证码的识别效果,不仅可以识别字母 + 数字的格式,还可以识别计算题型的验证码,包括加减法,乘法,除法等等,这是一个很大的进步。 有用户反馈不知道模型是否可用,因此我加入了 "连通性检测" 的功能,可以帮助用户检查模型的可用性。 在开发的后期,由于人力的因素,虽然内置的验证码识别程序足够满足很多网站使用,但依然有网友反馈识别失败。 我意识到,这不是一个人可以完善的事情。因此我开发了高级设置功能,允许用户自定义验证码选择器和输入框选择器。这解决了不同网站验证码实现差异导致的兼容性问题。 ![高级设置](https://imgurl.zishu.me/2025/07/1751869709402.webp) 并且简单写了一个[教程](https://github.com/anghunk/UserScript/blob/main/CAPTCHA-automatic-recognition/docs/advanced-settings.md),帮助用户使用这个功能。 ## 3. 遇到的问题 **跨域图片访问问题** 很多网站的验证码图片设置了跨域限制,无法直接获取图像数据。为解决这个问题,我实现了一套图像处理流程,通过 Canvas 间接获取图像数据,然后处理为 base64 格式传输给 AI 模型。 **AI 模型选择与优化** 不同 AI 模型各有优缺点: - OpenAI 模型精度高,但响应较慢 - Gemini 模型(特别是 gemini-2.5-flash-lite)速度快,平衡了性能和准确率 - 通义千问适合中文环境 经过反复测试,我发现 `gemini-2.5-flash-lite` 模型在验证码识别任务上表现最佳,因此成为我的首选。 ## 4. 项目现状与未来规划 目前,这个项目已经在 GitHub 和 Greasyfork 上发布,获得了不少用户的好评。投稿到阮一峰周刊,也收录了该项目。 来源:[https://github.com/ruanyf/weekly/blob/master/docs/issue-355.md](https://github.com/ruanyf/weekly/blob/master/docs/issue-355.md#ai-%E7%9B%B8%E5%85%B3) CAPTCHA-automatic-recognition 这个项目虽小,功能也比较简单,却体现了 AI 技术如何改善日常生活的小痛点。从最初的想法到如今功能完善的工具,这个过程既有技术上的挑战,也有解决问题带来的成就感。 如果你也经常被验证码困扰,不妨试试这个工具。它可能不是最复杂的 AI 应用,但一定是最实用的 AI 辅助工具之一。 - GitHub: [https://github.com/anghunk/UserScript/tree/main/CAPTCHA-automatic-recognition](https://github.com/anghunk/UserScript/tree/main/CAPTCHA-automatic-recognition) - Greasyfork: [https://greasyfork.org/scripts/540822](https://greasyfork.org/scripts/540822) 如果你觉得这个功能不错,欢迎点个 star 支持一下~

  •  

Obsidian:移动端同步笔记

2025年6月11日 08:00

前景提示:[Obsidian:如何使用坚果云进行多端同步?](/blog/146.html) 时隔三年,终于完成了这个系列,Obsidian 多端同步坚果云之移动端同步。这依赖于坚果云的官方插件 --- Nutstore Sync,这个插件支持通过 Webdav 协议将坚果云与 Obsidian 本地笔记进行链接。 Github: https://github.com/nutstore/Obsidian-nutstore-sync 由于该插件还未通过 Obsidian 插件商店审核的原因,需要借助另外一个已上架的插件 -- BRAT,可在官方商店直接搜索下载。 > 需要在 PC 端和移动端同时安装以下两个插件才能进行同步,安装流程都是一样的,我暂以移动端为例。 ## 1. 安装插件 下面是图示流程; 下载安装完成之后,在 BRAT 的设置页面找到 `Add beta plugin` 按钮点击它。 在添加插件窗口中输入 Nutstore Sync 的 GitHub 地址,点击 `Add plugin` 安装,即可完成安装。 这一步完成之后,这个插件就已经存在于你的 Obsidian 设置中,下次打开 Obsidian 就可以直接使用了。 ## 2. 使用插件 > PC 端和移动端使用方法都是一致的,我暂以 PC 端为例进行截图说明。 Nutstore Sync 中我建议以账号密码进行登录,这样 webdav 的权限更稳定一些,有尝试过使用单点登录,但是容易掉登录权限。 ![设置面板](https://imgurl.zishu.me/2025/06/1749604565459.webp) 账号密码就是你的坚果云密码,注意不是登录密码,需要在坚果云网页设置中进行操作。 > https://www.jianguoyun.com/ ![坚果云密钥获取演示](https://imgurl.zishu.me/2025/06/1749604723442.webp) ## 3. 配置推荐 ![](https://imgurl.zishu.me/2025/06/1749604964274.webp) 可以参考一下我的设置。 - 远程目录就是存储数据的地方,PC 端和移动端选择同一目录即可 - 冲突策略选择推荐即可 - 开启使用 `Git` 语法标记冲突(程序员比较习惯) - 同步前确认,可以检查一下文件对不对,二次保险 - 自动同步关掉(推荐),个人用着不太适应,偶尔会出现同步冲突的情况,更喜欢手动操作 - 同步模式宽松,速度更快 过滤规则:过滤一些不想同步的文件,由于 `.Obsidian` 很多配置文件,我不想在手机上同步,就过滤掉了。 ![](https://imgurl.zishu.me/2025/06/1749605051374.webp)

  •  

端午节包粽子

2025年5月31日 08:00

昨天周五下班后,准备食材包粽子,迎接端午节的到来。 主材料:粽叶、糯米 馅料:五花肉、豆沙、咸蛋黄、蜜枣 由于是第一次包,我跟女朋友一边看教程一边学习,刚开始用的一张叶子,总包不好,后面换成两张叶子,发现越来越得心应手。 模样不算太好看,但是都是真材实料,且没有露馅。但是好像是酱油加的有点少了,所以导致不够咸,总体偏淡,但是口感也是可圈可点,是我喜欢的馅。 后面还有一盆糯米,准备改进一下,多加点酱油,手法上也有所进步了,再接再厉! 分享几张图。 ![食材](https://imgurl.zishu.me/2025/05/1748699210445.webp) ![炖锅的五花肉](https://imgurl.zishu.me/2025/05/1748699221343.webp) ![下锅的粽子](https://imgurl.zishu.me/2025/05/1748699230228.webp)

  •  

两天一夜象山赶海之旅

2025年5月8日 08:00

> 五一刚回来有些忙,推迟了好几天,终于可以闲下来写写游记了。 五一出去象山玩了几天,出发前一周已经做好了攻略,包括路线、时间、住宿哦、饮食等个各方面,但计划赶不上变化。最开始预估的最多三个小时就能到达目的地,结果硬是在高速跑了五六个小时,基本 2/3 的时间都在堵,特别是宁波嘉兴段高速,走走停停,不过还好带了小零食,跟对象说说笑笑就过去了,也不会枯燥。 点赞余姚服务区,跑一半小累下去休息一下,超市价格跟杭州差不多,没有额外涨价,短暂休整后继续驾车前行。一个小插曲,中间大概有几十公里的路程,高速播报允许小汽车在应急车道通行,我犹豫了一下然后果断走了应急通道,非常爽很畅通,虽然车道有些略窄,但是走的很爽没有停下来过,看旁边堵的熙熙攘攘,这也是我第一次走应急通道,不错的体验。 越靠近海边环境越好,空气也很舒服,同时也感叹临海城市天气莫测,刚下象山收费站下起了大雨,然后走了一两公里后,又是大晴天,烈日当空,打开窗户吹吹风,小小的享受了一下。 ![入岛](https://imgurl.zishu.me/2025/05/1746686738820.webp) 第一站打算去山顶看看大风车,路途经过一个小村庄,整洁的街边道路两旁,一栋栋精致的民居让人向往,羡慕浙江本地人了,家家户户都盖着小别墅,门前几乎都自己修建了小花园,可以养养花逗逗鸟。 到半山腰发现一个露营地,稍作休息,顺便放出无人机看看周围的情况,发现风景也就一般,跟对象商量直接去下一个景点,当时已经是下午三点多了。 沿着公路一直前行,路过有“小赛里木”之称的湖泊,其实就是一个人工湖,看到有很多人在露营烧烤,然后中间有一段管控,不让开车进,很多人都把车停在门口,我带着对象下来散散步、拍拍照,湛蓝的天空伴着习习微风,令人心旷神怡。 短暂休息后,我们决定前往沙滩游玩,就继续出发一路边走边玩,有说有笑,最后导航来到白沙湾沙滩,路两边也是停满了车,一下车女朋友就很兴奋,我也换上了短裤和人字拖,沙滩度假标配,瞅了一下,人不多还挺宽敞的,沙子也比较干净,基本都是一家三口带着小孩来玩,我们俩也去海水泡泡脚,不过傍晚那段时间海水挺黄的,也正好快赶上涨潮。 ![夕阳和沙滩](https://imgurl.zishu.me/2025/05/1746686804738.webp) ![海边的风景](https://imgurl.zishu.me/2025/05/1746686752701.webp) 简单玩了一会,我们又去把帐篷从车上拉下来,带了不少东西,因为是第一次露营过夜,也是尽量准备周全一点,准备了防潮垫之类的东西,然后带了一个空调被,事实证明这远远不够,靠近海边还是有点冷,温度不高,比正常睡觉偏凉一些。晚上的话就使用自己带的食材美美的吃了一顿,有火锅底料、毛肚、肥牛、金针菇等,刚好吃饭的时候对面还放起了烟花,非常享受。 ![露营火锅](https://imgurl.zishu.me/2025/05/1746684373694.webp) 出去露营一定要收集好自己的垃圾,我专门准备了几个袋子收拾垃圾使用,打包好扔到附近的垃圾桶,之后就是洗漱完躺着享受夜晚,第一次在帐篷过夜,体验很不错。 本来打算第二天下午就回去的,但是早上起来发现空气很好,天空很蓝,海水很清,和傍晚完全不同,就决定多住一夜。早餐就热一下来之前准备的三明治,又是一顿美美的早餐,之后就是常规的拍照打卡环节,早上八九点几乎没什么人,和女朋友漫步在海边,看着照样吹吹清晨的海风,颇有一番滋味。 ![海边日出](https://imgurl.zishu.me/2025/05/1746686787260.webp) 还在美团下单了一些小铲子等,挖挖贝壳,堆堆沙子,彷佛回到了童年。累了就躺帐篷里休息,休息好了继续出去玩,除了太阳有点大,其他并无不适,还好带了防晒喷雾,这两天下来也没有晒黑,不过忽略了一件事,身上防晒做好了,但是忽略了脚,因为穿着人字拖,一天下来好像有些晒伤,还好缓了几天就缓过来了,下次一点要注意这点。 ![堆沙子游戏](https://imgurl.zishu.me/2025/05/1746686198552.webp) 不过等到晚上的时候,倒是发生了一些突然状态,没有看天气预报,入夜的时候风越来越大,因为在海边有些担心,就跟对象商量了一下放弃过夜的想法,收拾了一下行李装车离开,和来时完全不同,路上几乎没有一辆车,打开窗户慢慢开,注意到了之前没有注意的一些东西,象山的路边交通很像之前看过的台湾偶像剧里面的建筑,可能因为都毗邻海边的缘故,建筑风格也很像,和对象嘻嘻笑笑的踏上了回杭的旅程。 总结下来,对这次旅行还是比较满意的,除了开始的时候在高速堵车,其他时候还是很畅通的,风景吃喝都没有委屈自己,非常棒!完结撒花! ![开心的下午茶时光](https://imgurl.zishu.me/2025/05/1746684408164.webp)

  •  

第一个 Github 千星项目

2025年4月20日 08:00

今天中午吃完饭闲来无事,准备上 GitHub Explore 看看有没有新的开源项目推荐。 发现我的一个项目,居然成功达到了 1k star,记录一下,虽然是一个很简单的工具,但也算解决了部分用户的痛点。 已经迭代了 170+ 个 releases 版本,功能不断更新,解决了 110+ Issues,合并了 20+ Pull requests。 GitHub: https://github.com/anghunk/linuxdo-scripts ![LinuxDo Scripts](https://imgurl.zishu.me/2025/04/1745136346471.webp)

  •  

我和 AI 的这几年

2025年4月19日 08:00

这几年最火的事情莫过于 AI,也有可能是幸存者偏差的原因,当然这暂表不提,只谈谈我和 AI 相处的这几年,我是如何利用这个工具,提高我的工作效率,以及在生活,兴趣爱好等层面和谐融入 2022 年底 的时候,我初步接触 gpt 3.5,给我带了极大的震撼,我没想到,AI 已经进化到如此的地步,可以智能对话,处理代码逻辑,进行文字撰写工作。以现在的目光看来它很傻,但是在当时那个环境下,给我的工作和学习带来了极大的帮助。 现在翻阅和 gpt 的历史聊天记录,可以看出我当时对它还是抱有很大的热枕,可以帮我总结繁杂的 json 数据并重组数据结构。还可以通过一些特殊的 Prompt 让它解锁图片生成,虽然很生成的图像很拙劣,但我玩的很开心。 后来随着这个领域发展的突飞猛进,Claude 横空出世,开始在上下文限制上领先 gpt,但是 OpenAI 毕竟占据先发优势,仍然是我主用的模型。可随着时间的推移,Claude 开始崭露头角,在代码领域展现出断层式的领先,尤其是在前端代码生成方面,非常符合我的需求,所以后来我的使用就变成了 Claude 写代码,gpt 日常使用。 可以给我生成一些文档,比如开发某个项目,要写开发文档,说明书之类的,程序员最厌恶的两件事情。一是让我写文档,二是别人不写文档。而 AI 恰好可以完美处理这个问题,虽然刚开始比较笨拙,但在我不停的投喂资料下,也是可以逐渐生成可上生产环境的文档,当然了最后还是需要我来 review code。 后来谷歌也陆续推出了什么 Bard 模型,现在改名叫 Gemini,质量也是非常不错,不过我用的比较少。通过前面的介绍也大概知道,AI 领域前期一直是国外遥遥领先,虽然我也希望国产 AI 可以崛起。 但是在 2024 年年末的时候,DeepSeek 横空出世,在 AI 圈掀起了轩然大波,当时深度求索推出两款模型一个是 `deepseek-chat` 也就是现在的 `deepseek-v3`,还有一个就是现在的深度思考模式 `deepseek-reasoner`。也是带起了大模型引入思考的风潮。 记得在还没过年之前,DeepSeek 小火了一段时间,我也是频繁使用,代码质量、文本质量完全可以称得上一线水平,官网速度也很快,应该是因为人流量还未彻底爆发,深度思考模式基本都是秒出。后来代码一经开源,直接引起热潮,官网流量爆炸,至今任伟恢复到巅峰时期,不过这也说明了 deeseek 的全民热潮。 后面各家大厂也都部署了 deepseek 全血版,我比较推崇火山方舟和阿里云百炼旗下的 deepseek 模型,质量和速度也都在前列,我 90% 在使用火山方舟的。 其实阿里旗下的 QWen 模型也一直发展的风生水起,不过我是个人用习惯了前面说的那些,所以 QWen 也很少用,不过非常推荐大家使用。 所以我目前对 AI 模型的使用如下,DeepSeek + GPT 处理日常文字工作,图像生成,以及繁琐的数据重组等,Claude 负责处理逻辑复杂的代码开发,然后掺杂着 Gemini 以及其他新兴模型作为测试。 --- 其他文章我可能或多或少使用 AI 进行润色,但这篇文章完全 0 AI 痕迹,算是对这方面的个人总结吧。如名词错误情况或其他错误请指出,完全是有感而发思绪很快,键盘敲个不停。

  •  

无法加载文件,因为在此系统上禁止运行脚本

2025年4月17日 08:00

```shell 无法加载文件 D:\Code\xxx\npm.ps1,因为在此系统上禁止运行脚本 ``` 偶尔会遇到这个问题,修改下电脑的策略就可以了。 在管理员终端输入下面的指令: ```shell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned ```

  •  

Cherry Studio 接入高德地图 MCP 示例

2025年4月2日 08:00

本教程使用环境 Cherry Studio 1.1.17. 最近 Cherry Studio 也接入了 MCP 服务器,闲着无聊准备尝试一番,就拿最简单的高德地图来做演示,刚好最近高德也支持了 MCP 服务。 需要申请高德开发者账号,这个就不赘述了。在高德开发者控制台找到 `应用管理>我的应用`,点击`创建新应用`,类型名称随便填一下,绑定服务要选择 `Web服务`,然后不要限制 IP,最后会生成一个 key。 ### 配置 Cherry Studio 的 MCP 服务器 拿到高德地图的 key 后,在 Cherry Studio 的 MCP 服务器设置填入,有两种方法。 1. 方法一:直接导入配置(推荐) 在右上角 `编辑 MCP 配置` 中直接将下面的配置复制进去,改一下 `AMAP_MAPS_API_KEY` ```json { "mcpServers": { "@amap/amap-maps": { "name": "@amap/amap-maps", "isActive": true, "command": "npx", "args": [ "-y", "@amap/amap-maps-mcp-server" ], "env": { "AMAP_MAPS_API_KEY": "xxxxxxxxxxx" } } } } ``` 2. 方法二:手动填写配置 在 Cherry Studio 中打开 MCP 服务器设置界面,按以下参数填写: ```shell 名称:@amap/amap-maps 命令:npx 参数:-y @amap/amap-maps-mcp-server 环境变量:添加 AMAP_MAPS_API_KEY 并填入您的 Key。 ``` 保存配置后,系统会自动加载高德地图的 MCP 服务。 ![](https://imgurl.zishu.me/2025/04/1743571909183.webp) 会在下方显示高德地图支持的工具,就是 AI 模型可以调用的工具。 ![](https://imgurl.zishu.me/2025/04/1743571892735.webp) ### 启用 AI 模型的函数调用功能 使用方法也很简单,需要 AI 模型支持函数调用,以火山引擎作为示例,我使用了 DeepSeek-R1 模型,默认是没有函数调用的(会显示那个小扳手),需要在设置中手动开启 ![](https://imgurl.zishu.me/2025/04/1743571944482.webp) ![](https://imgurl.zishu.me/2025/04/1743571984748.webp) 这样在聊天框下方会出现一个 MCP 的标志,勾选后可以直接跟模型进行对话,可以输出天气地点等信息,如果再搭配你的 prompt,可以直接规划公交地铁线路等。 ![](https://imgurl.zishu.me/2025/04/1743571957570.webp)

测试 MCP 对话效果 ```md ### 🧑‍💻 User 规划一下这周清明节在杭州出去玩的攻略。 --- ### 🤖 Assistant 根据杭州清明节期间的天气情况,我为您规划一份兼顾自然风光与文化体验的 3 日游攻略,天气友好且行程灵活: --- **🌿 清明小长假 3 日游行程推荐(4 月 3 日 -5 日)** *注:4 月 2 日周二为工作日,建议提前抵达杭州做准备* --- **Day1(4 月 3 日·晴转多云|7-19℃)** **主题:西湖经典文化线** ☀️ 上午 7:30 乘摇橹船游「乌龟潭路线」 (郭庄码头→茅家埠→曲院风荷,避开人潮享樱花碧水) 9:30 步行至「岳王庙」拜谒民族英雄 🌤️ 下午 13:00「中国茶叶博物馆(双峰馆)」 (亲手体验龙井茶炒制,观千亩茶田) 15:30「茅家埠黛色参天」古风摄影 (黛色牌坊 + 睡莲初绽,汉服出片胜地) 🌙 夜晚 19:00「西湖音乐喷泉」灯光秀 (提前占位,夜赏湖滨灯光璀璨) --- **Day2(4 月 4 日·多云|12-26℃)** **主题:春日野趣轻徒步** 🌸 上午 8:00「九溪烟树」溯溪徒步 (穿越迷雾森林,十八涧水映杜鹃) 11:00「龙井村」茶农家访 (品明前龙井,尝茶香土鸡汤) 🌿 下午 14:00「云栖竹径」洗肺之旅 (千年古树 + 竹林秘境,电影《卧虎藏龙》取景地) 16:30「梅家坞」茶园骑行 (租电动车漫游茶山,俯瞰层叠青绿) 🍵 傍晚 18:30「茶人村」晚餐 (百年老宅尝桂花藕韵、茶香虾) --- **Day3(4 月 5 日·小雨转晴|13-25℃)** **主题:运河文艺漫游** 🌧️ 上午(微雨意境) 9:00「桥西历史街区」 (逛刀剪/伞/扇博物馆,体验非遗手作) 11:00「小河直街」咖啡探店 (推荐河下咖啡·《人间草木》主题书咖) ☀️ 下午(放晴后) 14:00「拱宸桥」乘漕舫船 (水路穿越古今,听评弹吴侬软语) 16:00「富义仓艺术中心」看展 (旧粮仓改造的先锋艺术空间) 🎑 夜晚 19:30「胜利河美食街」夜宵 (推荐老头油爆虾、脆皮大肠) --- **⚠️ 出行贴士** 1️⃣ 穿衣:洋葱式穿搭(薄毛衣 + 防风外套),备晴雨伞 2️⃣ 交通:西湖景区周末单双号限行,推荐地铁 + 共享单车 3️⃣ 预约:岳王庙/茶叶博物馆等需提前 1 天在「掌上西湖」预约 4️⃣ 备选:若遇大雨可调整为「浙江省博」+「南宋官窑博物馆」室内游 清明时节的杭州既有烟雨江南的朦胧美,又有春和景明的清朗,建议随身带本《杭州记事》手账,在各景点盖限定章留念哦~ 🌸 ```

  •  

去年的樱花再次盛开

2025年3月24日 08:00

[樱花飞舞的初春 / 2024-03-26](/blog/222.html) 同样的地点,同样的时间(就差了 2 天),一直在等着上班路上的这棵樱花树盛开,花的颜色好像更好看了。 ![](https://imgurl.zishu.me/2025/03/1742781458088.jpg)

  •  

通过 AI 实现自动生成 SEO TDK

2025年3月6日 08:00

感谢博友的文章,[《AI 实践|零成本生成 SEO 友好的 TDK 落地方案》](https://blog.ops-coffee.cn/s/ai-powered-seo-automation-for-tdk-generation.html)。 昨天晚上刷到一篇文章,通过 AI 自动化生成网站 SEO 的 TDK,他这个方法有两点比较繁琐的地方。 > 1. 文章内容需要手动替换到脚本中 > 2. 生成的 TDK 需要手动加入数据库 我针对第一点略微做了一些调整,可以直接查找当前脚本目录下的文件夹,在文件的 62 行,稍后我会把源码贴在文章最下方。 https://github.com/anghunk/blog/blob/main/aitdk.py ```py # aitdk.py def main(file_name, api_key, api_url, model, debug=False): current_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(current_dir, 'content', 'blog', file_name) ``` 这里的目录 `/content/blog` 可以自由修改,换成你本地的格式。 使用方法也很简单,在 `aitdk.py` 同级目录下新建一个 `.env` 环境变量文件,内容如下: ```shell OPENAI_API_KEY=sk-xxx OPENAI_API_URL=https://api.openai.com/v1 OPENAI_API_MODEL=gpt-4o-mini ``` 然后安装一下依赖。 ```shell pip install markdown beautifulsoup4 openai==0.28 python-dotenv ``` 运行命令,`xxx.md` 就是你的文件全名。 ```shell py aitdk.py xxx.md ``` 生成的结果就如下,对于 SEO 质量还是不错的。 ![](https://imgurl.zishu.me/2025/03/1741253061441.webp) ![](https://imgurl.zishu.me/2025/03/1741253117948.webp)

aitdk.py 源码 ```py import os import json import markdown from bs4 import BeautifulSoup import openai from dotenv import load_dotenv import argparse # 加载环境变量 load_dotenv() def extract_text_from_markdown(file_path): with open(file_path, 'r', encoding='utf-8') as file: md_content = file.read() html_content = markdown.markdown(md_content) soup = BeautifulSoup(html_content, 'html.parser') text_content = soup.get_text() return text_content def generate_seo_content(text, api_key, api_url, model, debug=False): openai.api_key = api_key if api_url: openai.api_base = api_url prompt = f"请根据文章内容从 SEO 友好的角度提取出标题、关键词和描述:\n\n{text}\n\n请以 JSON 格式输出,包含 slug、title、keywords 和 description 字段。" try: response = openai.ChatCompletion.create( model=model, messages=[ {"role": "system", "content": "你是一个 SEO 专家,擅长提炼文章的核心内容并生成优化的元数据。"}, {"role": "user", "content": prompt} ] ) content = response.choices[0].message['content'] # 只在 debug 模式下输出 API 响应 if debug: print("API Response:", content) return content except Exception as e: print(f"Error calling OpenAI API: {e}") return None def parse_seo_content(content): try: # 尝试直接解析 JSON return json.loads(content) except json.JSONDecodeError: # 如果直接解析失败,尝试提取 JSON 部分 try: start = content.index('{') end = content.rindex('}') + 1 json_str = content[start:end] return json.loads(json_str) except (ValueError, json.JSONDecodeError): print("无法解析 API 返回的内容为 JSON 格式") return None def main(file_name, api_key, api_url, model, debug=False): current_dir = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(current_dir, 'content', 'blog', file_name) if not os.path.exists(file_path): print(f"错误:文件 '{file_path}' 不存在。") return text_content = extract_text_from_markdown(file_path) seo_content = generate_seo_content(text_content, api_key, api_url, model, debug) if seo_content: seo_data = parse_seo_content(seo_content) if seo_data: print(json.dumps(seo_data, ensure_ascii=False, indent=2)) else: print("无法生成有效的 SEO 数据") else: print("生成 SEO 内容失败") if __name__ == "__main__": parser = argparse.ArgumentParser(description="从 Markdown 文件生成 SEO 内容") parser.add_argument("file_name", help="Markdown 文件名称 (位于 content/blog/目录下)") parser.add_argument("--api_key", default=os.getenv("OPENAI_API_KEY"), help="OpenAI API 密钥") parser.add_argument("--api_url", default=os.getenv("OPENAI_API_URL"), help="OpenAI API URL") parser.add_argument("--model", default=os.getenv("OPENAI_API_MODEL"), help="OpenAI 模型名称") parser.add_argument("--debug", action="store_true", help="开启调试模式,显示 API 响应") args = parser.parse_args() if not args.api_key: print("错误:未提供 API 密钥。请在命令行参数中指定或在.env 文件中设置 OPENAI_API_KEY。") else: main(args.file_name, args.api_key, args.api_url, args.model, args.debug) ```

  •  

径山寺看雪:杭州周边雪景游记

2025年2月22日 08:00

周五无意在小红书上刷到说杭州周边的山头都开始下雪,立刻打开“天文通”APP 查看,确实下雪了。 ![](https://imgurl.zishu.me/2025/02/1740234387537.webp) 立刻喊上女朋友开始规划周六的行程。 早上 9 点左右出门,到达时 10:30 左右,将车停在了径山集散中心附近,然后乘坐景区免费的接驳车前往山顶的径山寺。 这里表示非常好评,提供了免费的接驳车,省去了自己开车的麻烦。一路上盘山公路弯弯绕绕,差点给我坐晕了,上山单程大概 25-30 分钟,这还是在不堵车的情况下。 刚开始还是淅淅沥沥的小雨,大概快到山顶的时候飘起了雪花,快两年没看到雪了。 ![](https://imgurl.zishu.me/2025/02/1740234727786.webp) ![](https://imgurl.zishu.me/2025/02/1740234767173.webp) 顺便在雪上写字打卡留恋一下,字丑勿怪,女朋友还很喜欢。 ![](https://imgurl.zishu.me/2025/02/1740234923633.webp) --- 值得一提的是今天运气特别好,大概一点多准备下山的时候,坐到半山腰时发现上山的路都被堵住了。根本不知道今天来了多少人。 后面听说不少上山的车打滑,撞了不少栏杆和围墙,想想就很危险,幸好没有开车上山。 由于雪越下越大,估计也是怕出现意外,执勤交警已经封了后半段路,并且从集散中心上山的接驳车也全面停运。 现在唯一上山的方式就是自驾到径山桐桥停车场,然后沿径山古道上山,这个停车场是距离山顶最近的地方,但是场地不大,很难停车。好处是路线比较友好,没有太大的难度,大概一个小时左右就可以。

  •  

Cloudflare 上部署 Twikoo 服务时报错

2025年2月20日 08:00

GitHub: https://github.com/twikoojs/twikoo-cloudflare Twikoo 支持通过 Cloudflare Workers 进行部署服务和数据库,GitHub 仓库地址如上。 但是部署文档中有一点小坑需要注意一下,官方没有进行标注,我不清楚是只有我遇到这个问题还是怎么样,记录下来以防有其他人遇到这个问题,在搜索引擎可以看到这篇文章而解决。 ![](https://imgurl.zishu.me/2025/02/1740030986550.webp) > 由于 Cloudflare Workers 的免费套餐对捆绑包大小有严格的 1MiB 限制,因此我们需要手动删除一些包以使捆绑包保持在限制范围内。由于 Cloudflare 工作线程的 Node.js 兼容性问题,这些包无论如何都无法使用。 因为上面那个问题,所以需要把这几个文件清空,(不能删除会报错),但是这个指令存在问题,会把文件格式转为 `utf-16`,如果不处理它的话就会导致最后部署的时候报错,如下图所示。 ![](https://imgurl.zishu.me/2025/02/1740031220577.webp) 解决方法也很简单,只需要在 vscode 中找到这三个文件。 把编码格式改为 `utf-8`,然后清空乱码即可。 ![](https://imgurl.zishu.me/2025/02/1740031930681.webp)

  •  

奇趣周刊 - 第 82 期

2025年2月1日 08:00

> 奇趣周刊,分享有趣的软件,程序,动态新闻等。 [周刊列表](/categories/weekly/) | [rss 订阅](/categories/weekly/index.xml) 祝大家新年快乐,大吉大利!在新的一年里,事业节节高升,财源滚滚。 ### 1. barba.js - 一个让网站平滑跳转的库 https://barba.js.org/ 这个库的功能与 pjax 类似,但是更轻量、易用,本站已经引入该库实现平滑跳转。它使网站像 SPA(单页应用程序)一样运行,并有助于减少页面之间的延迟、最大限度地减少浏览器 HTTP 请求并增强用户的 Web 体验。 可以进入官网体验这种效果。 ### 2. RetroUI - 一个复古风格的 UI 组件库 https://retroui.dev/ 这是一个基于 Tailwind CSS 的复古风格 UI 库,与现代化千篇一律的样式不同。 ![](https://imgurl.zishu.me/2025/01/1737078743290.webp) ### 3. 字节跳动出品的 Trae https://www.trae.ai/ 对标 Cussor,可以用 claude3.5,限时免费。Trae 是一个人工智能集成开发环境(IDE),旨在通过人工智能与开发者的协作,提高开发效率和项目构建速度。 ![](https://imgurl.zishu.me/2025/01/1737350631964.webp) ### 4. Github 官方的 css 组件 https://primer.style/css/storybook/?path=/docs/gettingstarted--docs 无意中发现 GitHub 居然有一个官方提供的 UI 组件库,但是似乎维护的不是很上心,不过单纯使用 css 的话还是会跟 GitHub 网站保持一样的风格,感觉还不错,支持 cdn 直接引入、或者 npm 包导入。 ![](https://imgurl.zishu.me/2025/01/1737353787992.webp)

  •  
❌