JSONテンプレートモジュール (Json_2Tpl) ＋ YQL で RSS/Atomフィードを表示する

これは [a-blog cms Advent Calendar 2016](http://www.adventar.org/calendars/1562) の6日目の記事です。

* * * 

11月に開催された a-blog cms の秋合宿で、次期バージョン (v2.7) の新機能が紹介されました。
わたしは、その中の「**JSONテンプレートモジュール (Json_2Tpl)**」と「**YQL (Yahoo Query Language)**」の組み合わせがとても便利だと感じました。
YQLの認知度が低いようなので、これを期にお伝えしたいと思います。

## 前置き
### ★ JSONテンプレートモジュール (Json_2Tpl)
公式のハンズオンページが用意されています。
[JSONを使って専用モジュールを作ってみよう |  2016年秋合宿ハンズオン | ablogcms.io](http://ablogcms.io/camp2016/json-2tpl.html)

今はまだ v2.7 の正式リリース前ですが、[ablogcms.io](http://ablogcms.io/) では新機能のお試しもできるはずです。30日間無料！

ハンズオンではJSONファイルはすでに用意されていますが、JSONテンプレートモジュールを使う際に **どうやってJSONファイルを用意するか** が問題になったりしますね。しませんか？
それを解決してくれるのが **YQL (Yahoo Query Language)** です！

### ★ YQL (Yahoo Query Language)
![yql_00.png](https://qiita-image-store.s3.amazonaws.com/0/111287/a1c67856-558a-6e47-de4b-e778f859d1be.png)

[YQL - Yahoo Developer Network](https://developer.yahoo.com/yql/)

> YQLとは米Yahoo! Developer Networkが提供している、ありとあらゆるWeb上のリソースにアクセスすることができる開発者向けのサービスです。
> 
> 文法はSQLのようで独特ですが、要約すると
> 
> - XML、HTML、RSS、CSVなどをJSONPに変換
> - WebAPIレスポンスの加工
> - キャッシュ機能つき
> 登録などをしなくても使える(利用制限等についてはYQL公式サイトをご参照ください)
> 
> こういった機能を持つ、汎用的なプロキシサービスです。

簡単に言うと

> 「YQLというものを使うと、XMLをJSONPに変換して扱えるようになる」

ということらしいです。便利！

参考）[XMLのWebAPIを爆速で使いこなせるフレームワーク - Yahoo! JAPAN Tech Blog](https://techblog.yahoo.co.jp/programming/bakusoku-yql/)

## YQL Console を使ってみよう
では、実際に使ってみます。
今回は Qiita 内の [ablogcms のタグがついた記事](http://qiita.com/tags/ablogcms) の一覧を表示してみます。

### 1. YQLでJSON形式に変換
まず [YQL Console](https://developer.yahoo.com/yql/console/) を開きます。

![Json_2Tpl_01.png](https://qiita-image-store.s3.amazonaws.com/0/111287/16e69ef1-2a18-68df-0da3-f33e51c923e7.png)

「**show tables**」と表示されているところがYQLのSELECTステートメントを記述する場所です。
今回はQiitaのフィードデータが欲しいので、左の **data** から **feed** を選びます。

![Json_2Tpl_02.png](https://qiita-image-store.s3.amazonaws.com/0/111287/2fe44201-b763-d20e-f288-0c43e3c0476e.png)

ステートメントが自動で置き換わりました。

```sql
select * from feed where url='フィードのURL'
```

が基本形です。

selectの後の「*」はワイルドカードです。次のようにデータを指定して取得することもできます（むしろそちらの方が望ましいと思います）。

```sql
select title,url,author from feed where url='フィードのURL'
```

URLをフィードを取得したいものに書き換え、**JSON**形式が選択されていることを確認して「**Test**」ボタンを押します。

例えば：今回取得するフィードは以下のようになります。

```sql
select * from feed where url='http://qiita.com/tags/ablogcms/feed.atom'
```

画面下部の「**THE REST QUERY**」と書いてあるところのURLを後程使います。

![Json_2Tpl_03-2.png](https://qiita-image-store.s3.amazonaws.com/0/111287/aa223f34-5ecb-da57-ee11-0c2c0f322e71.png)

### 2. 取得データを見てみる
「Formatted View」の中身を見ると、どんなデータが取得できるか確認できます。

データは階層（ドットシンタックス）になっています。「Tree View」タブに切り替えると階層がわかりやすいです。

![Json_2Tpl_04.png](https://qiita-image-store.s3.amazonaws.com/0/111287/dbbba8c2-f7b3-088b-1fc1-95bb207a0636.png)

## a-blog cms のカスタマイズ
### 1. モジュールIDの作成と設定
a-blog cms の管理ページでモジュールIDを作成します。

![Json_2Tpl_05.png](https://qiita-image-store.s3.amazonaws.com/0/111287/3452d4fc-adda-3ca4-07fb-e3a68ad3cec0.png)

表示設定タブに切り替えて、**JSONファイル** の入力欄に、先程 YQL Console に表示されていた「**THE REST QUERY**」のURLを貼り付けます。

![Json_2Tpl_06.png](https://qiita-image-store.s3.amazonaws.com/0/111287/2411ec53-e4fb-0a7b-83ab-3f130b6901c6.png)

### 2. テンプレートの記述
[ハンズオン](http://ablogcms.io/camp2016/json-2tpl.html) に習って、表示側のテンプレートを以下のように記述します。

```html
<section class="module-section">
    <div class="module-header clearfix">
        <h2 class="module-heading">QiitaのRSSフィード</h2>
    </div>
    <!-- BEGIN_MODULE Json_2Tpl id="qiitaRssFeed" -->
    <!-- BEGIN query -->
    <!-- BEGIN results -->
    <ul class="acms-list-group clearfix">
        <!-- BEGIN entry:loop -->
        <li class="acms-list-group-item js-biggerlink">
            <time datetime="{published}">{published}[date('Y年m月d日')]</time>
            <a href="{url}" class="acms-list-group-title-link">{title}</a>
        </li>
        <!-- END entry:loop -->
    </ul>
    <!-- END results -->
    <!-- END query -->
    <!-- END_MODULE Json_2Tpl -->
</section>
```

表示を確認してみると……はい！

![Json_2Tpl_07.png](https://qiita-image-store.s3.amazonaws.com/0/111287/b3accbf2-35d7-cf9d-a0be-4d949477bfc1.png)

記事の一覧が表示されました。

### 3. 便利な点
JSONテンプレートモジュールが便利なのは、何と言っても「**校正オプションが使える**」点だと思います。

例えば：日付の校正オプション。
**{published}** の変数のみでは **2016-11-10T18:37:28+09:00** のように出力されてしまうため、日付の表示形式を変えるにはJSを書く必要がありました。
**{published}[date('Y年m月d日')]** と校正オプションを付けるだけで **2016年11月10日** のように表示形式を変えることができます。

## 表示件数の調整
Qiitaのフィードはデフォルトが20件のようです。 **最新の5件だけ** を表示するように少し書き換えます。
取得するデータの件数を設定するときはステートメントに記述します。

```sql
select * from feed(オフセット数,アイテム数) where url='フィードのURL'
```

[Remote Limits | SELECT Statement - Yahoo Developer Network](https://developer.yahoo.com/yql/guide/select.html#remote-limits)

最初の5件を取得したい場合は

```sql
select * from feed(0,5) where url='フィードのURL'
```

もしくは、

```sql
select * from feed(5) where url='フィードのURL'
```

オフセットのデフォルトが0なので、省略することができます。

YQL Console で以下のステートメントを入力し、当該モジュールIDのJSONファイル部分を新しい「THE REST QUERY」のURLに置き換えれば完了です。

```sql
select * from feed(5) where url='http://qiita.com/tags/ablogcms/feed.atom'
```

![Json_2Tpl_08.png](https://qiita-image-store.s3.amazonaws.com/0/111287/a5146738-3a4a-8f2b-3846-9f3994cc2b42.png)

![Json_2Tpl_09.png](https://qiita-image-store.s3.amazonaws.com/0/111287/c0f2ab68-f77f-0b78-1a9c-f984c1747f4e.png)

## おわりに
わたしにできるのは外部ブログのフィードを読み込むくらいですが、ブラウザやサーバのクロスドメイン制約を考えると、JSONテンプレートモジュールでJSON形式のデータが簡単に扱えるようになるのはとても嬉しいです。
v2.7 の正式リリース楽しみにしています！

あと、YQL すごく便利だと思うので、使う人が増えて日本語のドキュメントが増えるといいなあと思います（他力本願）。

## 〈おまけ〉YQL API の利用制限について
YQLの利用制限についてメモしておきます。

![yql_04.png](https://qiita-image-store.s3.amazonaws.com/0/111287/d2337455-b984-a31b-db4a-82d2cae9d073.png)

[Usage Information and Limits | Overview - Yahoo Developer Network](https://developer.yahoo.com/yql/guide/overview.html#usage-information-and-limits)

APIのコール数が **1時間あたり2,000まで** の場合、APIキーは必要ないようです。Public Endpoint ( /v1/public/* ) が使えます。

それ以上の場合は、APIキーを取得することで **1時間あたり20,000まで** 使えるようになるとのこと（1日あたり100,000まで）。OAuth Endpoint ( /v1/yql/* ) を使います。