TwitterのAPIでトレンドを取得してGrowiのAPIで登録するバッチ処理を作った

こないだ導入した2つのGrowiについて使い道が決まらず放置気味だったので片方をTwitterのトレンドをアーカイブするサイトにすることにしました。GrowiはAPIでページの取得や作成ができるようなのでそちらを試してみたかったというのもあります。GrowiのAPIを使用するにはアクセストークンを発行する必要があるためまずはそちらの対応を行いました。といってもやることはユーザーの管理画面のAPI設定でボタンを1つクリックするだけでした。

Twitterのトレンドを取得してGrowiに投稿するプログラムはPHPで書きました。また、トレンドを取得する際にはTwitterのAPI接続を補助してくれるTwitterOAuthというライブラリを使用しました。


ConoHaのサーバーにはPHP自体がインストールされてなかったのでインストールしました。CentOS7はyumでデフォルトだと5.4がインストールされるようでしたが今回はリポジトリを追加して最新の7.2をインストールしました。途中、色々間違ってサーバー丸ごと作り直したりしました(^q^

# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

リポジトリを追加したら以下のコマンドでインストールしました。DB使わないのでpdoはインストールしないのと、今回作るのはcronで実行するバッチプログラムなのでphp-fpmはインストールしませんでした。

# yum install --enablerepo=remi,remi-php72 php php-devel php-mbstring


トレンドの取得&Growiへの登録を行うPHPプログラムは以下のような感じになりました。すごい汚くなりました。TwitterのAPIキーとアクセストークンをapps.twitter.comからコピーして張り付ける際、先頭に半角スペースが入ってしまっていたことに気づかず解決するのに1時間くらい掛かりました(^q^

<?php
/**
 * TwitterのAPIで取得したトレンド情報をGrowiにAPIで登録するバッチ
 */
require 'functions.php';
require 'lib/twitteroauth-master/autoload.php';
use Abraham\TwitterOAuth\TwitterOAuth;

// Twitterからトレンド取得する際に使用するキー
$consumer_key = 'xxxxxxxxxx';
$consumer_secret = 'xxxxxxxxxx';
$access_token = 'xxxxxxxxxx';
$access_token_secret = 'xxxxxxxxxx';

// Growiに投稿する際のキー
$growi_api_url = 'https://wiki.imo-tikuwa.com/_api/';
$growi_access_token = 'xxxxxxxxxx';

$results = null;
try {
  // コネクション作成
  $connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

  // エリアごとにトレンドを取得
  // ------------------------------
  $datetime = _getJSTDate();
  $markdown_content = '';
  foreach (_getCities() as $index1 => $city) {

    $results = $connection->get('trends/place', array('id' => $city['code']));

    if ($index1 == 0) {
      $markdown_content .= "# " . $datetime->format('Y年m月d日 H時i分') . "時点のトレンド情報をまとめています\r\n";
    }

    $markdown_content .= " - " . $city['name_ja'] . "\r\n";
    $markdown_content .= "   - ";
    foreach ($results[0]->trends as $index2 => $result) {

      $markdown_content .= "[" . $result->name . "](" . $result->url . ") ";

      // 各エリア1位~15位までのトレンドを取得
      if ($index2 == 14) {
        break;
      }
    }
    $markdown_content .= "\r\n";
  }

  // Growiに投稿
  // ------------------------------
  $headers = [
      'Content-Type: application/x-www-form-urlencoded',
  ];
  $post_data = [
    'access_token' => $growi_access_token,
    'path' => "/trends/" . $datetime->format('Y年/m月/d日/H時i分のトレンド'),
    'body' => $markdown_content,
  ];
  $options = [
    'http' => [
      'method' => 'POST',
      'content' => http_build_query($post_data),
      'header' => implode("\r\n", $headers),
    ]
  ];
  $response = file_get_contents($growi_api_url . "pages.create", false, stream_context_create($options));

} catch (Exception $e) {
  $e->getTraceAsString();
}


上記のプログラムを以下のような感じでcronに登録してしばらく放置しました。

# ツイッターのトレンドを取得してGrowiに登録するバッチ
*/15 * * * * /usr/bin/php /home/conoha-user/TwitterTrend2Growi/batch.php >> /home/conoha-user/TwitterTrend2Growi/logs/`date +\%Y\%m\%d\%H\%M\%S`.log

トップページにはlsxプラグインによるリスト表示を行っています。

以下はAPIによって投稿されたトレンドのアーカイブページです。

エリアごとに表示したところで同じ日本の中でトレンドはほとんど変わりませんでした;;


GW中に日ごとのサマリーデータを投稿したりとか、GrowiへのAPI接続を行うクラスとか作ろうと思います。