吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1443|回复: 46
上一主题 下一主题
收起左侧

[Python 原创] 使用AI进行批量写作【初版】

[复制链接]
跳转到指定楼层
楼主
aifeisheng 发表于 2024-11-1 01:08 回帖奖励
AI写作助手是一个基于Python和tkinter库开发的图形用户界面应用程序,采用月之暗面api,用户通过输入关键词、生成数量、文章字数和风格,批量生成文章。后续加入批量发布。
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import filedialog, messagebox
import ttkbootstrap as ttk
from ttkbootstrap.constants import *
import requests
import os
import threading

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.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)

        # 导入关键词按钮
        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.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 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()

        if not os.path.exists("文章"):
            os.makedirs("文章")

        total_articles = len(keywords) * count
        self.progress["maximum"] = total_articles
        self.progress["value"] = 0
        self.generated_count = 0
        self.failed_count = 0

        for keyword in keywords:
            for _ in range(count):
                article = self.generate_article(keyword.strip(), word_count, style)
                if article:
                    self.save_article(article)
                    self.generated_count += 1
                else:
                    self.failed_count += 1
                self.progress["value"] += 1
                self.update_counters()
                self.root.update_idletasks()

        # 显示生成完成的状态
        self.status_label.config(text="已完成,请查收")

    def generate_article(self, keyword, word_count, style):
        api_key = "替换api"  # 替换为你的API Key
        base_url = "https://api.moonshot.cn/v1"

        headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }

        data = {
            "model": "moonshot-v1-8k",
            "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):
        title = article.split('\n')[0].strip()
        with open(f"文章/{title}.txt", 'w', encoding='utf-8') as file:
            file.write(article)

    def update_counters(self):
        self.generated_label.config(text=f"生成文章数量: {self.generated_count}")
        self.failed_label.config(text=f"失败数量: {self.failed_count}")

if __name__ == "__main__":
    root = ttk.Window(themename="cosmo")
    app = AIWriterApp(root)
    root.mainloop()

免费评分

参与人数 5吾爱币 +11 热心值 +4 收起 理由
BrutusScipio + 1 谢谢@Thanks!
xhsbd + 1 + 1 谢谢大佬@Thanks!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
lijie2love + 1 + 1 求成品软件
aabbcc123123 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
3DJIEKUN 发表于 2024-11-1 10:58
感觉不错的样子,好像有用
3#
不忘形影 发表于 2024-11-1 11:00
4#
坐久落花多 发表于 2024-11-1 11:26
5#
zhuofeng41 发表于 2024-11-1 11:37
看着不错
下载试用
6#
aiguohou 发表于 2024-11-1 11:42
看着不错,感谢分享
7#
鸳鸯双栖蝶双飞 发表于 2024-11-1 11:45
确实有用 哈哈哈 可以上班摸鱼的时候看自己写的小说,建议增加些剧情和角色设置的填写框
8#
5151diy 发表于 2024-11-1 12:17
感谢提供AI写作的源代码 ,谢谢您分享
9#
baisha1104 发表于 2024-11-1 15:53
看着很好,感谢分享
10#
xxq996524 发表于 2024-11-1 16:19
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表