2020.03.09

WordPressでアメブロ特定テーマの記事を自動で記事化する機能を作ってみよう②

こんにちは、webエンジニアのゾノ( @ozonosho )です。

さて、昨日のブログに続いて今回もWordPressでアメブロ特定テーマの記事を自動で記事化する機能に挑戦していこうと思います。

おさらいしておくと、作りたい機能の仕様は下記のとおりです。

仕様
  • アメブロで特定のテーマ(=ブログカテゴリー)で書いた記事をWordPressで管理している別サイトに転送して記事化する
  • 転送は毎日深夜0時に自動でおこなう(前日分の記事を転送)
  • 重複ペナルティーを避けるために転送先の記事には「nofollow」「noindex」を加える

昨日はアメブロのRSSデータをざっくりとWordPress側に引っ張ってくることには成功しました。

その後1時間ほど頑張ってみたので、今日はその進捗を報告します!

先に言い訳しておくと、色々とやっかいな問題にぶつかって少ししか進みませんでしたw
しかし、どうして良いのか分からなかった箇所を何とか解決できたのであと1時間ぐらい頑張れば完成できる気がします!

ついに特定テーマの記事取得に成功

今回は未来地図ママスタッフのヨーコさんのブログを利用させていただきました。ヨーコさんのブログは連日違うテーマを利用して更新されていたので、特定テーマの記事を取得できたかどうか検証するのにピッタリでした。

ちなみに検証するのに利用した情報は下記のとおりです。

〇アメブロID
yuuta-haruna3(ヨーコさんのブログ

〇テーマID
10108818637(「いろんな活動」カテゴリー

上記の情報を渡して、条件にマッチするアメブロ記事をWordPressに表示するための関数を作ってみました。

それがこちら!

//アメブロRSSから自動記事作成
function create_post_by_ameblo_feed($ameblo_id, $theme_id, $count=5) {

  //RSS配信URL
  $url = 'http://rssblog.ameba.jp/' . $ameblo_id . '/rss20.xml';

  //RSSデータを取得
  $feed = fetch_feed($url);

  //RSSデータ取得時にエラーが出たら処理終了
  if(is_wp_error($feed)) exit;

  //一応取得件数の最大値を定義しておく
  $maxitems = $feed->get_item_quantity($count);

  //指定した件数のRSSデータを格納
  $rss_items = $feed->get_items(0, $maxitems);

  //今回は利用しないが↓でブログのメインタイトルやURLを取得できる
  $title = $feed->get_title();
  $site_url = $feed->get_permalink();

  //RSSデータの中身を1つずつ取り出す
  foreach($rss_items as $item) {

    //記事のURLからエントリーID情報を抜き出す
    preg_match('/entry-(\d+).html/', esc_url($item->get_permalink()), $match);

    //エントリーID情報が入っていなければ次の記事へ
    if(count($match) < 2) continue;

    //見つかったエントリーID情報を変数に格納
    $entry_id = $match[1];

    //該当記事のアメブロページのHTMLソースをすべて抜き出す
    $html = file_get_contents(esc_url($item->get_permalink()));

    //現ループの記事のentryIDとthemeNameの間に入っているHTMLソースを抜き出すための正規表現パターン
    $pattern = '/entry_id":' . $entry_id . '(.*?)theme_name/';

    //↑の条件でHTMLソースを抜き出す
    if(preg_match($pattern, $html, $result)) {

      //現ループの記事が指定テーマだった場合
      if(strpos($result[0], $theme_id) !== false) {

        //とりあえず、一旦出力する(明日はこの部分をWordPressの記事化処理にする)
        echo '

' . esc_html($item->get_title()) . '

'; //タイトル echo '

' . $item->get_date('Y.m.j') . '

'; //日付 echo '

' . $item->get_content() . '

'; //本文 } } } }

ヨーコさんのアメブロ記事新着5件のうち指定したテーマの記事だけ表示するのに成功。
(明日まではこちらのページで実際に確認できます)

尚、昨日まではどんなRSSでも利用できるような関数にすることを想定した関数名にしていましたが、アメブロは色々と仕様が特殊だったので関数名や引数を変更しています。

多分どんなふうに書いてもうまく伝わらないと思いますが、

  • アメブロのRSS情報の中にはテーマ(=カテゴリー)情報がなかったり
  • アメブロ記事内の先頭にあるテーマ部分のHTMLはJSで後から吐き出されている仕様のようでページのソースを丸ごと取ってきても中に含まれていなかったり
  • 謎の「windows.INIT_DATA」なるものの中にテーマ情報を含まれているのを発見して取り出してみるも前後の記事のテーマ情報も一緒に入っていたり

と、なかなか苦労の多い道のりでしたw

とはいえ、ここまで解決できちゃえば後は実装経験のある作業しか残っていないので、特に問題なく完成できるのではないかと思います!

参考情報をくれたウタオさん( @utao__ )、本当にありがとうございました^^

残り作業
  • 取得するRSSデータを前日分のみにする
  • RSSデータを元にWordPressの記事を作成する処理を追加する
  • 毎日深夜0時にこの処理が実行されるようにcronにセットする

おわりに

以上、前回に続いてWordPressでアメブロ特定テーマの記事を自動で記事化する機能に挑戦してみました。

今夜にまた少しコーディングの続きをする予定なので、明日こそ完成報告ができればと思います(*´`)

当サイトではWordPressのカスタマイズ依頼を請け負っています。実現したい機能・要望がある方はぜひ下記ページよりご相談ください。

あなたのサイトに理想の機能を実装!WordPressカスタマイズサービス

本サービスはあなたのWordPressサイトに理想の機能を実装するサービスとなります。 どのような機能・要望でも実現可能です! Wo......

→この記事を読む