YoutubeAPIを使って動画を検索して自動投稿するWordPressプラグイン

# Google APIs Client Library for PHPを使います
https://github.com/marcj/google-api-php-client


# 検索ワードとカテゴリーを設定する画面を作る
![youtubepost.png](https://qiita-image-store.s3.amazonaws.com/0/2781/8d3e52d9-d6be-971d-6636-31608acb2471.png)

```php:youtube-post.php
<?php
/*
Plugin Name: Youtube Post
Description: Youtubeで動画を検索して投稿するプラグイン
Author: 7216
Version: 1.0
*/

require_once dirname(__FILE__).'/google-api-php-client/src/Google_Client.php';
require_once dirname(__FILE__).'/google-api-php-client/src/contrib/Google_YouTubeService.php';


// メニューの追加
add_action('admin_menu', 'youtube_post_menu');
function youtube_post_menu () {
    add_menu_page('Youtube検索投稿設定','Youtube検索投稿設定',8, __FILE__,'youtube_post_setting');
}

// 設定画面
function youtube_post_setting() {
    
    // POST時の処理
    if ($_POST){
        for ($i=1;$i<=5;$i++) {
            update_option('youtube_plugin_search'.$i,$_POST['youtube_plugin_search'.$i]);
            update_option('youtube_plugin_cat'.$i,$_POST['youtube_plugin_cat'.$i]);
        }
    }

    // option取得
    $youtube_options = array();
    for ($i=1;$i<=5;$i++) {
        $youtube_options[$i] = get_option('youtube_plugin_search'.$i);
    }

    // カテゴリー一覧の取得
    $cat = get_terms( "category", "fields=all&get=all" );
    $cat_option = array();
    for ($i=1;$i<=5;$i++) {
        $selected_cat = get_option('youtube_plugin_cat'.$i);
        $cat_option[$i] = '<option value="">選択してください</option>';
        foreach ($cat as $c) {
            $selected = '';
            if ($selected_cat == $c->term_id) $selected = 'selected';
            $cat_option[$i] .= '<option value="'.$c->term_id.'" '.$selected.'>' . $c->name . '</option>';
        }
    }
    $html = <<<EOF
<h1>Youtube自動投稿設定</h1>
<form action="" name="form1" method="POST">
EOF;

    for($i=1;$i<=5;$i++) {
    $html .= <<<EOF
検索ワード{$i}：<input type="text" name="youtube_plugin_search{$i}" value="{$youtube_options[$i]}" />
カテゴリー：<select name="youtube_plugin_cat{$i}">
{$cat_option[$i]}
</select>
<br />
EOF;

    }

    $html .= <<<EOF
<input type="submit" class="button button-primary" value="設定を保存">
</form>
EOF;
    echo $html;

}


function autoPost ($num) {

    $maxPostId = 0;
    $args = array( 'posts_per_page' => 1, 'offset'=> 1, 'orderby' => 'ID', 'order' => 'DESC' );
    $myposts = get_posts( $args );
    foreach ( $myposts as $post ) {
        $maxPostId = $post->ID;
    }
    wp_reset_postdata();

    $maxPostId++;

    $DEV_KEY = 'xxxxxxxxxxxxxxxxxxxxxxx';
    $client = new Google_Client();
    $client->setDeveloperKey($DEV_KEY);
    $youtube = new Google_YoutubeService($client);
    
    $keyword = get_option('youtube_plugin_search'.$num);
    $category = get_option('youtube_plugin_cat'.$num);

    $logfile = dirname(__FILE__).'/postlog.csv';

    if (!$keyword)return;

    // 投稿が被らないようにテキストファイルにログを残す。
    // ログの読み込み
    $fp = fopen($logfile,'r');

    $logarr = array();
    while($ret_csv = fgetcsv($fp,256)) {
        $logarr[] = $ret_csv[0];
    }

    // スクレイピングしてdescription全文を取得
    $client = new Client();

 
    try {
        //指定キーワードの更新日の降順で動画を取得
        $searchResponse = $youtube->search->listSearch('id,snippet', array(
          'q' => $keyword,
          'maxResults' => 50,
          'order' => 'date', // 更新日時順
          'type' => 'video'
        ));
     
        $title = '';
        $body = '';
        foreach ($searchResponse['items'] as $searchResult) {
            if (in_array($searchResult['id']['videoId'],$logarr)) continue;
            switch ($searchResult['id']['kind']) {
            case 'youtube#video':
                $id = $searchResult['id']['videoId'];
                $title = $searchResult['snippet']['title'];
                $crawler = $client->request('GET', 'https://www.youtube.com/watch?v='.$id);
                $body = $crawler->filter('#eow-description')->html();
                break;
            }
            break;
        }

        // 投稿する
        $post_arr = array(
            'post_title' => $title,
            'post_type' => 'post',
            'post_name' => 'post-'.$maxPostId,
            'post_author' => 1,
            'post_content' => 'https://www.youtube.com/watch?v=' . $id . "\n" . "\n" . $body,
            'post_category' => array($category),
            'post_status' => 'publish'
        );

        $postid = wp_insert_post($post_arr);        

        // ログの書き込み
        $fp = fopen($logfile, 'a');
        fwrite($fp, $id."\n");
        fclose($fp);


    } catch (Google_ServiceException $e) {
    } catch (Google_Exception $e) {
    }
}



?>

```

# cronから呼ばれるPHPファイルを作成

```php:youtube_cron.php
#!/usr/local/bin/php54
<?php
define('WP_USE_THEMES', false);
require(dirname(__FILE__).'/blog/wp-load.php');

autoPost(5);
?>
```