MoreRSS

site iconZiShu | 子舒修改

本RSS包含了奇趣周刊。前端程序员,骑行爱好者,摄影爱好者,INFJ 。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

ZiShu | 子舒的 RSS 预览

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

2025-04-17 08:00:00

无法加载文件 D:\Code\xxx\npm.ps1,因为在此系统上禁止运行脚本

偶尔会遇到这个问题,修改下电脑的策略就可以了。

在管理员终端输入下面的指令:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Cherry Studio 接入高德地图 MCP 示例

2025-04-02 08:00: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

{
  "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"
      }
    }
  }
}
  1. 方法二:手动填写配置

在 Cherry Studio 中打开 MCP 服务器设置界面,按以下参数填写:

名称:@amap/amap-maps
命令:npx
参数:-y @amap/amap-maps-mcp-server
环境变量:添加 AMAP_MAPS_API_KEY 并填入您的 Key。

保存配置后,系统会自动加载高德地图的 MCP 服务。

会在下方显示高德地图支持的工具,就是 AI 模型可以调用的工具。

启用 AI 模型的函数调用功能

使用方法也很简单,需要 AI 模型支持函数调用,以火山引擎作为示例,我使用了 DeepSeek-R1 模型,默认是没有函数调用的(会显示那个小扳手),需要在设置中手动开启

这样在聊天框下方会出现一个 MCP 的标志,勾选后可以直接跟模型进行对话,可以输出天气地点等信息,如果再搭配你的 prompt,可以直接规划公交地铁线路等。

测试 MCP 对话效果
### 🧑‍💻 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-03-24 08:00:00

樱花飞舞的初春 / 2024-03-26

同样的地点,同样的时间(就差了 2 天),一直在等着上班路上的这棵樱花树盛开,花的颜色好像更好看了。

通过 AI 实现自动生成 SEO TDK

2025-03-06 08:00:00

感谢博友的文章,《AI 实践|零成本生成 SEO 友好的 TDK 落地方案》

昨天晚上刷到一篇文章,通过 AI 自动化生成网站 SEO 的 TDK,他这个方法有两点比较繁琐的地方。

  1. 文章内容需要手动替换到脚本中
  2. 生成的 TDK 需要手动加入数据库

我针对第一点略微做了一些调整,可以直接查找当前脚本目录下的文件夹,在文件的 62 行,稍后我会把源码贴在文章最下方。

https://github.com/dlzmoe/blog/blob/main/aitdk.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 环境变量文件,内容如下:

OPENAI_API_KEY=sk-xxx
OPENAI_API_URL=https://api.openai.com/v1
OPENAI_API_MODEL=gpt-4o-mini

然后安装一下依赖。

pip install markdown beautifulsoup4 openai==0.28 python-dotenv

运行命令,xxx.md 就是你的文件全名。

py aitdk.py xxx.md

生成的结果就如下,对于 SEO 质量还是不错的。

aitdk.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-02-22 08:00:00

周五无意在小红书上刷到说杭州周边的山头都开始下雪,立刻打开“天文通”APP 查看,确实下雪了。

立刻喊上女朋友开始规划周六的行程。

早上 9 点左右出门,到达时 10:30 左右,将车停在了径山集散中心附近,然后乘坐景区免费的接驳车前往山顶的径山寺。

这里表示非常好评,提供了免费的接驳车,省去了自己开车的麻烦。一路上盘山公路弯弯绕绕,差点给我坐晕了,上山单程大概 25-30 分钟,这还是在不堵车的情况下。

刚开始还是淅淅沥沥的小雨,大概快到山顶的时候飘起了雪花,快两年没看到雪了。

顺便在雪上写字打卡留恋一下,字丑勿怪,女朋友还很喜欢。


值得一提的是今天运气特别好,大概一点多准备下山的时候,坐到半山腰时发现上山的路都被堵住了。根本不知道今天来了多少人。

后面听说不少上山的车打滑,撞了不少栏杆和围墙,想想就很危险,幸好没有开车上山。

由于雪越下越大,估计也是怕出现意外,执勤交警已经封了后半段路,并且从集散中心上山的接驳车也全面停运。

现在唯一上山的方式就是自驾到径山桐桥停车场,然后沿径山古道上山,这个停车场是距离山顶最近的地方,但是场地不大,很难停车。好处是路线比较友好,没有太大的难度,大概一个小时左右就可以。

Cloudflare 上部署 Twikoo 服务时报错

2025-02-20 08:00:00

GitHub: https://github.com/twikoojs/twikoo-cloudflare

Twikoo 支持通过 Cloudflare Workers 进行部署服务和数据库,GitHub 仓库地址如上。

但是部署文档中有一点小坑需要注意一下,官方没有进行标注,我不清楚是只有我遇到这个问题还是怎么样,记录下来以防有其他人遇到这个问题,在搜索引擎可以看到这篇文章而解决。

由于 Cloudflare Workers 的免费套餐对捆绑包大小有严格的 1MiB 限制,因此我们需要手动删除一些包以使捆绑包保持在限制范围内。由于 Cloudflare 工作线程的 Node.js 兼容性问题,这些包无论如何都无法使用。

因为上面那个问题,所以需要把这几个文件清空,(不能删除会报错),但是这个指令存在问题,会把文件格式转为 utf-16,如果不处理它的话就会导致最后部署的时候报错,如下图所示。

解决方法也很简单,只需要在 vscode 中找到这三个文件。

把编码格式改为 utf-8,然后清空乱码即可。