スポンサーリンク

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

前回の続きです。以下は前回から今回にかけての改良(?)点です。

  • バッチの実行頻度を15分毎から1時間毎に変更
  • GrowiのAPIリクエストを行うクラスを作成
  • 日毎の集計ページを新規作成
  • レイアウト変更(トレンドのリスト表示、Bootstrap3のpanelで3段組など)
  • APIキーなどの情報を定数に置き換え
  • その他、BASIC認証を解除

今回新規で追加した日毎のページは以下のようなURLでアクセスできます。

年/05月/06日


今回の改修でGrowiに複数回APIリクエストを行うようになったのでクラスを作成しました。
GrowiのAPIは機能によってリクエストメソッドがpostとgetの2つに分かれているのでAPIにリクエストを送信する側もpostとgetの2つを用意しました。コンストラクタでAPIのURLとアクセストークンを指定して、以降はpostまたはgetメソッドでAPIリクエストを行います。

<?php
namespace Tikuwa\GrowiAPI;

/**
 * GrowiのAPIに接続するためのクラス
 *
 * 確認済みのアクション
 * post
 *  pages.create
 *
 * get
 *  users.list ←アクセストークンは必要ないっぽい?
 *  pages.list ←アクセストークンは必要ないっぽい?
 *
 * @author tikuwa
 *
 */
class GrowiAPI {

  private $api_url = null;
  private $access_token = null;

  /**
   * Constructor
   *
   * @param unknown $api_url
   * @param unknown $access_token
   */
  public function __construct($api_url, $access_token) {
    $this->api_url = $api_url;
    $this->access_token = $access_token;
  }

  /**
   * Api Post
   *
   * @param unknown $function_name /_api/ 配下のアクション名
   * @param unknown $post_data Growiにpostするデータ
   */
  public function post($function_name, $post_data) {

    if (is_null($this->api_url) || is_null($this->access_token)) {
      return null;
    }

    $headers = [
        'Content-Type: application/x-www-form-urlencoded',
    ];
    $post_data['access_token'] = $this->access_token;
    $options = [
        'http' => [
            'method' => 'POST',
            'content' => http_build_query($post_data),
            'header' => implode("\r\n", $headers),
        ]
    ];
    $response = file_get_contents($this->api_url. $function_name, false, stream_context_create($options));
    return json_decode($response, true);
  }

  /**
   * Api Get
   */
  public function get($function_name, $get_data) {

    if (is_null($this->api_url) || is_null($this->access_token)) {
      return null;
    }

    $get_data['access_token'] = $this->access_token;

    $response = file_get_contents($this->api_url. $function_name . "?" . http_build_query($get_data) , false);
    return json_decode($response, true);
  }
}

GrowiAPI.phpを作ったことで前回のバッチプログラムは以下のような感じになりました。
日毎の集計データを作成する処理も追加しています。日毎のデータ集計についてはデータベースは使わずymd形式のテキストファイルに配列を書き出すことで実現しました。
マークダウンテキストの作成処理を上部でインクルードしてるfunctions.phpに押し込んだのでソースが少しだけ見やすくなったかも。

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

$summary_file = SUMMARY_DATA_DIR . date('Ymd');
$growi_api_url = "https://wiki.imo-tikuwa.com/_api/";

try {
  // コネクション作成
  $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

  // サマリーデータをファイルから取得
  // ------------------------------
  $summary_data = @file_get_contents($summary_file);
  $summary_data = (is_null($summary_data)) ? [] : unserialize($summary_data);

  // エリアごとにトレンドを取得、サマリーデータの更新
  // ------------------------------
  $datetime = _getJSTDate();
  $results = [];
  foreach (_getCities() as $city) {
    $result = $connection->get('trends/place', array('id' => $city['code']));
    $results[$city['code']] = $result;

    // サマリーデータの更新
    foreach ($result[0]->trends as $trend_data) {
      if (!isset($summary_data[$city['name_ja']][$trend_data->name])) {
        $summary_data[$city['name_ja']][$trend_data->name] = [
            'count' => 0,
            'name' => $trend_data->name,
            'url' => $trend_data->url,
        ];
      }
      $summary_data[$city['name_ja']][$trend_data->name]['count']++;
    }
  }

  // サマリーデータを保存
  // ------------------------------
  file_put_contents($summary_file, serialize($summary_data));

  // Growiに投稿
  // ------------------------------
  $growi_api = new GrowiAPI($growi_api_url, GROWI_ACCESS_TOKEN);

  // 1時間単位のページを投稿
  $growi_api->post("pages.create", [
      'path' => "/trends/" . $datetime->format('Y年/m月/d日/H時i分のトレンド'),
      'body' => _createHourMarkdown($datetime, $results),
  ]);

  // 日毎のページを取得
  $day_page = $growi_api->get("pages.get", [
      'path' => "/trends/" . $datetime->format('Y年/m月/d日'),
  ]);

  // 日毎のページが存在しない場合は新規投稿、存在する場合は更新
  $day_post_data = [
      'path' => "/trends/" . $datetime->format('Y年/m月/d日'),
      'body' => _createDaySummaryMarkdown($datetime, $summary_data),
  ];
  if (isset($day_page) && $day_page['ok'] === true) {
    $day_method = "pages.update";
    $day_post_data['page_id'] = $day_page['page']['id'];
  } else {
    $day_method = "pages.create";
  }
  $growi_api->post($day_method, $day_post_data);

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

https://wiki.imo-tikuwa.com/
1時間毎のページは以下のような感じになりました。bootstrap3はGrowiに標準で入っていました。

日毎ページはソートして表示、出現頻度の高い順に表示しています。画面をスクロールすると大阪、名古屋、福岡のデータも見れます。

タイトルとURLをコピーしました