勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

youtubeの検索結果をWordPressに自動投稿する方法

   2024/03/04  WordPress

youtubeから特定のキーワードで検索した動画をWordPressに自動で投稿したいという案件があった。半自動ならプラグインは見つけられたけど、完全自動のものは見つけられなかったので、XML-RPを用いて関数を作成した。以下に使い方のメモ。

 

ダウンロード先

http://scripts.incutio.com/xmlrpc/

 

関数

//----------------------------------------
//    WordPress外部投稿
//
//    **引数**
//    $dir(string)        このプログラムとIXR_Library.phpを置いてあるディレクトリを絶対パスで指定
//    $domain(string)    投稿したいWordPressを置いているサーバのドメイン
//    $user(string)        WordPressのユーザー
//    $pass(string        WordPressのパスワード
//    $author(int)        投稿者のID
//    $status(string)    投稿状態。デフォルトは下書き。publishだと公開
//    $category(int)    投稿カテゴリ。デフォルトは未分類
//    $searchWord(string)    youtubeの検索ワード
//    $filter(string)    youtubeのフィルタをクエリで指定。空だと関連性の高い順
//    $tag(array) 投稿タグ。デフォは何もなし
//
//    **返り値**
//    bool(true or false)
//----------------------------------------
function postYoutubeWordPress( $dir, $domain, $user, $pass, $author = 1, $status = 'draft', $category = 1, $searchWord, $filter, $tag )
{
    //必須引数のチェック
    if( !$dir || !$domain || !$user || !$pass || !$searchWord ){
        return false;
    }

    //ライブラリの読み込み
    include_once($dir . 'IXR_Library.php');
    $client = new IXR_Client($domain . 'xmlrpc.php');

    //SQLite開く。テーブル無ければ作る
    $dbFile = $dir . 'youtube.sqlite';
    $dbFlg = ( file_exists($dbFile) ) ? true : false;
    $sqlite = new SQLite3($dbFile);
    if( !$dbFlg ){
        $query = "
            CREATE TABLE 'youtube' 
            (
                'seq' INTEGER PRIMARY KEY, 
                'title' TEXT, 
                'movie' INT
            );
        ";
        $result = $sqlite->query($query);
    }

    //youtubeからデータ取得
    $youtube = 'https://www.youtube.com/results?search_query=' . urlencode($searchWord) . $filter;
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $youtube);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    $line = curl_exec($curl);
    $line = mb_convert_encoding($line,'UTF-8','auto');

    //取得したデータから正規表現で動画IDとtitleを取得
    $pattern="/<a href=\"\/watch\?v=(.*?)\"[\n|\s]class=\".*?\"[\n|\s]data-sessionlink=\".*?\"[\n|\s]title=\"(.*?)\"[\n|\s]/";
    $match = array();
    preg_match_all($pattern, $line, $match, PREG_SET_ORDER);

    //ループ処理
    for ($i = 0; $i< count($match); $i++) {

        $movieId = $match[$i][1];
        $movieTitle = $match[$i][2];

        //既に登録されていないかチェック
        $query = '
            SELECT * 
            FROM youtube 
            WHERE movie = "'. $movieId .'" 
            LIMIT 1
        ';
        $result = $sqlite->query($query);
        $flg = false;
        while ($rs = $result->fetchArray()) {
            if( $rs['seq'] ) $flg = true;
        }

        if( $flg ) continue; 

        //登録されていない場合はDBに登録
        $query = '
            INSERT INTO youtube 
                (title, movie) 
            VALUES 
                ("'. $movieTitle .'", "'. $movieId . '")
        ';
        $result = $sqlite->query($query);

        $iframeUrl = '<iframe width="560" height="315" src="https://www.youtube.com/embed/' . $movieId . '" frameborder="0" allowfullscreen></iframe>';

        $postData = array(
            'post_author' => $author,
            'post_status' => $status,
            'post_title' => $movieTitle,
            'terms' => array('category' => array($category)),
            'post_content' => $iframeUrl,
            'terms_names' => array('post_tag' => $tag)
        );

        $return = ( $result = $client->query('wp.newPost', 1, $user, $pass, $postData) ) ? true : false;
        if( !$return ){
            return $return;
        }
    }

    return $return;
}

 

使い方

cronで回すことを想定したのでディレクトリは絶対パスで指定する。あとフィルタのクエリに関しては「&filters=week&lclk=week」みたいな形で指定。

WordPressのプラグインでVideo Thumbnailsをインストールして有効化しておくとアイキャッチ画像を自動で設定してくれるので、これもインストールしておく。

あとはcronで回す。

 - WordPress

  関連記事

WordPressの記事公開・更新時に何らかの処理を行う方法

WordPressで記事を公開(予約公開含む)もしくは更新した際に何らかの処理を ...

WP Social Bookmarking LightでSNSボタンが表示されない際の対応方法

WordPressでWordPress WP Social Bookmarkin ...

WordPressにて指定したユーザでログイン中の場合のみ表記を変更する方法

WordPressを用いたサイトを開発中の際に指定したユーザでログイン中の場合に ...

Advanced Custom Fieldsで設定した項目を条件に記事一覧を取得する方法

WordPressでAdvanced Custom Fieldsにて設定した項目 ...

Advanced Custom Fieldsでチェックボックスの記事を取得

Advanced Custom Fieldsでチェックボックス設定しているカスタ ...