抖音原创文章自动生成与WordPress集成方案API调用和AI模型部署
- Linkreate AI插件 文章
- 2025-09-01 05:42:10
- 18阅读
抖音原创内容自动生成API接入准备
在实现抖音原创文章自动生成与WordPress集成之前,你需要准备必要的API接入环境。抖音开放平台提供了内容创作相关的API接口,允许开发者通过程序化方式生成和管理内容。
首先,注册抖音开放平台账号并创建应用,获取AppKey和AppSecret。这些凭证将用于后续的API调用认证。在应用管理后台,确保已申请"内容创作"相关的权限,包括自动发布、内容生成等接口权限。
// 抖音API认证配置
const douyinConfig = {
appKey: '你的AppKey',
appSecret: '你的AppSecret',
accessToken: '', // 将通过下面代码获取
refreshToken: ''
};
// 获取访问令牌
async function getAccessToken() {
const url = 'https://open.douyin.com/oauth/access_token/';
const params = {
client_key: douyinConfig.appKey,
client_secret: douyinConfig.appSecret,
grant_type: 'client_credential'
};
try {
const response = await fetch(url + '?' + new URLSearchParams(params));
const data = await response.json();
if (data.access_token) {
douyinConfig.accessToken = data.access_token;
douyinConfig.refreshToken = data.refresh_token;
return data.access_token;
} else {
throw new Error('获取访问令牌失败: ' + data.message);
}
} catch (error) {
console.error('API请求错误:', error);
return null;
}
}
WordPress环境配置与插件开发
在WordPress端实现抖音原创文章自动生成功能,需要开发一个自定义插件。这个插件将负责处理API调用、内容生成和发布流程。
首先,在WordPress的wp-content/plugins目录下创建一个新的插件文件夹,例如"douyin-auto-poster"。在该文件夹中创建主插件文件douyin-auto-poster.php。
prefix . 'douyin_generated_posts';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id mediumint(9) NOT NULL,
douyin_post_id varchar(255) NOT NULL,
generated_content text NOT NULL,
generated_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
status varchar(20) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 添加默认选项
add_option('douyin_auto_poster_app_key', '');
add_option('douyin_auto_poster_app_secret', '');
add_option('douyin_auto_poster_access_token', '');
add_option('douyin_auto_poster_ai_model', 'gpt-3.5-turbo');
add_option('douyin_auto_poster_post_frequency', 'daily');
}
// 注册管理菜单
add_action('admin_menu', 'douyin_auto_poster_admin_menu');
function douyin_auto_poster_admin_menu() {
add_menu_page(
'抖音原创文章自动生成器',
'抖音自动生成',
'manage_options',
'douyin-auto-poster',
'douyin_auto_poster_admin_page',
'dashicons-edit-page'
);
}
// 管理页面内容
function douyin_auto_poster_admin_page() {
// 检查用户权限
if (!current_user_can('manage_options')) {
return;
}
// 保存设置
if (isset($_POST['submit'])) {
update_option('douyin_auto_poster_app_key', sanitize_text_field($_POST['app_key']));
update_option('douyin_auto_poster_app_secret', sanitize_text_field($_POST['app_secret']));
update_option('douyin_auto_poster_ai_model', sanitize_text_field($_POST['ai_model']));
update_option('douyin_auto_poster_post_frequency', sanitize_text_field($_POST['post_frequency']));
echo '设置已保存!
';
}
// 获取当前设置
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
$ai_model = get_option('douyin_auto_poster_ai_model', 'gpt-3.5-turbo');
$post_frequency = get_option('douyin_auto_poster_post_frequency', 'daily');
// 显示管理页面
?>
抖音原创文章自动生成器设置
抖音App Key
<input type="text" name="app_key" value="" class="regular-text" />
抖音App Secret
<input type="password" name="app_secret" value="" class="regular-text" />
AI模型选择
<option value="gpt-3.5-turbo" >GPT-3.5 Turbo
<option value="gpt-4" >GPT-4
<option value="claude-2" >Claude 2
<option value="gemini-pro" >Gemini Pro
发布频率
<option value="daily" >每日
<option value="weekly" >每周
<option value="monthly" >每月
<?php
}
AI模型部署与内容生成实现
实现抖音原创文章自动生成的核心是AI模型的部署与调用。我们将使用OpenAI的API作为示例,但你可以根据需要替换为其他AI模型提供商。
首先,在插件中创建一个处理AI内容生成的类:
class Douyin_AIGenerator {
private $api_key;
private $model;
public function __construct($api_key, $model = 'gpt-3.5-turbo') {
$this->api_key = $api_key;
$this->model = $model;
}
/
生成抖音原创内容
@param string $topic 内容主题
@param string $style 内容风格
@param int $max_tokens 最大令牌数
@return string|false 生成的内容或失败时返回false
/
public function generate_content($topic, $style = 'informative', $max_tokens = 1000) {
$prompt = $this->build_prompt($topic, $style);
$response = $this->call_openai_api($prompt, $max_tokens);
if ($response && isset($response['choices'][0]['text'])) {
return $response['choices'][0]['text'];
}
return false;
}
/
构建AI提示词
@param string $topic 内容主题
@param string $style 内容风格
@return string 完整的提示词
/
private function build_prompt($topic, $style) {
$style_descriptions = [
'informative' => '信息丰富、教育性强',
'entertaining' => '幽默风趣、娱乐性强',
'inspirational' => '励志向上、鼓舞人心',
'storytelling' => '故事性强、引人入胜'
];
$style_desc = isset($style_descriptions[$style]) ? $style_descriptions[$style] : $style_descriptions['informative'];
return "请为抖音平台创作一篇原创文章,主题是:{$topic}。要求内容{$style_desc},适合短视频平台阅读,段落简短,语言生动有趣,能够吸引目标受众。文章应该包含引人注目的开头、有价值的内容主体和有力的结尾。";
}
/
调用OpenAI API
@param string $prompt 提示词
@param int $max_tokens 最大令牌数
@return array|false API响应或失败时返回false
/
private function call_openai_api($prompt, $max_tokens) {
$api_url = 'https://api.openai.com/v1/completions';
$headers = [
'Content-Type: application/json',
'Authorization: Bearer ' . $this->api_key
];
$data = [
'model' => $this->model,
'prompt' => $prompt,
'max_tokens' => $max_tokens,
'temperature' => 0.7,
'top_p' => 1.0,
'frequency_penalty' => 0.1,
'presence_penalty' => 0.1
];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
return json_decode($response, true);
} else {
error_log('OpenAI API请求失败: HTTP ' . $http_code . ' - ' . $response);
return false;
}
}
}
抖音内容发布与WordPress文章集成
接下来,我们需要实现将AI生成的内容发布到抖音,并同步到WordPress网站的功能。这包括处理内容格式化、发布流程和状态跟踪。
class Douyin_Publisher {
private $app_key;
private $app_secret;
private $access_token;
public function __construct($app_key, $app_secret, $access_token = '') {
$this->app_key = $app_key;
$this->app_secret = $app_secret;
$this->access_token = $access_token;
}
/
获取访问令牌
@return string|false 访问令牌或失败时返回false
/
public function get_access_token() {
if (!empty($this->access_token)) {
return $this->access_token;
}
$url = 'https://open.douyin.com/oauth/access_token/';
$params = [
'client_key' => $this->app_key,
'client_secret' => $this->app_secret,
'grant_type' => 'client_credential'
];
$response = $this->make_request($url . '?' . http_build_query($params));
if ($response && isset($response['access_token'])) {
$this->access_token = $response['access_token'];
return $this->access_token;
}
return false;
}
/
发布内容到抖音
@param string $content 内容文本
@param array $media 媒体文件URL数组
@return array|false 发布结果或失败时返回false
/
public function publish_content($content, $media = []) {
$access_token = $this->get_access_token();
if (!$access_token) {
return false;
}
$url = 'https://open.douyin.com/video/create/';
$data = [
'access_token' => $access_token,
'text' => $content
];
// 如果有媒体文件,先上传
if (!empty($media)) {
$media_ids = [];
foreach ($media as $media_url) {
$media_id = $this->upload_media($media_url);
if ($media_id) {
$media_ids[] = $media_id;
}
}
if (!empty($media_ids)) {
$data['media_ids'] = implode(',', $media_ids);
}
}
return $this->make_request($url, 'POST', $data);
}
/
上传媒体文件
@param string $media_url 媒体文件URL
@return string|false 媒体ID或失败时返回false
/
private function upload_media($media_url) {
$access_token = $this->get_access_token();
if (!$access_token) {
return false;
}
$url = 'https://open.douyin.com/media/upload/';
// 下载媒体文件
$media_data = file_get_contents($media_url);
if (!$media_data) {
return false;
}
// 准备上传文件
$boundary = uniqid();
$delimiter = '-------------' . $boundary;
$post_data = '--' . $delimiter . "rn";
$post_data .= 'Content-Disposition: form-data; name="access_token"' . "rnrn";
$post_data .= $access_token . "rn";
$post_data .= '--' . $delimiter . "rn";
$post_data .= 'Content-Disposition: form-data; name="media"; filename="' . basename($media_url) . '"' . "rn";
$post_data .= 'Content-Type: application/octet-stream' . "rnrn";
$post_data .= $media_data . "rn";
$post_data .= '--' . $delimiter . '--' . "rn";
$headers = [
'Content-Type: multipart/form-data; boundary=' . $delimiter,
'Content-Length: ' . strlen($post_data)
];
$response = $this->make_request($url, 'POST', $post_data, $headers);
if ($response && isset($response['media_id'])) {
return $response['media_id'];
}
return false;
}
/
发起HTTP请求
@param string $url 请求URL
@param string $method 请求方法
@param array|string $data 请求数据
@param array $headers 请求头
@return array|false 响应数据或失败时返回false
/
private function make_request($url, $method = 'GET', $data = [], $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if (is_array($data)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($http_code == 200) {
return json_decode($response, true);
} else {
error_log('抖音API请求失败: HTTP ' . $http_code . ' - ' . $response);
return false;
}
}
}
// 将生成的内容发布到WordPress并同步到抖音
function douyin_auto_generate_and_publish() {
// 获取设置
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
$ai_model = get_option('douyin_auto_poster_ai_model', 'gpt-3.5-turbo');
$openai_api_key = get_option('douyin_auto_poster_openai_api_key', '');
if (empty($app_key) || empty($app_secret) || empty($openai_api_key)) {
return;
}
// 初始化AI生成器和抖音发布器
$ai_generator = new Douyin_AIGenerator($openai_api_key, $ai_model);
$douyin_publisher = new Douyin_Publisher($app_key, $app_secret);
// 定义内容主题和风格(可以从数据库或用户输入获取)
$topics = [
['topic' => '健康生活方式', 'style' => 'informative'],
['topic' => '美食制作技巧', 'style' => 'entertaining'],
['topic' => '旅行见闻分享', 'style' => 'storytelling'],
['topic' => '职场成长建议', 'style' => 'inspirational']
];
// 随机选择一个主题
$selected_topic = $topics[array_rand($topics)];
// 生成内容
$content = $ai_generator->generate_content($selected_topic['topic'], $selected_topic['style']);
if (!$content) {
error_log('AI内容生成失败');
return;
}
// 创建WordPress文章
$post_data = [
'post_title' => $selected_topic['topic'] . ' - 抖音原创',
'post_content' => $content,
'post_status' => 'publish',
'post_author' => 1,
'post_category' => [get_option('default_category')]
];
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
error_log('WordPress文章创建失败: ' . $post_id->get_error_message());
return;
}
// 发布到抖音
$douyin_result = $douyin_publisher->publish_content($content);
if ($douyin_result && isset($douyin_result['item_id'])) {
// 保存发布记录到数据库
global $wpdb;
$table_name = $wpdb->prefix . 'douyin_generated_posts';
$wpdb->insert(
$table_name,
[
'post_id' => $post_id,
'douyin_post_id' => $douyin_result['item_id'],
'generated_content' => $content,
'generated_date' => current_time('mysql'),
'status' => 'published'
],
['%d', '%s', '%s', '%s', '%s']
);
} else {
error_log('抖音内容发布失败');
}
}
// 添加定时任务
add_action('wp', 'douyin_auto_poster_schedule');
function douyin_auto_poster_schedule() {
if (!wp_next_scheduled('douyin_auto_generate_and_publish_event')) {
$frequency = get_option('douyin_auto_poster_post_frequency', 'daily');
switch ($frequency) {
case 'daily':
$interval = 24 60 60;
break;
case 'weekly':
$interval = 7 24 60 60;
break;
case 'monthly':
$interval = 30 24 60 60;
break;
default:
$interval = 24 60 60;
}
wp_schedule_event(time(), $interval, 'douyin_auto_generate_and_publish_event');
}
}
// 添加定时任务动作
add_action('douyin_auto_generate_and_publish_event', 'douyin_auto_generate_and_publish');
API调用优化与错误处理机制
在实现抖音原创文章自动生成与WordPress集成的过程中,API调用的稳定性和错误处理至关重要。以下是一些优化策略和错误处理机制:
class Douyin_API_Handler {
private $app_key;
private $app_secret;
private $access_token;
private $last_error;
private $retry_attempts = 3;
private $timeout = 30;
public function __construct($app_key, $app_secret) {
$this->app_key = $app_key;
$this->app_secret = $app_secret;
}
/
获取最后的错误信息
@return string 错误信息
/
public function get_last_error() {
return $this->last_error;
}
/
设置重试次数
@param int $attempts 重试次数
/
public function set_retry_attempts($attempts) {
$this->retry_attempts = max(1, intval($attempts));
}
/
设置超时时间
@param int $timeout 超时时间(秒)
/
public function set_timeout($timeout) {
$this->timeout = max(5, intval($timeout));
}
/
带重试机制的API请求
@param string $url 请求URL
@param string $method 请求方法
@param array|string $data 请求数据
@param array $headers 请求头
@return array|false 响应数据或失败时返回false
/
public function api_request_with_retry($url, $method = 'GET', $data = [], $headers = []) {
$attempt = 0;
$last_response = null;
$last_http_code = null;
while ($attempt retry_attempts) {
$attempt++;
$response = $this->make_api_request($url, $method, $data, $headers);
if ($response !== false) {
return $response;
}
// 如果是最后一次尝试,记录错误
if ($attempt >= $this->retry_attempts) {
error_log("抖音API请求失败,已尝试{$attempt}次。URL: {$url}");
break;
}
// 指数退避策略
$sleep_time = pow(2, $attempt) 100000; // 微秒
usleep($sleep_time);
}
return false;
}
/
发起API请求
@param string $url 请求URL
@param string $method 请求方法
@param array|string $data 请求数据
@param array $headers 请求头
@return array|false 响应数据或失败时返回false
/
private function make_api_request($url, $method = 'GET', $data = [], $headers = []) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
if (is_array($data)) {
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
} else {
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
}
}
if (!empty($headers)) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_error = curl_error($ch);
curl_close($ch);
if ($curl_error) {
$this->last_error = "cURL错误: {$curl_error}";
error_log($this->last_error);
return false;
}
// 处理HTTP状态码
if ($http_code >= 200 && $http_code last_error = "JSON解析错误: " . json_last_error_msg();
error_log($this->last_error);
return false;
}
} else {
$this->last_error = "HTTP错误: {$http_code} - {$response}";
error_log($this->last_error);
// 处理特定的错误代码
if ($http_code === 401) {
// 访问令牌可能已过期,尝试刷新
$this->refresh_access_token();
} elseif ($http_code === 429) {
// 请求过于频繁,等待更长时间
sleep(5);
}
return false;
}
}
/
刷新访问令牌
@return string|false 新的访问令牌或失败时返回false
/
private function refresh_access_token() {
$url = 'https://open.douyin.com/oauth/access_token/';
$params = [
'client_key' => $this->app_key,
'client_secret' => $this->app_secret,
'grant_type' => 'client_credential'
];
$response = $this->make_api_request($url . '?' . http_build_query($params));
if ($response && isset($response['access_token'])) {
$this->access_token = $response['access_token'];
// 更新数据库中的访问令牌
update_option('douyin_auto_poster_access_token', $this->access_token);
return $this->access_token;
}
return false;
}
/
获取访问令牌
@return string|false 访问令牌或失败时返回false
/
public function get_access_token() {
if (!empty($this->access_token)) {
return $this->access_token;
}
// 尝试从数据库获取
$saved_token = get_option('douyin_auto_poster_access_token', '');
if (!empty($saved_token)) {
$this->access_token = $saved_token;
return $this->access_token;
}
// 如果没有保存的令牌,则获取新的
return $this->refresh_access_token();
}
}
// 使用示例
function douyin_api_handler_example() {
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
if (empty($app_key) || empty($app_secret)) {
return;
}
$api_handler = new Douyin_API_Handler($app_key, $app_secret);
// 设置重试次数和超时时间
$api_handler->set_retry_attempts(3);
$api_handler->set_timeout(30);
// 获取访问令牌
$access_token = $api_handler->get_access_token();
if (!$access_token) {
error_log('获取访问令牌失败: ' . $api_handler->get_last_error());
return;
}
// 使用API
$url = 'https://open.douyin.com/video/list/?access_token=' . $access_token;
$response = $api_handler->api_request_with_retry($url);
if ($response) {
// 处理响应
// ...
} else {
error_log('API请求失败: ' . $api_handler->get_last_error());
}
}
性能优化与缓存策略
为了提高抖音原创文章自动生成与WordPress集成的性能,我们需要实施有效的缓存策略和性能优化措施。
class Douyin_Cache_Manager {
private $cache_group = 'douyin_auto_poster';
private $default_expiration = 3600; // 1小时
/
获取缓存数据
@param string $key 缓存键
@param callable $callback 如果缓存不存在,则调用此函数获取数据
@param int $expiration 缓存过期时间(秒)
@return mixed 缓存数据
/
public function get_cached_data($key, $callback, $expiration = null) {
if ($expiration === null) {
$expiration = $this->default_expiration;
}
$cached_data = wp_cache_get($key, $this->cache_group);
if (false === $cached_data) {
$cached_data = call_user_func($callback);
wp_cache_set($key, $cached_data, $this->cache_group, $expiration);
}
return $cached_data;
}
/
删除缓存
@param string $key 缓存键
@return bool 是否成功删除
/
public function delete_cache($key) {
return wp_cache_delete($key, $this->cache_group);
}
/
清空所有缓存
@return bool 是否成功清空
/
public function clear_all_cache() {
return wp_cache_flush();
}
}
// 性能优化的AI内容生成器
class Optimized_Douyin_AIGenerator extends Douyin_AIGenerator {
private $cache_manager;
private $request_log = [];
private $max_requests_per_minute = 20;
private $request_count = 0;
private $request_reset_time = 0;
public function __construct($api_key, $model = 'gpt-3.5-turbo') {
parent::__construct($api_key, $model);
$this->cache_manager = new Douyin_Cache_Manager();
}
/
生成内容(带缓存和速率限制)
@param string $topic 内容主题
@param string $style 内容风格
@param int $max_tokens 最大令牌数
@return string|false 生成的内容或失败时返回false
/
public function generate_content($topic, $style = 'informative', $max_tokens = 1000) {
// 检查速率限制
if (!$this->check_rate_limit()) {
error_log('AI请求速率限制已达到');
return false;
}
// 创建缓存键
$cache_key = md5("ai_content_{$topic}_{$style}_{$max_tokens}");
// 尝试从缓存获取
return $this->cache_manager->get_cached_data(
$cache_key,
function() use ($topic, $style, $max_tokens) {
// 记录请求
$this->log_request();
// 调用父类方法生成内容
return parent::generate_content($topic, $style, $max_tokens);
},
24 60 60 // 缓存24小时
);
}
/
检查速率限制
@return bool 是否允许请求
/
private function check_rate_limit() {
$current_time = time();
// 如果重置时间已过,重置计数器
if ($current_time > $this->request_reset_time) {
$this->request_count = 0;
$this->request_reset_time = $current_time + 60; // 1分钟后重置
}
// 检查是否超过限制
if ($this->request_count >= $this->max_requests_per_minute) {
return false;
}
return true;
}
/
记录请求
/
private function log_request() {
$this->request_count++;
$this->request_log[] = [
'time' => time(),
'count' => $this->request_count
];
// 保持日志大小合理
if (count($this->request_log) > 100) {
array_shift($this->request_log);
}
}
/
批量生成内容
@param array $topics 主题数组
@param string $style 内容风格
@param int $max_tokens 最大令牌数
@return array 生成的内容数组
/
public function batch_generate_content($topics, $style = 'informative', $max_tokens = 1000) {
$results = [];
foreach ($topics as $topic) {
$content = $this->generate_content($topic, $style, $max_tokens);
if ($content !== false) {
$results[$topic] = $content;
}
// 添加延迟以避免触发速率限制
sleep(1);
}
return $results;
}
}
// 异步任务处理器
class Douyin_Async_Task_Handler {
private $task_queue = [];
private $lock_file;
public function __construct() {
$upload_dir = wp_upload_dir();
$this->lock_file = $upload_dir['basedir'] . '/douyin_async_task.lock';
}
/
添加异步任务
@param string $task_name 任务名称
@param array $task_data 任务数据
@return bool 是否成功添加
/
public function add_task($task_name, $task_data = []) {
$this->task_queue[] = [
'name' => $task_name,
'data' => $task_data,
'created_at' => time(),
'status' => 'pending'
];
// 保存任务队列
$this->save_task_queue();
// 触发异步处理
$this->trigger_async_processing();
return true;
}
/
保存任务队列
/
private function save_task_queue() {
update_option('douyin_async_task_queue', $this->task_queue);
}
/
加载任务队列
/
private function load_task_queue() {
$this->task_queue = get_option('douyin_async_task_queue', []);
}
/
触发异步处理
/
private function trigger_async_processing() {
// 检查是否已经有处理进程在运行
if ($this->is_processing_locked()) {
return;
}
// 创建锁文件
$this->create_processing_lock();
// 使用WordPress cron触发异步处理
if (!wp_next_scheduled('douyin_process_async_tasks')) {
wp_schedule_single_event(time() + 60, 'douyin_process_async_tasks');
}
}
/
检查是否有处理锁
@return bool 是否有锁
/
private function is_processing_locked() {
if (!file_exists($this->lock_file)) {
return false;
}
$lock_time = file_get_contents($this->lock_file);
// 如果锁超过30分钟,视为过期
if (time() - intval($lock_time) > 30 60) {
@unlink($this->lock_file);
return false;
}
return true;
}
/
创建处理锁
/
private function create_processing_lock() {
file_put_contents($this->lock_file, time());
}
/
释放处理锁
/
private function release_processing_lock() {
if (file_exists($this->lock_file)) {
@unlink($this->lock_file);
}
}
/
处理任务队列
/
public function process_tasks() {
// 检查处理锁
if (!$this->is_processing_locked()) {
return;
}
// 加载任务队列
$this->load_task_queue();
if (empty($this->task_queue)) {
$this->release_processing_lock();
return;
}
// 处理任务
foreach ($this->task_queue as $key => $task) {
if ($task['status'] === 'pending') {
$this->task_queue[$key]['status'] = 'processing';
$this->save_task_queue();
try {
// 执行任务
$this->execute_task($task);
// 标记为已完成
$this->task_queue[$key]['status'] = 'completed';
$this->task_queue[$key]['completed_at'] = time();
} catch (Exception $e) {
// 标记为失败
$this->task_queue[$key]['status'] = 'failed';
$this->task_queue[$key]['error'] = $e->getMessage();
$this->task_queue[$key]['failed_at'] = time();
error_log('抖音异步任务执行失败: ' . $e->getMessage());
}
$this->save_task_queue();
// 每处理一个任务后休息一下,避免资源耗尽
sleep(1);
}
}
// 清理已完成的任务(保留最近100个)
$completed_tasks = array_filter($this->task_queue, function($task) {
return in_array($task['status'], ['completed', 'failed']);
});
if (count($completed_tasks) > 100) {
// 按完成时间排序
usort($completed_tasks, function($a, $b) {
$time_a = isset($a['completed_at']) ? $a['completed_at'] : (isset($a['failed_at']) ? $a['failed_at'] : 0);
$time_b = isset($b['completed_at']) ? $b['completed_at'] : (isset($b['failed_at']) ? $b['failed_at'] : 0);
return $time_a - $time_b;
});
// 保留最新的100个
$completed_tasks = array_slice($completed_tasks, -100);
// 合并回任务队列
$pending_tasks = array_filter($this->task_queue, function($task) {
return $task['status'] === 'pending' || $task['status'] === 'processing';
});
$this->task_queue = array_merge($pending_tasks, $completed_tasks);
$this->save_task_queue();
}
// 如果没有待处理的任务,释放锁
$pending_tasks = array_filter($this->task_queue, function($task) {
return in_array($task['status'], ['pending', 'processing']);
});
if (empty($pending_tasks)) {
$this->release_processing_lock();
}
}
/
执行单个任务
@param array $task 任务数据
/
private function execute_task($task) {
switch ($task['name']) {
case 'generate_content':
$this->execute_generate_content_task($task);
break;
case 'publish_to_douyin':
$this->execute_publish_to_douyin_task($task);
break;
case 'sync_to_wordpress':
$this->execute_sync_to_wordpress_task($task);
break;
default:
throw new Exception('未知的任务类型: ' . $task['name']);
}
}
/
执行内容生成任务
@param array $task 任务数据
/
private function execute_generate_content_task($task) {
$data = $task['data'];
if (!isset($data['topic']) || !isset($data['style'])) {
throw new Exception('内容生成任务缺少必要参数');
}
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
$ai_model = get_option('douyin_auto_poster_ai_model', 'gpt-3.5-turbo');
$openai_api_key = get_option('douyin_auto_poster_openai_api_key', '');
if (empty($app_key) || empty($app_secret) || empty($openai_api_key)) {
throw new Exception('缺少必要的API配置');
}
$ai_generator = new Optimized_Douyin_AIGenerator($openai_api_key, $ai_model);
$max_tokens = isset($data['max_tokens']) ? intval($data['max_tokens']) : 1000;
$content = $ai_generator->generate_content($data['topic'], $data['style'], $max_tokens);
if (!$content) {
throw new Exception('内容生成失败');
}
// 保存生成的内容
$task['result'] = [
'content' => $content,
'topic' => $data['topic'],
'style' => $data['style'],
'generated_at' => time()
];
}
/
执行发布到抖音任务
@param array $task 任务数据
/
private function execute_publish_to_douyin_task($task) {
$data = $task['data'];
if (!isset($data['content'])) {
throw new Exception('发布到抖音任务缺少内容参数');
}
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
if (empty($app_key) || empty($app_secret)) {
throw new Exception('缺少抖音API配置');
}
$douyin_publisher = new Douyin_Publisher($app_key, $app_secret);
$media = isset($data['media']) ? $data['media'] : [];
$result = $douyin_publisher->publish_content($data['content'], $media);
if (!$result || !isset($result['item_id'])) {
throw new Exception('发布到抖音失败');
}
// 保存发布结果
$task['result'] = [
'douyin_post_id' => $result['item_id'],
'published_at' => time()
];
}
/
执行同步到WordPress任务
@param array $task 任务数据
/
private function execute_sync_to_wordpress_task($task) {
$data = $task['data'];
if (!isset($data['content']) || !isset($data['title'])) {
throw new Exception('同步到WordPress任务缺少必要参数');
}
$post_data = [
'post_title' => $data['title'],
'post_content' => $data['content'],
'post_status' => 'publish',
'post_author' => isset($data['author']) ? intval($data['author']) : 1,
'post_category' => isset($data['category']) ? [intval($data['category'])] : [get_option('default_category')]
];
$post_id = wp_insert_post($post_data);
if (is_wp_error($post_id)) {
throw new Exception('WordPress文章创建失败: ' . $post_id->get_error_message());
}
// 如果有特色图片,设置特色图片
if (isset($data['featured_image'])) {
$this->set_featured_image($post_id, $data['featured_image']);
}
// 保存同步结果
$task['result'] = [
'post_id' => $post_id,
'synced_at' => time()
];
}
/
设置特色图片
@param int $post_id 文章ID
@param string $image_url 图片URL
/
private function set_featured_image($post_id, $image_url) {
// 下载图片
$image_data = file_get_contents($image_url);
if (!$image_data) {
return;
}
$upload_dir = wp_upload_dir();
$filename = basename($image_url);
$filepath = $upload_dir['path'] . '/' . $filename;
// 保存图片
file_put_contents($filepath, $image_data);
// 检查图片类型
$wp_filetype = wp_check_filetype_and_ext($filepath, $filename);
if (!wp_match_mime_types('image', $wp_filetype['type'])) {
@unlink($filepath);
return;
}
// 准备附件数据
$attachment = [
'post_mime_type' => $wp_filetype['type'],
'post_title' => sanitize_file_name($filename),
'post_content' => '',
'post_status' => 'inherit'
];
// 插入附件
$attachment_id = wp_insert_attachment($attachment, $filepath, $post_id);
if (is_wp_error($attachment_id)) {
@unlink($filepath);
return;
}
// 生成附件元数据
require_once(ABSPATH . 'wp-admin/includes/image.php');
$attachment_data = wp_generate_attachment_metadata($attachment_id, $filepath);
wp_update_attachment_metadata($attachment_id, $attachment_data);
// 设置为特色图片
set_post_thumbnail($post_id, $attachment_id);
}
}
// 注册异步任务处理钩子
add_action('douyin_process_async_tasks', 'douyin_process_async_tasks');
function douyin_process_async_tasks() {
$task_handler = new Douyin_Async_Task_Handler();
$task_handler->process_tasks();
}
部署与配置指南
完成抖音原创文章自动生成与WordPress集成的代码实现后,需要进行正确的部署和配置。以下是详细的部署与配置指南:
1. 上传插件文件到WordPress
将插件文件夹上传到WordPress的wp-content/plugins/目录
可以使用FTP、SFTP或WordPress后台的插件上传功能
2. 激活插件
在WordPress后台的"插件"页面,找到"抖音原创文章自动生成器"插件并点击"激活"
3. 配置插件
激活插件后,在WordPress后台左侧菜单中会出现"抖音自动生成"选项
点击该选项,进入配置页面
4. 获取抖音开放平台凭证
访问抖音开放平台(https://open.douyin.com/),注册并创建应用
获取AppKey和AppSecret,填入插件配置页面
5. 获取AI模型API密钥
根据选择的AI模型,获取相应的API密钥
例如,如果使用OpenAI的模型,需要访问https://platform.openai.com/获取API密钥
将API密钥填入插件配置页面
6. 配置发布频率
在插件配置页面,选择内容发布频率(每日、每周或每月)
7. 测试功能
在配置完成后,可以点击"测试生成"按钮,测试AI内容生成功能
确保内容生成和发布流程正常工作
8. 设置定时任务
WordPress会自动设置定时任务,用于定期生成和发布内容
可以通过以下命令检查WordPress cron是否正常工作:
wp cron event list
9. 监控和日志
插件会记录操作日志,可以在WordPress后台的"工具" > "站点健康" > "调试"中查看
也可以通过以下命令查看WordPress错误日志:
tail -f /var/log/nginx/error.log 或其他Web服务器错误日志路径
10. 性能优化
确保服务器有足够的资源处理AI API请求和内容生成
可以考虑使用缓存插件(如WP Rocket、W3 Total Cache)提高网站性能
如果网站流量较大,可以考虑使用CDN加速
11. 安全加固
确保API密钥安全存储,不要在代码中硬编码
定期更新插件和WordPress核心,确保安全性
可以使用安全插件(如Wordfence、Sucuri Security)增强网站安全性
12. 备份策略
设置定期备份,以防数据丢失
可以使用WordPress备份插件(如UpdraftPlus、BackWPup)
建议备份频率:每日备份文件,每周备份数据库
故障排查与常见问题解决
在部署和使用抖音原创文章自动生成与WordPress集成方案时,可能会遇到各种问题。以下是一些常见问题及其解决方法:
// 故障排查类
class Douyin_Troubleshooter {
private $log_file;
public function __construct() {
$upload_dir = wp_upload_dir();
$this->log_file = $upload_dir['basedir'] . '/douyin-troubleshoot.log';
}
/
记录日志
@param string $message 日志消息
@param string $level 日志级别
/
public function log($message, $level = 'INFO') {
$timestamp = date('Y-m-d H:i:s');
$log_entry = "[{$timestamp}] [{$level}] {$message}n";
file_put_contents($this->log_file, $log_entry, FILE_APPEND);
}
/
检查系统要求
@return array 系统要求检查结果
/
public function check_system_requirements() {
$results = [];
// 检查PHP版本
$php_version = PHP_VERSION;
$results['php_version'] = [
'current' => $php_version,
'required' => '>=7.4',
'status' => version_compare($php_version, '7.4', '>=') ? 'OK' : 'FAIL'
];
// 检查WordPress版本
global $wp_version;
$results['wordpress_version'] = [
'current' => $wp_version,
'required' => '>=5.6',
'status' => version_compare($wp_version, '5.6', '>=') ? 'OK' : 'FAIL'
];
// 检查cURL扩展
$results['curl_extension'] = [
'current' => extension_loaded('curl') ? '已安装' : '未安装',
'required' => '已安装',
'status' => extension_loaded('curl') ? 'OK' : 'FAIL'
];
// 检查JSON扩展
$results['json_extension'] = [
'current' => extension_loaded('json') ? '已安装' : '未安装',
'required' => '已安装',
'status' => extension_loaded('json') ? 'OK' : 'FAIL'
];
// 检查内存限制
$memory_limit = ini_get('memory_limit');
$memory_limit_bytes = $this->return_bytes($memory_limit);
$required_memory = 128 1024 1024; // 128MB
$results['memory_limit'] = [
'current' => $memory_limit,
'required' => '>=128M',
'status' => $memory_limit_bytes >= $required_memory ? 'OK' : 'FAIL'
];
// 检查执行时间限制
$max_execution_time = ini_get('max_execution_time');
$results['max_execution_time'] = [
'current' => $max_execution_time . 's',
'required' => '>=30s',
'status' => $max_execution_time >= 30 ? 'OK' : 'FAIL'
];
return $results;
}
/
将内存限制转换为字节
@param string $val 内存限制值
@return int 字节数
/
private function return_bytes($val) {
$val = trim($val);
$last = strtolower($val[strlen($val)-1]);
switch($last) {
case 'g':
$val = 1024;
case 'm':
$val = 1024;
case 'k':
$val = 1024;
}
return $val;
}
/
检查API配置
@return array API配置检查结果
/
public function check_api_configuration() {
$results = [];
// 检查抖音API配置
$app_key = get_option('douyin_auto_poster_app_key', '');
$app_secret = get_option('douyin_auto_poster_app_secret', '');
$results['douyin_api'] = [
'app_key' => empty($app_key) ? '未配置' : '已配置',
'app_secret' => empty($app_secret) ? '未配置' : '已配置',
'status' => (empty($app_key) || empty($app_secret)) ? 'FAIL' : 'OK'
];
// 检查AI API配置
$openai_api_key = get_option('douyin_auto_poster_openai_api_key', '');
$results['ai_api'] = [
'api_key' => empty($openai_api_key) ? '未配置' : '已配置',
'status' => empty($openai_api_key) ? 'FAIL' : 'OK'
];
// 测试抖音API连接
if (!empty($app_key) && !empty($app_secret)) {
$api_handler = new Douyin_API_Handler($app_key, $app_secret);
$access_token = $api_handler->get_access_token();
$results['douyin_api_connection'] = [
'status' => $access_token ? 'OK' : 'FAIL',
'message' => $access_token ? '连接成功' : '连接失败: ' . $api_handler->get_last_error()
];
} else {
$results['douyin_api_connection'] = [
'status' => 'FAIL',
'message' => 'API凭证未配置'
];
}
// 测试AI API连接
if (!empty($openai_api_key)) {
$ai_generator = new Douyin_AIGenerator($openai_api_key);
$test_content = $ai_generator->generate_content('测试主题', 'informative', 50);
$results['ai_api_connection'] = [
'status' => $test_content ? 'OK' : 'FAIL',
'message' => $test_content ? '连接成功' : '连接失败'
];
} else {
$results['ai_api_connection'] = [
'status' => 'FAIL',
'message' => 'API密钥未配置'
];
}
return $results;
}
/
检查WordPress配置
@return array WordPress配置检查结果
/
public function check_wordpress_configuration() {
$results = [];
// 检查WordPress cron
$results['wordpress_cron'] = [
'status' => defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ? 'FAIL' : 'OK',
'message' => defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ? 'WordPress cron已禁用' : 'WordPress cron已启用'
];
// 检查定时任务
$next_scheduled = wp_next_scheduled('douyin_auto_generate_and_publish_event');
$results['scheduled_task'] = [
'status' => $next_scheduled ? 'OK' : 'FAIL',
'message' => $next_scheduled ? '下次执行时间: ' . date('Y-m-d H:i:s', $next_scheduled) : '未找到定时任务'
];
// 检查数据库表
global $wpdb;
$table_name = $wpdb->prefix . 'douyin_generated_posts';
$table_exists = $wpdb->get_var("SHOW TABLES LIKE '{$table_name}'") == $table_name;
$results['database_table'] = [
'status' => $table_exists ? 'OK' : 'FAIL',
'message' => $table_exists ? '数据库表存在' : '数据库表不存在'
];
// 检查上传目录权限
$upload_dir = wp_upload_dir();
$writable = is_writable($upload_dir['path']);
$results['upload_directory'] = [
'status' => $writable ? 'OK' : 'FAIL',
'message' => $writable ? '上传目录可写' : '上传目录不可写: ' . $upload_dir['path']
];
return $results;
}
/
生成故障排查报告
@return array 故障排查报告
/
public function generate_troubleshoot_report() {
$report = [
'timestamp' => date('Y-m-d H:i:s'),
'system_requirements' => $this->check_system_requirements(),
'api_configuration' => $this->check_api_configuration(),
'wordpress_configuration' => $this->check_wordpress_configuration()
];
// 计算总体状态
$all_checks = array_merge(
$report['system_requirements'],
$report['api_configuration'],
$report['wordpress_configuration']
);
$fail_count = 0;
foreach ($all_checks as $check) {
if (isset($check['status']) && $check['status'] === 'FAIL') {
$fail_count++;
}
}
$report['overall_status'] = $fail_count === 0 ? 'OK' : 'FAIL';
$report['fail_count'] = $fail_count;
return $report;
}
}
// 常见问题解决函数
function douyin_troubleshoot_common_issues() {
$troubleshooter = new Douyin_Troubleshooter();
$report = $troubleshooter->generate_troubleshoot_report();
// 记录报告
$troubleshooter->log('生成故障排查报告: ' . json_encode($report));
// 如果有失败项,尝试自动修复
if ($report['overall_status'] === 'FAIL') {
douyin_auto_fix_issues($report);
}
return $report;
}
// 自动修复问题
function douyin_auto_fix_issues($report) {
$troubleshooter = new Douyin_Troubleshooter();
// 修复WordPress cron问题
if (isset($report['wordpress_configuration']['wordpress_cron']) &&
$report['wordpress_configuration']['wordpress_cron']['status'] === 'FAIL') {
// 尝试重新启用WordPress cron
if (!defined('DISABLE_WP_CRON')) {
define('DISABLE_WP_CRON', false);
}
// 重新调度定时任务
wp_clear_scheduled_hook('douyin_auto_generate_and_publish_event');
wp_schedule_event(time(), 'daily', 'douyin_auto_generate_and_publish_event');
$troubleshooter->log('已尝试修复WordPress cron问题');
}
// 修复定时任务问题
if (isset($report['wordpress_configuration']['scheduled_task']) &&
$report['wordpress_configuration']['scheduled_task']['status'] === 'FAIL') {
// 重新调度定时任务
wp_clear_scheduled_hook('douyin_auto_generate_and_publish_event');
wp_schedule_event(time(), 'daily', 'douyin_auto_generate_and_publish_event');
$troubleshooter->log('已尝试修复定时任务问题');
}
// 修复数据库表问题
if (isset($report['wordpress_configuration']['database_table']) &&
$report['wordpress_configuration']['database_table']['status'] === 'FAIL') {
// 重新创建数据库表
global $wpdb;
$table_name = $wpdb->prefix . 'douyin_generated_posts';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
post_id mediumint(9) NOT NULL,
douyin_post_id varchar(255) NOT NULL,
generated_content text NOT NULL,
generated_date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL,
status varchar(20) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
$troubleshooter->log('已尝试修复数据库表问题');
}
// 修复上传目录权限问题
if (isset($report['wordpress_configuration']['upload_directory']) &&
$report['wordpress_configuration']['upload_directory']['status'] === 'FAIL') {
$upload_dir = wp_upload_dir();
// 尝试设置上传目录权限
@chmod($upload_dir['path'], 0755);
$troubleshooter->log('已尝试修复上传目录权限问题');
}
}
// 添加故障排查页面
add_action('admin_menu', 'douyin_troubleshoot_admin_menu');
function douyin_troubleshoot_admin_menu() {
add_submenu_page(
'douyin-auto-poster',
'故障排查',
'故障排查',
'manage_options',
'douyin-troubleshoot',
'douyin_troubleshoot_admin_page'
);
}
// 故障排查页面内容
function douyin_troubleshoot_admin_page() {
// 检查用户权限
if (!current_user_can('manage_options')) {
return;
}
// 处理故障排查请求
if (isset($_POST['troubleshoot'])) {
$report = douyin_troubleshoot_common_issues();
echo '
故障排查已完成!

';
}
// 获取故障排查报告
$troubleshooter = new Douyin_Troubleshooter();
$report = $troubleshooter->generate_troubleshoot_report();
// 显示故障排查页面
?>
抖音原创文章自动生成器 - 故障排查
系统要求
项目
当前值
要求
状态
$item): ?>
<?php echo $item['status'] === 'OK' ?