如何实现AI生成文章并自动发布到自媒体平台的软件

作者:魔道寒武纪     信息来源:互联网     发布时间:2025-12-11     点击数:1    

要实现“AI生成文章+自动发布到B站专栏/今日头条”的软件,核心分为4个关键环节:AI生成文章、B站专栏发布接口对接、今日头条发布接口对接、可视化界面开发。以下是详细的实现步骤、技术选型和核心代码示例,兼顾新手友好性和可落地性。

一、整体技术方案选型

环节

推荐技术/工具

优势

AI文章生成

讯飞星火API/OpenAI API/百度文心一言API

接口成熟、文档完善,支持自定义生成规则

平台发布接口

B站专栏API、今日头条开放平台API

官方认证,稳定无封号风险

可视化界面

Python + PyQt6/Tkinter

开发快、跨平台,适合桌面端

核心编程语言

Python

第三方库丰富,接口调用成本低

环境依赖管理

pip + 虚拟环境

避免依赖冲突

二、前置准备(必做)

1. 申请各平台API密钥

  • AI生成API

  • 以讯飞星火为例(国内访问稳定):

  • ① 注册讯飞开放平台 → 创应用 → 获取APPID、APISecret、APIKey。

  • B站专栏发布API

  • ① 注册B站开发者平台 → 创建应用 → 申请“专栏发布”权限 → 获取Client ID、Client Secret → 完成OAuth2授权(需获取用户access_token)。

  • 今日头条发布API

  • ① 注册今日头条开放平台 → 申请“图文发布”接口权限 → 获取AppKey、AppSecret、Access Token。

2. 开发环境搭建

# 安装核心依赖
pip install requests  # 调用API
pip install pyqt6     # 可视化界面
pip install python-dotenv  # 管理密钥(避免硬编码)

三、核心功能实现(分步代码)

步骤1:AI生成文章(以讯飞星火为例)

import requests
import time
import hashlib
import hmac
import json
from dotenv import load_dotenv
import os
# 加载.env文件中的密钥(新建.env文件,存储APPID、APISecret、APIKey)
load_dotenv()
APPID = os.getenv("XUNFEI_APPID")
APISecret = os.getenv("XUNFEI_APISecret")
APIKey = os.getenv("XUNFEI_APIKey")
def generate_article_by_title(title):
    """根据标题调用讯飞星火API生成文章"""
    # 1. 构造请求头(讯飞星火API要求的签名逻辑)
    cur_time = str(int(time.time()))
    sign_str = f"host: spark-api.xf-yun.com\ndate: {cur_time}\nGET /v1.1/chat HTTP/1.1"
    signature = hmac.new(APISecret.encode(utf-8), sign_str.encode(utf-8), hashlib.sha256).digest()
    signature_b64 = signature.hex()
    headers = {
        "Content-Type": "application/json",
        "X-Date": cur_time,
        "Authorization": fapi_key="{APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_b64}",
        "Host": "spark-api.xf-yun.com"
    }
    # 2. 构造生成文章的提示词
    prompt = f"""请以标题《{title}》为核心,生成一篇1000字左右的原创文章,要求:
    1. 结构清晰,有开头、正文、结尾;
    2. 语言流畅,符合自媒体平台风格;
    3. 无错别字,无敏感内容。"""
    # 3. 调用API
    url = "https://spark-api.xf-yun.com/v1.1/chat"
    data = {
        "header": {"app_id": APPID, "uid": "123456"},
        "parameter": {"chat": {"domain": "general", "temperature": 0.7, "max_tokens": 2000}},
        "payload": {"message": {"text": [{"role": "user", "content": prompt}]}}
    }
    try:
        response = requests.post(url, headers=headers, json=data, timeout=30)
        response.raise_for_status()
        result = response.json()
        # 提取生成的文章内容
        article = result["payload"]["choices"]["text"][0]["content"]
        return article.strip()
    except Exception as e:
        print(f"AI生成文章失败:{e}")
        return None
# 测试:生成文章
if __name__ == "__main__":
    title = "如何高效学习Python编程"
    article = generate_article_by_title(title)
    if article:
        print("生成的文章:\n", article)

步骤2:发布到B站专栏

B站专栏发布需先通过OAuth2获取access_token,再调用专栏发布接口:

def publish_to_bilibili(title, content, access_token):
    """发布文章到B站专栏"""
    url = "https://api.bilibili.com/x/article/edit"
    headers = {"Content-Type": "application/json"}
    data = {
        "access_token": access_token,
        "title": title,
        "content": content,
        "category_id": 129,  # 专栏分类ID(129=科技,可根据需求调整)
        "copyright": 1,       # 1=原创,2=转载
        "status": 0           # 0=发布,1=草稿
    }
    try:
        response = requests.post(url, headers=headers, json=data, timeout=30)
        result = response.json()
        if result.get("code") == 0:
            print(f"B站专栏发布成功!文章ID:{result[dataaid}")
            return True
        else:
            print(f"B站发布失败:{result[message}")
            return False
    except Exception as e:
        print(f"B站发布异常:{e}")
        return False

步骤3:发布到今日头条

今日头条图文发布需调用“发布文章”接口(需先完成账号授权):

def publish_to_toutiao(title, content, access_token, app_key, app_secret):
    """发布文章到今日头条"""
    # 1. 构造签名(今日头条API要求)
    import urllib.parse
    timestamp = str(int(time.time()))
    params = {
        "access_token": access_token,
        "app_key": app_key,
        "title": title,
        "content": content,
        "timestamp": timestamp,
        "type": "article"  # 发布类型:article=图文
    }
    # 排序并拼接参数
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    sign_str = "".join([f"{k}{v}" for k, v in sorted_params]) + app_secret
    sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
    params["sign"] = sign
    # 2. 调用发布接口
    url = "https://api.toutiao.com/article/publish/"
    try:
        response = requests.post(url, data=params, timeout=30)
        result = response.json()
        if result.get("errno") == 0:
            print(f"今日头条发布成功!文章ID:{result[dataarticle_id}")
            return True
        else:
            print(f"今日头条发布失败:{result[errmsg}")
            return False
    except Exception as e:
        print(f"今日头条发布异常:{e}")
        return False

步骤4:可视化界面(PyQt6)

from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, 
                             QTextEdit, QPushButton, QVBoxLayout, QMessageBox)
import sys
class ArticlePublisher(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
    def init_ui(self):
        # 设置窗口
        self.setWindowTitle("AI文章生成与发布工具")
        self.setGeometry(100, 100, 800, 600)
        # 控件
        self.title_label = QLabel("文章标题:")
        self.title_input = QLineEdit()
        self.article_label = QLabel("生成的文章:")
        self.article_text = QTextEdit()
        self.generate_btn = QPushButton("AI生成文章")
        self.publish_bilibili_btn = QPushButton("发布到B站专栏")
        self.publish_toutiao_btn = QPushButton("发布到今日头条")
        # 布局
        layout = QVBoxLayout()
        layout.addWidget(self.title_label)
        layout.addWidget(self.title_input)
        layout.addWidget(self.generate_btn)
        layout.addWidget(self.article_label)
        layout.addWidget(self.article_text)
        layout.addWidget(self.publish_bilibili_btn)
        layout.addWidget(self.publish_toutiao_btn)
        self.setLayout(layout)
        # 绑定事件
        self.generate_btn.clicked.connect(self.generate_article)
        self.publish_bilibili_btn.clicked.connect(self.publish_bilibili)
        self.publish_toutiao_btn.clicked.connect(self.publish_toutiao)
    def generate_article(self):
        """生成文章按钮点击事件"""
        title = self.title_input.text().strip()
        if not title:
            QMessageBox.warning(self, "提示", "请输入文章标题!")
            return
        # 调用AI生成文章
        article = generate_article_by_title(title)
        if article:
            self.article_text.setText(article)
            QMessageBox.information(self, "成功", "文章生成完成!")
        else:
            QMessageBox.critical(self, "失败", "文章生成失败,请检查API配置!")
    def publish_bilibili(self):
        """发布B站按钮点击事件"""
        title = self.title_input.text().strip()
        content = self.article_text.toPlainText().strip()
        if not title or not content:
            QMessageBox.warning(self, "提示", "标题或文章内容不能为空!")
            return
        # 替换为你的B站access_token
        access_token = os.getenv("BILIBILI_ACCESS_TOKEN")
        success = publish_to_bilibili(title, content, access_token)
        if success:
            QMessageBox.information(self, "成功", "发布到B站专栏成功!")
        else:
            QMessageBox.critical(self, "失败", "发布到B站专栏失败!")
    def publish_toutiao(self):
        """发布今日头条按钮点击事件"""
        title = self.title_input.text().strip()
        content = self.article_text.toPlainText().strip()
        if not title or not content:
            QMessageBox.warning(self, "提示", "标题或文章内容不能为空!")
            return
        # 替换为你的今日头条密钥
        access_token = os.getenv("TOUTIAO_ACCESS_TOKEN")
        app_key = os.getenv("TOUTIAO_APP_KEY")
        app_secret = os.getenv("TOUTIAO_APP_SECRET")
        success = publish_to_toutiao(title, content, access_token, app_key, app_secret)
        if success:
            QMessageBox.information(self, "成功", "发布到今日头条成功!")
        else:
            QMessageBox.critical(self, "失败", "发布到今日头条失败!")
# 运行界面
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = ArticlePublisher()
    window.show()
    sys.exit(app.exec())

四、关键注意事项

  1. 密钥安全

  • 不要将API密钥硬编码到代码中,使用.env文件存储(新建.env文件,内容示例):

   XUNFEI_APPID=你的讯飞APPID
   XUNFEI_APISecret=你的讯飞APISecret
   XUNFEI_APIKey=你的讯飞APIKey
   BILIBILI_ACCESS_TOKEN=你的B站access_token
   TOUTIAO_ACCESS_TOKEN=你的今日头条access_token
   TOUTIAO_APP_KEY=你的今日头条AppKey
   TOUTIAO_APP_SECRET=你的今日头条AppSecret
   

  1. 平台接口限制

  • B站:access_token有有效期(约30天),需定期刷新;专栏发布有频率限制(避免短时间大量发布)。今日头条:新账号可能无接口权限,需完成实名认证和粉丝量要求;文章需符合平台规范(避免敏感词)。

  1. AI生成优化

  • 可调整提示词(Prompt)优化文章质量,例如指定风格(搞笑/干货)、受众(新手/进阶)、排版(分段、加小标题)。

  1. 异常处理

  • 实际使用中需增加更多异常捕获(如网络超时、API返回格式异常、平台审核失败等)。

五、打包成桌面软件

如果需要将代码打包为.exe(Windows)或.app(Mac),使用pyinstaller:

# 安装pyinstaller
pip install pyinstaller
# 打包(--onefile 单文件,--windowed 无控制台)
pyinstaller --onefile --windowed --name 文章发布工具 main.py

总结

整个流程的核心是“API调用+界面封装”:先通过AI API生成文章,再调用各平台发布API完成自动发布。新手可先实现AI生成和单个平台发布,再逐步完善可视化和多平台适配。如果对API调用不熟悉,可先参考各平台官方文档(B站开放平台、今日头条开放平台)的示例代码,确保接口调用格式正确。