抖音原创文章自动生成与WordPress集成方案API调用和AI模型部署

抖音原创内容自动生成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 '

故障排查已完成!

抖音原创文章自动生成与WordPress集成方案API调用和AI模型部署

';
}

// 获取故障排查报告
$troubleshooter = new Douyin_Troubleshooter();
$report = $troubleshooter->generate_troubleshoot_report();

// 显示故障排查页面
?>

抖音原创文章自动生成器 - 故障排查

系统要求

$item): ?>
项目 当前值 要求 状态
<?php echo $item['status'] === 'OK' ?