AI写作助手使用文档
概述
AI写作助手是一个基于Python的桌面应用程序,旨在帮助用户快速生成特定风格和主题的文章。该程序提供了一个图形用户界面(GUI),使得用户可以轻松输入关键词、设置生成数量、选择文章风格和保存目录,并启动文章生成过程。
系统要求
- Python环境
requests
库:用于发送网络请求ttkbootstrap
库:用于创建GUI- 网络连接:用于访问外部API
安装指南
- 确保Python已安装在您的系统上。
- 使用pip安装所需的库:
pip install requests ttkbootstrap
- 下载AI写作助手程序代码。
使用步骤
- 运行程序:双击程序文件或在命令行中运行
python <程序文件名>.py
。 - 输入关键词:在“关键词”输入框中输入文章的关键词,多个关键词请用逗号分隔。
- 设置生成数量:在“生成数量”输入框中输入您希望生成的文章数量。
- 设置建议字数:在“建议字数”输入框中输入您希望每篇文章的字数。
- 选择文章风格:在“文章风格”输入框中输入您希望的文章风格。
- 选择保存目录:点击“选择目录”按钮,选择文章保存的目录。
- 导入关键词:如果已有关键词列表,点击“导入关键词”按钮导入。
- 生成文章:点击“生成文章”按钮开始生成文章。
- 导入发布脚本:如果需要自动发布文章,点击“导入发布脚本”按钮导入发布脚本。
- 监控进度:程序会显示进度条和生成/失败的文章数量。
注意事项
- 确保您有一个有效的API Key,并替换代码中的
api_key
变量值。 - 确保网络连接正常,以便程序能够访问外部API。
- 如果遇到网络问题,检查API链接的合法性,并适当重试。
故障排除
- 如果API请求失败,请检查网络连接和API Key是否正确。
- 如果文章无法生成,请检查输入的关键词和设置是否正确。
- 如果发布脚本执行失败,请检查脚本是否正确导入和配置。
联系支持
如果在使用过程中遇到任何问题,请联系我们的技术支持团队。
import tkinter as tk
from tkinter import filedialog, messagebox
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
import requests
import os
import threading
import re
import subprocess
class AIWriterApp:
def __init__(self, root):
self.root = root
self.root.title("AI写作助手")
self.root.geometry("600x500")
self.root.configure(bg="#f0f0f0")
# 初始化计数器
self.generated_count = 0
self.failed_count = 0
# 初始化发布脚本路径
self.publish_script_path = None
# 初始化文章保存目录
self.save_directory = None
# 创建界面元素
self.create_widgets()
def create_widgets(self):
# 标题
title_label = ttk.Label(self.root, text="AI写作助手", font=("Helvetica", 24, "bold"), bootstyle="inverse-primary")
title_label.pack(pady=(20, 10))
# 关键词输入框
keyword_frame = ttk.Frame(self.root, bootstyle="light")
keyword_frame.pack(pady=5, fill=X, padx=20)
ttk.Label(keyword_frame, text="关键词:", font=("Helvetica", 12), bootstyle="inverse-light").pack(side=LEFT, padx=(0, 10))
self.keyword_entry = ttk.Entry(keyword_frame, width=50, font=("Helvetica", 12))
self.keyword_entry.pack(side=LEFT, fill=X, expand=True)
# 生成数量输入框
count_frame = ttk.Frame(self.root, bootstyle="light")
count_frame.pack(pady=5, fill=X, padx=20)
ttk.Label(count_frame, text="生成数量:", font=("Helvetica", 12), bootstyle="inverse-light").pack(side=LEFT, padx=(0, 10))
self.count_entry = ttk.Entry(count_frame, width=10, font=("Helvetica", 12))
self.count_entry.pack(side=LEFT)
# 文章字数输入框
word_count_frame = ttk.Frame(self.root, bootstyle="light")
word_count_frame.pack(pady=5, fill=X, padx=20)
ttk.Label(word_count_frame, text="建议字数:", font=("Helvetica", 12), bootstyle="inverse-light").pack(side=LEFT, padx=(0, 10))
self.word_count_entry = ttk.Entry(word_count_frame, width=10, font=("Helvetica", 12))
self.word_count_entry.pack(side=LEFT)
# 文章风格输入框
style_frame = ttk.Frame(self.root, bootstyle="light")
style_frame.pack(pady=5, fill=X, padx=20)
ttk.Label(style_frame, text="文章风格:", font=("Helvetica", 12), bootstyle="inverse-light").pack(side=LEFT, padx=(0, 10))
self.style_entry = ttk.Entry(style_frame, width=50, font=("Helvetica", 12))
self.style_entry.pack(side=LEFT, fill=X, expand=True)
# 文章保存目录输入框
save_dir_frame = ttk.Frame(self.root, bootstyle="light")
save_dir_frame.pack(pady=5, fill=X, padx=20)
ttk.Label(save_dir_frame, text="保存目录:", font=("Helvetica", 12), bootstyle="inverse-light").pack(side=LEFT, padx=(0, 10))
self.save_dir_entry = ttk.Entry(save_dir_frame, width=50, font=("Helvetica", 12))
self.save_dir_entry.pack(side=LEFT, fill=X, expand=True)
self.select_dir_button = ttk.Button(save_dir_frame, text="选择目录", bootstyle="outline-primary", command=self.select_save_directory)
self.select_dir_button.pack(side=LEFT, padx=(10, 0))
# 导入关键词按钮
self.import_button = ttk.Button(self.root, text="导入关键词", bootstyle="outline-primary", command=self.import_keywords)
self.import_button.pack(pady=10, padx=20, side=LEFT, fill=X, expand=True)
# 生成文章按钮
self.generate_button = ttk.Button(self.root, text="生成文章", bootstyle="outline-primary", command=self.start_generate_articles)
self.generate_button.pack(pady=10, padx=20, side=LEFT, fill=X, expand=True)
# 导入发布脚本按钮
self.import_publish_script_button = ttk.Button(self.root, text="导入发布脚本", bootstyle="outline-primary", command=self.import_publish_script)
self.import_publish_script_button.pack(pady=10, padx=20, side=LEFT, fill=X, expand=True)
# 进度条
self.progress = ttk.Progressbar(self.root, bootstyle="success", length=400, mode="determinate")
self.progress.pack(pady=10, padx=20, fill=X)
# 生成和失败计数器
counter_frame = ttk.Frame(self.root, bootstyle="light")
counter_frame.pack(pady=5, fill=X, padx=20)
self.generated_label = ttk.Label(counter_frame, text="生成文章数量: 0", font=("Helvetica", 12), bootstyle="inverse-light")
self.generated_label.pack(side=LEFT, padx=(0, 10))
self.failed_label = ttk.Label(counter_frame, text="失败数量: 0", font=("Helvetica", 12), bootstyle="inverse-light")
self.failed_label.pack(side=RIGHT)
# 状态标签
self.status_label = ttk.Label(self.root, text="", font=("Helvetica", 12), bootstyle="inverse-light")
self.status_label.pack(pady=10, padx=20, fill=X)
def import_keywords(self):
file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
if file_path:
with open(file_path, 'r', encoding='utf-8') as file:
keywords = file.read().splitlines()
self.keyword_entry.delete(0, tk.END)
self.keyword_entry.insert(0, ', '.join(keywords))
def import_publish_script(self):
script_path = filedialog.askopenfilename(filetypes=[("Python files", "*.py")])
if script_path:
self.publish_script_path = script_path
messagebox.showinfo("成功", f"发布脚本已导入: {script_path}")
def select_save_directory(self):
directory = filedialog.askdirectory()
if directory:
self.save_directory = directory
self.save_dir_entry.delete(0, tk.END)
self.save_dir_entry.insert(0, directory)
def start_generate_articles(self):
# 显示正在生成中的状态
self.status_label.config(text="正在生成中,请稍等...")
self.root.update_idletasks()
# 启动生成文章的线程
threading.Thread(target=self.generate_articles).start()
def generate_articles(self):
keywords = self.keyword_entry.get().split(',')
count = int(self.count_entry.get())
word_count = int(self.word_count_entry.get())
style = self.style_entry.get()
save_directory = self.save_directory
if not save_directory:
messagebox.showerror("错误", "请选择保存目录")
return
if not os.path.exists(save_directory):
os.makedirs(save_directory)
total_articles = len(keywords) * count
self.progress["maximum"] = total_articles
self.progress["value"] = 0
self.generated_count = 0
self.failed_count = 0
# 使用线程池来生成文章
threads = []
for keyword in keywords:
for _ in range(count):
thread = threading.Thread(target=self.generate_and_save_article, args=(keyword.strip(), word_count, style, save_directory))
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
# 显示生成完成的状态
self.status_label.config(text="已完成,请查收")
# 自动执行发布脚本
if self.publish_script_path:
self.execute_publish_script()
def generate_and_save_article(self, keyword, word_count, style, save_directory):
article = self.generate_article(keyword, word_count, style)
if article:
self.save_article(article, save_directory)
self.generated_count += 1
else:
self.failed_count += 1
self.progress["value"] += 1
self.update_counters()
self.root.update_idletasks()
def generate_article(self, keyword, word_count, style):
api_key = "此处替换为你的deepSeek API Key" # 替换为你的deepSeek API Key
base_url = "https://api.deepseek.com"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
data = {
"model": "deepseek-chat",
"messages": [
{"role": "system", "content": "你是文章创作大师,你擅长创作任何已知风格的文章,并且根据用户的要求,你会尝试不同风格,创作出有吸引力的文章。注意,正文第一行必须是标题,标题需要符合文章主题,标题下是正文。"},
{"role": "user", "content": f"请根据关键词'{keyword}'生成一篇{word_count}字左右的{style}风格的文章,关键词可根据你自己的理解扩充,文章的标题需要保持创新性,不要重复使用相同标题。"}
],
"temperature": 0.3
}
response = requests.post(f"{base_url}/chat/completions", headers=headers, json=data)
if response.status_code == 200:
return response.json()["choices"][0]["message"]["content"]
else:
messagebox.showerror("错误", f"API请求失败: {response.status_code}")
return None
def save_article(self, article, save_directory):
# 过滤黑名单词汇
filtered_article = self.filter_blacklisted_words(article)
# 将文本转换为HTML格式
html_content = self.convert_to_html(filtered_article)
# 提取标题并去除“标题:”字样
title = article.split('\n')[0].strip()
if title.startswith("标题:"):
title = title[4:].strip()
# 去除标题中的非法字符
title = self.clean_filename(title)
# 保存为HTML文件
with open(os.path.join(save_directory, f"{title}.html"), 'w', encoding='utf-8') as file:
file.write(html_content)
def convert_to_html(self, text):
# 将加粗、换行和分段格式转换为HTML
html_content = text.replace('**', '<strong>').replace('**', '</strong>')
html_content = html_content.replace('\n', '<br>')
html_content = html_content.replace('\n\n', '</p><p>')
# 去除内容中的 # 以及类似符号
html_content = re.sub(r'[#*]', '', html_content)
return f"<p>{html_content}</p>"
def filter_blacklisted_words(self, text):
# 黑名单词汇列表
blacklist = ["标题:", "敏感词2", "敏感词3"] # 请替换为实际的黑名单词汇
# 过滤黑名单词汇
for word in blacklist:
text = text.replace(word, "")
# 去除内容中的 # 以及类似符号
text = re.sub(r'[#*]', '', text)
return text
def clean_filename(self, filename):
# 去除文件名中的非法字符
illegal_chars = r'[<>:"/\\|?*#]'
cleaned_filename = re.sub(illegal_chars, '', filename)
return cleaned_filename
def update_counters(self):
self.generated_label.config(text=f"生成文章数量: {self.generated_count}")
self.failed_label.config(text=f"失败数量: {self.failed_count}")
def execute_publish_script(self):
try:
# 在 Windows 系统中,使用 subprocess.CREATE_NO_WINDOW 避免弹出命令行窗口
if os.name == 'nt': # 'nt' 是 Windows 的标识符
subprocess.run(["python", self.publish_script_path], creationflags=subprocess.CREATE_NO_WINDOW, check=True)
else:
subprocess.run(["python", self.publish_script_path], check=True)
messagebox.showinfo("成功", "发布脚本已成功执行")
except subprocess.CalledProcessError as e:
messagebox.showerror("错误", f"发布脚本执行失败: {e}")
if __name__ == "__main__":
root = ttk.Window(themename="cosmo")
app = AIWriterApp(root)
root.mainloop()
- 2024-11-24 Xiuno BBS 开发实践教程 - 单页
- 2024-12-03 www.baostock.com 一个免费、开源的证券数据平台
- 2024-11-18 通义代码模式:0代码一句话写程序
- 2024-12-11 「共振式」 Prompt
- 2024-11-02 【python】AI智能写作助手使用文档
- 2024-12-03 ChatGPT:你的专属A股量化金融工程师——手把手教你用Prompt驾驭AI大模型
- 2024-12-03 AKShare库获取股票实时数据
- 2024-12-03 Tushare库,能够公开获取的股票数据源
- 2024-12-03 基于三因子模型的A股人工智能概念股投资策略软件的开发过程
收藏列表 (0)
还没有人收藏过本帖~