要实现“AI生成文章+自动发布到B站专栏/今日头条”的软件,核心分为4个关键环节:AI生成文章、B站专栏发布接口对接、今日头条发布接口对接、可视化界面开发。以下是详细的实现步骤、技术选型和核心代码示例,兼顾新手友好性和可落地性。
环节 | 推荐技术/工具 | 优势 |
AI文章生成 | 讯飞星火API/OpenAI API/百度文心一言API | 接口成熟、文档完善,支持自定义生成规则 |
平台发布接口 | B站专栏API、今日头条开放平台API | 官方认证,稳定无封号风险 |
可视化界面 | Python + PyQt6/Tkinter | 开发快、跨平台,适合桌面端 |
核心编程语言 | Python | 第三方库丰富,接口调用成本低 |
环境依赖管理 | pip + 虚拟环境 | 避免依赖冲突 |
AI生成API:
以讯飞星火为例(国内访问稳定):
① 注册讯飞开放平台 → 创应用 → 获取APPID、APISecret、APIKey。
B站专栏发布API:
① 注册B站开发者平台 → 创建应用 → 申请“专栏发布”权限 → 获取Client ID、Client Secret → 完成OAuth2授权(需获取用户access_token)。
今日头条发布API:
① 注册今日头条开放平台 → 申请“图文发布”接口权限 → 获取AppKey、AppSecret、Access Token。
# 安装核心依赖
pip install requests # 调用API
pip install pyqt6 # 可视化界面
pip install python-dotenv # 管理密钥(避免硬编码)
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)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今日头条图文发布需调用“发布文章”接口(需先完成账号授权):
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 Falsefrom 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())密钥安全:
不要将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
平台接口限制:
B站:access_token有有效期(约30天),需定期刷新;专栏发布有频率限制(避免短时间大量发布)。今日头条:新账号可能无接口权限,需完成实名认证和粉丝量要求;文章需符合平台规范(避免敏感词)。
AI生成优化:
可调整提示词(Prompt)优化文章质量,例如指定风格(搞笑/干货)、受众(新手/进阶)、排版(分段、加小标题)。
异常处理:
实际使用中需增加更多异常捕获(如网络超时、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站开放平台、今日头条开放平台)的示例代码,确保接口调用格式正确。