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
,然后清空乱码即可。
2025-02-01 08:00:00
祝大家新年快乐,大吉大利!在新的一年里,事业节节高升,财源滚滚。
这个库的功能与 pjax 类似,但是更轻量、易用,本站已经引入该库实现平滑跳转。它使网站像 SPA(单页应用程序)一样运行,并有助于减少页面之间的延迟、最大限度地减少浏览器 HTTP 请求并增强用户的 Web 体验。
可以进入官网体验这种效果。
这是一个基于 Tailwind CSS 的复古风格 UI 库,与现代化千篇一律的样式不同。
对标 Cussor,可以用 claude3.5,限时免费。Trae 是一个人工智能集成开发环境(IDE),旨在通过人工智能与开发者的协作,提高开发效率和项目构建速度。
https://primer.style/css/storybook/?path=/docs/gettingstarted--docs
无意中发现 GitHub 居然有一个官方提供的 UI 组件库,但是似乎维护的不是很上心,不过单纯使用 css 的话还是会跟 GitHub 网站保持一样的风格,感觉还不错,支持 cdn 直接引入、或者 npm 包导入。
2025-01-16 08:00:00
将 PDF、Word、PowerPoint、Excel、CSV、网页或者网页链接转换为支持 AI 的 Markdown 或 JSON 格式。
Grok Button 通过扩展将 Grok 的强大功能带入您的浏览器。直接在浏览器栏中输入“grok {您的问题}”向 Grok 提问。
https://github.com/louis-e/arnis
一个非常有意思的项目,可以通过在现实地图中选择区域,然后渲染到 Minecraft 中生成对应的地图,水平非常高很细节。创建 3D 结构、道路、自然形态等。
一个 Chrome 扩展,可让将网络上任何位置的文本、链接、图像 URL、页面链接等内容保存到 Google 表格电子表格中,而无需切换选项卡,兼容 Brave 和 Microsoft Edge。
一个浏览器扩展,可以保存网页、文章、图像、PDF、视频、音乐、播客等,支持同步。
“Notion Faces” 是 Notion 官方提供的个性化服务,可以随机生成 Notion 风格的头像。
https://github.com/sampotts/plyr
Plyr 是一个开源的媒体播放器,支持 HTML5 视频和音频,以及 YouTube 和 Vimeo 平台的内容。它提供了一个简洁的界面,并且可以通过自定义来适应不同的需求。
BlurData 是一款专为 macOS 设计的自动模糊敏感信息的工具,能够快速识别并隐藏截图和 PDF 文档中的敏感数据,如电子邮件地址、姓名、金额等,提供免费试用和付费订阅两种使用方式。
2025-01-01 08:00:00
说明:调整后降低一下周刊发布的频率,由原来的每周四发布,改为现在的每半个月发布一次,也就是 1 日、16 日,希望为大家带来更优质的内容。
专为 linux.do 论坛设计,给 linux.do 用户提供了一些增强功能。
https://github.com/dlzmoe/linuxdo-scripts
网站提供的是一款本地隐私图片压缩工具,能够实现高达 95% 的压缩率,支持多种图片格式,保证压缩过程中的隐私安全,并提供批量处理功能。
https://github.com/KoriIku/chatgpt-degrade-checker
此工具可帮助检测 ChatGPT 是否因“高风险”IP 指定而通过降级服务来限制对您帐户上某些功能的访问。遇到无法使用 GPT-4 生成图像、网络搜索访问受限或 GPT-3.5 的简化响应等问题的用户可能会受益于运行此脚本来识别潜在的降级。
一个在线模拟器游戏网站,无需下载打开即玩,有很多怀旧的游戏,合金弹头、拳皇、三国战记等等。
https://github.com/Hiram-Wong/ZyPlayer
一款采用现代化技术栈开发的高颜值媒体播放器,它基于 electron-vite
框架,集成了 TDesign UI
组件库与 Vue3
全家桶,以清新的薄荷绿为主题,旨在为用户提供流畅的跨平台娱乐体验。
笔记编辑、排版、内容检测、效果预览,一站式搞定。帮助你在潜移默化中掌握小红书笔记创作底层逻辑!
GitHub Wrapped 2024 使用 Rendley SDK 提供了一种生成个性化视频摘要的方式,展示用户在 GitHub 上的年度成就和亮点。
34mb 视频,正在加载