Movable Type 6.0の目玉機能として実装されたData API(平田さんの最近の記事はここ)
このData APIには、こちらもMT6で実装されたブログページとGoogle Analyticsを連携させる機能を使い、簡単なREST APIを叩くだけでGoogle AnalyticsのPVランキング情報をJSONの形で取得する事ができます。このJSONデータをperlやPHPなどでパースしHTML形式に吐き出したり、そのままの形でJava Scriptで整形処理する事も出来ます。
しかし、Data APIには認証を必要とするメソッドと、そうで無いものがあり、Google AnalyticsのPV情報を取得するには認証が必要になります。一般のユーザーが認証無しにGoogle Analyticsの情報を取得する事は出来ないため、Data APIのJava Script SDKなどを使ってJava Scriptで整形する事は物理的に不可能です。そこで今回はMTモジュールから派生させたMTアプリケーションとしてスクリプトを作成しました。
具体的には以下のブログメディアの「人気記事ランキング」がそれです。
1. Data API利用の基礎
繰り返しになりますが、Data APIはRESTによるGETもしくはPOSTでのやり取りとなります。Data APIから戻ってくる値は全てJSON形式です(APIドキュメント)
ドキュメントに書かれているように特定のURLにBlog IDやメソッド名などを付けてHTTPでアクセスします。
例)http://www.example.com/cgi-bin/mt/mt-data-api.cgi/v1/sites/3/entries
ここで"3"はBlog ID。Blog ID 3のブログのエントリー一覧を取得します。
2. 認証の有無
先ほども説明した認証ですが、Google Analyticsの情報取得やエントリーの投稿など権限が無ければいけないものに必要です。その他にもエントリー一覧などは認証しないでアクセスすると公開済みエントリーだけが表示され、認証した上でアクセスすると未公開や日時指定投稿のエントリーも表示される等、認証の有無で挙動が変わるメソッドもあります。
3. 認証の方法
MTのUser名とパスワードを使ってAuthenticationを呼びます。ここでアクセストークンが帰ってくるので、認証が必要なメソッドを呼ぶ時は、このアクセストークンをHTTPヘッダーにセットしてData APIを叩きます。
例)http://www.example.com/cgi-bin/mt/mt-data-api.cgi/v1/authentication
username, password, clientIdをPOSTします。
戻り値の"accessToken"にアクセストークンがセットされて返ってきます。
アクセストークンをセットするHTTPヘッダーは以下の様になります。
例)X-MT-Authorization: MTAuth accessToken=${accessToken}
これでGoogle Analyticsの情報を取得する準備ができました。
4. pageviewsメソッド
Google Analyticsの情報を取得するメソッドはいくつかありますが、PVランキングを得るにはpageviewsメソッドが適しています。このメソッドに情報を取得する期間をstartDate, endDateで設定(形式はYYYY-MM-DD)します。
このメソッドにはlimitプロパティもあり、そこに数字をセットするとその件数分ランキング情報が取得出来ます。この情報には個別アーカイブだけでなく、カテゴリーアーカイブやインデックスページのPVもカウントされています。今回は個別アーカイブのみをランキングの対象にしたいため、limitは本当に取得したい件数よりも多めに設定しました。
5. 取得出来る情報
このメソッドの戻り値の中には、以下のような情報が入っています。
- 個別アーカイブのEntry ID
- 指定した期間中のPV数
- AuthorアーカイブのAuthor ID
- カテゴリーアーカイブのカテゴリーID
- archiveType (Indivisual, Category, ...)
- タイトル
- パス(URLのうちホスト名より以降、/index.html等)
情報がどのタイプかはarchiveTypeをみれば分かります。今回は個別アーカイブなので"Indivisual"のものだけをピックアップしました。
6. アクセスランキングを作るのに必要な情報
これらの情報からだけでもアクセスランキングを作る事は可能ですが少し情報が少ないため、味気ないランキングになってしまいます。そこで今回はData APIの他のメソッドも使う事でより多くの情報を取得しました。
まず個別アーカイブにはEntry IDが入ってくるため、このEntry IDをキーにエントリーの詳細情報を取得します。
例)http://www.example.com/cgi-bin/mt/mt-data-api.cgi/v1/sites/3/entries/1201
Entry ID 1201の詳細情報を取得します。このままアクセスすると本文等必要以上の情報が返ってきてしまいます。
そこで戻り値を制限するためにfieldsプロパティに'title,categories,date,permalink'を指定します。
この様にfieldsプロパティを設定する事で、タイトルとカテゴリー、記事日時とパーマリンクが取得出来ます。タイトルとパーマリンクはPV情報を取得した時にも得られましたが、タイトルについてはUTF8 Encodeの関係で、パーマリンクはhttpから含めてフルパスで欲しいためにあえてもう一度取得しています。
7. カテゴリー
上記の方法でカテゴリーも取得出来ます。(PV情報を取得した時には個別アーカイブにはカテゴリーIDが入ってきませんでした。入っていてもカテゴリーIDだけではあまり意味はありませんが)
カテゴリー情報はカテゴリーラベル文字列の配列で返ってきます。階層は"/"区切りで示されているため、ラベルに"/"さえ入っていなければ、splite関数で階層構造を取得する事が可能です。
さらに、カテゴリーアーカイブのパスを取得するために、Data APIでカテゴリー情報の取得しbasenameからパスを作成してやります。
例)http://www.example.com/cgi-bin/mt/mt-data-api.cgi/v1/sites/3/categories
カテゴリーのラベルとbasenameが取得できるのでHASHに保存しておき、あとでまとめてアーカイブパスを生成します。
あとはテンプレートを作って、そこに情報を書き込めば終了です。このスクリプトを1時間に1回程度cronを使って回し、その結果をSSIやPHPインクルードなどを使ってホームページに貼付けます。(もちろん即時性が必要なければビルドして静的なファイルとして吐き出す事も可能です)
JSON関係などでMT::Utilを使いたいために今回のスクリプトはMTアプリケーションとして作成しましたが、そこを自前で書くのであれば全く必要性はありません。また、perlだけでなくPHPやrubyといった他の言語でもスクリプトの作成が可能です。以前のエントリーでData APIを使ってiOSアプリを作成しましたが、Data API自体はシンプルなREST APIなのでどんな言語・プラットフォームからも活用する事ができます。まだまだ可能性を秘めているData API。これからも積極的に使って行きたいと思います。
p.s. ランキングスクリプトやData APIを用いたスクリプト・プラグインについてご興味のある方はご相談下さい。
Movable Type 6 本格活用ガイドブック (Web Designing BOOKS) | |
藤本 壱 柳谷 真志 奥脇 知宏 シックス・アパート株式会社 マイナビ 2013-11-30 売り上げランキング : 80852 Amazonで詳しく見る by G-Tools |