2013年12月アーカイブ

uehatsu (2013年12月31日 19:21)

前回のエントリーでData APIを使ってGoogle Analyticsと連携したPVランキングを取得するスクリプトを作成しました。

ここまではData APIの実装をこねくり回せばなんとかなったのですが、1位から30位までのランキング一覧を作成するにあたって、MTMLで作成しているアセット画像のサムネールのURLを取得する必要が出てきました。

アセットのサムネールには生成する時に独自の命名規則があるので、それをガリっと正規表現で書いてやる事もできるのですが(最初はこの方法で実装していた)、そのサムネールが存在しなかった時に画像が表示されず「画像が無い場合はデフォルト画像を出してね」的なjQueryを書いてやるなどしないと都合が悪く、ちょっとなんだかなと思っていました。(もちろん、スクリプトの中でUAを作りその画像にアクセスできるかどうか確認する方法もあります)

で、最終的に考えついたのが「だったらサムネールを自動生成するDataAPI拡張プラグイン作っちゃえばいいじゃん」というもの。早速壱さんのブログを検索しData API拡張プラグインをゲットし内部構造を勉強。30分ちょっとで書けました。

まず基本はアセットのIDをData APIに渡すとその情報を取得出来るようにするプラグインを書きました。

アクセスポイント)http://www.example.com/cgi-bin/mt/mt-data-api.cgi/v1/site/3/assets/53/info

最後のinfo付けようかどうか迷ったんですが、名前空間的に他の方のプラグインとぶつかりそうだったのでこんなURLにしました。これ最後まで悩んだw

で、このURLにアセットのID(ここでは53)を渡すと、アセットの情報が取得出来るようにしました。

この後、thumb_width, thumb_height, thumb_square, thumb_scaleなどをGETで渡して情報としてJSONに格納出来るように拡張。このときはまったのが、$asset->{thumb_width}に値をセットして返って来るかと思いきや返ってこず。どうも基本はカラムやカスタムフィールドを返すようになっているようで。ここは深くは追わなかったのですが、独自の値を返す時にオブジェクトのカラムと同様に扱える方法があったらどなたか教えて下さい。resourcesを拡張してもできませんでした。

で深く追っても仕方が無い(?)ので、戻り値としてアセットの情報をitemに、サムネールの情報をthumb_infoに格納して返すように変更。

どうしようかとも思ったんですが、ある意味汎用的である必要はないので今回はこのような実装にしました。

ここまで出来たら後はサムネールの情報を返すまで。サムネールの情報を返すには「mt:Asset」タグをMTMLで使うのが簡単。という訳でテンプレートでmt:AssetThumbnailURLを返すようにして、プラグインからテンプレートのbuild_pageを呼んでやります。

まぁ、こんな感じ。

<mt:var name="asset_id" setvar="asset_id"><mt:var name="thumb_width" setvar="width"><mt:var name="thumb_height" setvar="height"><mt:var name="thumb_square" setvar="square"><mt:var name="thumb_scale" setvar="scale"><mt:Asset id="$asset_id"><mt:if name="thumb_scale"><mt:AssetThumbnailURL scale="$scale" /><mt:else><mt:AssetThumbnailURL width="$width" height="$height" square="$square" /></mt:if></mt:Asset>

これで戻ってくる値には改行が含まれるので、chompしてやってthumb_urlとして返してやります。

あとは、この値を$asset_content->{thumb_info}->{thumb_url}のように呼んでやれば、既にサムネールが存在している場合はそのURLを。存在しない場合はサムネールを作成した上でそのURLを返してくれるようになります。うーん、Data APIさまさまなこの実装。

最後に、権限チェックを実装して終わり。これで人気記事ランキングの一覧作成スクリプトが完成しました。

もっと手こずるかと思っていたData APIの拡張プラグイン。参考に指して頂いた壱さんのコードがすっきりとしていた事もあり、スムーズに実装が出来ました。さて、もっと仕事しないとw

Movable Type 6 本格活用ガイドブック (Web Designing BOOKS)
Movable Type 6 本格活用ガイドブック (Web Designing BOOKS) 藤本 壱 柳谷 真志 奥脇 知宏 シックス・アパート株式会社 

マイナビ 2013-11-30
売り上げランキング : 80852


Amazonで詳しく見る
 by G-Tools
uehatsu (2013年12月27日 15:20)

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アプリケーションとしてスクリプトを作成しました。

具体的には以下のブログメディアの「人気記事ランキング」がそれです。

 http://wonderdriving.com/

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)
Movable Type 6 本格活用ガイドブック (Web Designing BOOKS) 藤本 壱 柳谷 真志 奥脇 知宏 シックス・アパート株式会社

マイナビ 2013-11-30
売り上げランキング : 80852


Amazonで詳しく見る
by G-Tools

Who is uehatsu?

uehatsu

アーカイブ

Facebook page