kintoneを利用して、プロ野球のニュースを集めるアンテナサイトを開発する試み。
前回は、野球のニュースを新着順に表示するひな形サイトを作りました。
今回は、kintoneのアプリ作成 => 組込みまでを行います。
kintoneのアプリ作成
まず最初に、kintoneの操作画面にログインして、野球アンテナ用のアプリを作成します。
kintoneのアプリ作成については、公式ドキュメントを参照ください。
今回は、ニュースサイトのフィード情報のみを登録する、シンプルなアプリとします。
アプリの設定=>フォームと移動して、[リンク]を選択します。
作成が終わったらアプリを保存して、前回利用した野球サイトのニュースフィードを登録します。
これでkintone側の準備は完了です。
REST APIの情報ページ
続いて、SimplePieとkintoneを連動させるために、REST APIを叩いていきます。kintoneのREST APIに関する技術情報は以下のページにまとまっていました。
kintoneのデータにアクセスするためには、認証を行わければいけません。
REST API経由でkintoneの認証を行う方法は、以下のページにまとまっています。
以上を元に、認証ロジックを作成します。
今回は [kinauth.php] という認証用のファイルを別ファイルで作成してみました。
kinauth.php
<?php // アプリのサブドメインを設定 $subDomain = "hogehoge"; // ユーザー認証 $loginName = "login-name"; // ログイン名 $password = "pasword-data"; // パスワード // リクエストヘッダ $header = array( "Host: " . $subDomain . ".cybozu.com:443", "Content-Type: application/json", "X-Cybozu-Authorization: " . base64_encode($loginName . ':' . $password), ); // フォーム設計情報を取得するアプリのアプリID $appId = 00; // HTTPコンテキスト $context = array( "http" => array( "method" => 'GET', "header" => implode("\r\n", $header), "content" => json_encode(array("app" => $appId, )), ) ); // REST APIでフォーム設計情報を取得 $response = file_get_contents( "https://" . $subDomain . ".cybozu.com/k/v1/records.json", // URI false, // use_include_pathは必要ないのでfalse stream_context_create($context) // コンテキストの生成 ); ?>
このコードを実行すると、以下の様なJSONデータを取得できます[records]というjsonデータの下に、kintoneに登録されたデータがjson形式で確認できるのが分かります。いわゆる多次元構造のjsonデータになっています。
続いて、前回作成したSimplePieのコードに手を入れます。
index.php
<?php // SimplePieを呼び出し require_once('autoloader.php'); // kintone の認証プログラムを呼び出し require_once('kinauth.php'); // 取得したjsonデータからフィードを取得して配列 $array に代入 // アロー演算子でフィードURLを取得する $result = json_decode($response); foreach($result->records as $records) { $array[].=$records->URL->value; } // SimplePieの関数 set_feed_url に配列 $array を読みこませる $feed = new SimplePie(); $feed->set_feed_url($array); $feed->init(); ?>
まず、kinauth.phpをrequire_onceして、取得したjsonデータを$responseに代入します。その後、$responseをjson_decodeします。phpのjson_decode関数を利用してjsonデータを読むこむ際は
- 連想配列に変換する(json_decode 関数に引数 true を指定する)
- そのままオブジェクトとして使用する(引数を指定しない、もしくはfalseを指定する)
の2種類の方法があります。今回はオブジェクト型のデータからアロー演算子を利用して、jsonに格納されているURLデータを取得し、配列$arrayに入れました。
$result = json_decode($response); foreach($result->records as $records) { $array[].=$records->URL->value; }
以下は、SimplePieのループ処理です。前回とほぼ同じです。(BootStrapのテーマに合わせてhtmlを変えています)
<?php foreach ($feed->get_items() as $item): ?> <h2> <a href="<?php echo $item->get_permalink(); ?>"><?php echo $item->get_title(); ?></a> </h2> <p class="lead"> by <a href="index.php"><?php echo $item->get_feed()->get_title(); ?></a> </p> <p><span class="glyphicon glyphicon-time"></span> Posted on <?php echo $item->get_date('Y-m-d H:i'); ?></p> <hr> <p><?php echo $item->get_description(); ?></p> <a class="btn btn-primary" href="<?php echo $item->get_permalink(); ?>">Read More <span class="glyphicon glyphicon-chevron-right"></span></a> <hr> <?php endforeach; ?>
メモ
kintoneのAPIは、1日あたりの呼び出し回数制限があります。(1万回)
実際に運用する場合は、ニュースページが読み込まれるたびにkintoneへアクセスするのも無駄が多いので、あえて今回のケースで構築するなら
- kintoneからフィードリストを取得し、json形式のファイルをサーバーに保存
保存したjsonからニュースリストを生成
などが現実的なのでしょう、きっと。
エラー処理も入っていないので、追って実装を試みます
次回は、パースしたニュース記事データを、kintoneへ登録してみます。