importosimportjsonimportmarkdownfrombs4importBeautifulSoupimportopenaifromdotenvimportload_dotenvimportargparse# 加载环境变量load_dotenv()defextract_text_from_markdown(file_path):withopen(file_path,'r',encoding='utf-8')asfile:md_content=file.read()html_content=markdown.markdown(md_content)soup=BeautifulSoup(html_content,'html.parser')text_content=soup.get_text()returntext_contentdefgenerate_seo_content(text,api_key,api_url,model,debug=False):openai.api_key=api_keyifapi_url:openai.api_base=api_urlprompt=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 响应ifdebug:print("API Response:",content)returncontentexceptExceptionase:print(f"Error calling OpenAI API: {e}")returnNonedefparse_seo_content(content):try:# 尝试直接解析 JSONreturnjson.loads(content)exceptjson.JSONDecodeError:# 如果直接解析失败,尝试提取 JSON 部分try:start=content.index('{')end=content.rindex('}')+1json_str=content[start:end]returnjson.loads(json_str)except(ValueError,json.JSONDecodeError):print("无法解析 API 返回的内容为 JSON 格式")returnNonedefmain(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)ifnotos.path.exists(file_path):print(f"错误:文件 '{file_path}' 不存在。")returntext_content=extract_text_from_markdown(file_path)seo_content=generate_seo_content(text_content,api_key,api_url,model,debug)ifseo_content:seo_data=parse_seo_content(seo_content)ifseo_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()ifnotargs.api_key:print("错误:未提供 API 密钥。请在命令行参数中指定或在.env 文件中设置 OPENAI_API_KEY。")else:main(args.file_name,args.api_key,args.api_url,args.model,args.debug)