2025-04-17 08:00:00
无法加载文件 D:\Code\xxx\npm.ps1,因为在此系统上禁止运行脚本
偶尔会遇到这个问题,修改下电脑的策略就可以了。
在管理员终端输入下面的指令:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
2025-04-02 08:00:00
本教程使用环境 Cherry Studio 1.1.17.
最近 Cherry Studio 也接入了 MCP 服务器,闲着无聊准备尝试一番,就拿最简单的高德地图来做演示,刚好最近高德也支持了 MCP 服务。
需要申请高德开发者账号,这个就不赘述了。在高德开发者控制台找到 应用管理>我的应用
,点击创建新应用
,类型名称随便填一下,绑定服务要选择 Web服务
,然后不要限制 IP,最后会生成一个 key。
拿到高德地图的 key 后,在 Cherry Studio 的 MCP 服务器设置填入,有两种方法。
在右上角 编辑 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"
}
}
}
}
在 Cherry Studio 中打开 MCP 服务器设置界面,按以下参数填写:
名称:@amap/amap-maps
命令:npx
参数:-y @amap/amap-maps-mcp-server
环境变量:添加 AMAP_MAPS_API_KEY 并填入您的 Key。
保存配置后,系统会自动加载高德地图的 MCP 服务。
会在下方显示高德地图支持的工具,就是 AI 模型可以调用的工具。
使用方法也很简单,需要 AI 模型支持函数调用,以火山引擎作为示例,我使用了 DeepSeek-R1 模型,默认是没有函数调用的(会显示那个小扳手),需要在设置中手动开启
这样在聊天框下方会出现一个 MCP 的标志,勾选后可以直接跟模型进行对话,可以输出天气地点等信息,如果再搭配你的 prompt,可以直接规划公交地铁线路等。
### 🧑💻 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-06 08:00:00
感谢博友的文章,《AI 实践|零成本生成 SEO 友好的 TDK 落地方案》。
昨天晚上刷到一篇文章,通过 AI 自动化生成网站 SEO 的 TDK,他这个方法有两点比较繁琐的地方。
- 文章内容需要手动替换到脚本中
- 生成的 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 质量还是不错的。
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 分钟,这还是在不堵车的情况下。
刚开始还是淅淅沥沥的小雨,大概快到山顶的时候飘起了雪花,快两年没看到雪了。
顺便在雪上写字打卡留恋一下,字丑勿怪,女朋友还很喜欢。
值得一提的是今天运气特别好,大概一点多准备下山的时候,坐到半山腰时发现上山的路都被堵住了。根本不知道今天来了多少人。
后面听说不少上山的车打滑,撞了不少栏杆和围墙,想想就很危险,幸好没有开车上山。
由于雪越下越大,估计也是怕出现意外,执勤交警已经封了后半段路,并且从集散中心上山的接驳车也全面停运。
现在唯一上山的方式就是自驾到径山桐桥停车场,然后沿径山古道上山,这个停车场是距离山顶最近的地方,但是场地不大,很难停车。好处是路线比较友好,没有太大的难度,大概一个小时左右就可以。
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
,然后清空乱码即可。