IDCFクラウドのMorioクーポンを一括取得するワンライナー

# はじめに
[IDCFクラウド](http://www.idcf.jp/cloud/)はIDCフロンティアが提供している国内のパブリックIaaSクラウドです。IDCFクラウドでは割引クーポンを使うことができて、サービスリリース時などによく500円〜3000円程度のクーポンを配布しています。

そんな太っ腹なIDCFクラウドに対して僕は日々をクーポン乞食として活動しており、新しいクーポンが出ていないかチェックする日常を送っています。

この記事では以前に開催された「MORIOを探せ！キャンペーン」で配布されていたクーポンを一括取得する方法を紹介します。
残念ながらキャンペーン自体は終了していますが、今後同じようなキャンペーンが開催されるかもしれないのでクーポン乞食で得た知見を共有したいと思います。

# MORIOを探せ！キャンペーン
詳細は次のURLを御覧ください。

http://www.idcf.jp/cloud/cp/renew.html

前述の通りキャンペーンはもう終了しています。ざっくり説明すると、Webサイトのどこかに潜む複数のMORIOを探し出せば最大3000円のクーポンがもらえるというキャンペーンです。
ちなみにMORIOというのはこういうやつで、IDCFクラウドのマスコット？的なアレです。

![morio.png](https://qiita-image-store.s3.amazonaws.com/0/43208/6f0f5dfa-c42d-a7ff-5e0c-7632530f451b.png)

多分、筋肉的なものがモリモリっとしてるからMORIOなんでしょう(違うかも)
名前的には♂な感じがしますが性別はないそうです(嘘かも)

キャンペーンサイトの中段真ん中の「どんなカタチ？」のMORIOをクリックすればだいたいイメージはつくかと思います。
Webサイトのいろんな場所にMORIOがいて、そのMORIOをクリックするとクーポンコードがポップアップされる仕組みです。

一度、クリックしてみてください。

このサンプルMORIOをクリックしたら、エンジニアなら誰もがこう思うはずです。

「これはソースコード見れば全部書いてあるな:sunglasses::bulb:」

実際そうでした:yum:

# 答え探し
キャンペーンは終わっていますがソースコード自体はまだ公開されています。

まずはキャンペーンサイトのソースコードを開きます。
十中八九JavaScriptで実現しているだろうということはわかっているのでそのあたりをみてみます。

```html
<!--クーポンアイコン用-->
<link href="/sevice_shared/css/cloud/cp/coupon.css" rel="stylesheet" type="text/css" media="all">
<script src="http://cdnjs.cloudflare.com/ajax/libs/zeroclipboard/2.2.0/ZeroClipboard.min.js"></script>
<script src="/sevice_shared/js/cloud/cp/coupon.js"></script>
<script src="/sevice_shared/js/cloud/cp/jquery.easing.1.3.js"></script>
<!--クーポンアイコン用-->
```

おっと、いかにも怪しそうなjsファイルがありますね。
`coupon.js`が怪しそうです。こいつを開いてみましょう。
http://www.idcf.jp/sevice_shared/js/cloud/cp/coupon.js

中を開いてみるとこんな感じです。

```js
jQuery(document).ready(function(){if(!$(".cloud_coupon").length){return;}var setting={sample:{t:"&#12371;&#12428;&#12399;&#12469;&#12531;&#12503;&#12523;&#12391;&#12377;&#12290;",c:"&#74;&#69;&#48;&#45;&#88;&#88;&#88;&#88;&#88;&#88;",p:"&#48;"},SITER:{t:"&#49;&#44;&#48;&#48;&#48;&#20870;&#28961;&#26009;&#12463;&#12540;&#12509;&#12531;&#71;&#69;&#84;&#65281;",c:"&#74;&#69;&#48;&#45;&#83;&#73;&#84;&#69;&#82;&#49;&#48;&#48;&#48;&#69;&#78;",p:"&#49;&#44;&#48;&#48;&#48;"},SREAT:{t:"&#53;&#48;&#48;&#20870;&#28961;&#26009;&#12463;&#12540;&#12509;&#12531;&#71;&#69;&#84;&#65281;",c:"&#74;&#69;&#48;&#45;&#83;&#82;&#69;&#65;&#84;&#53;&#48;&#48;&#69;&#78;",p:"&#53;&#48;&#48;"},IETWE:{t:"&#53;&#48;&#48;&#20870;&#28961;&#26009;&#12463;&#12540;&#12509;&#12531;&#71;&#69;&#84;&#65281;",c:"&#74;&#69;&#48;&#45;&#73;&#69;&#84;&#87;&#69;&#53;&#48;&#48;&#69;&#78;",p:"&#53;&#48;&#48;"},RSAIW:

//...省略
```

おっともう正解を見つけてしまいましたね。。。
なんとあっけない:scream:

しかしさすがに生テキストでは書いてありませんでした。
見た感じ10進数の文字参照で記述してあります。

# ワンライナー
というわけで、JavaScriptを取得して文字参照を展開するワンライナーです。
今回はRubyで書きました。

```bash
ruby -ropen-uri -rcgi -e 'open("http://www.idcf.jp/sevice_shared/js/cloud/cp/coupon.js").read.scan(/c:"(.+?)"/) { |m| puts CGI.unescapeHTML(m[0]) }'
```

実行するとこうなります。
(一応クーポンは隠してあります)

```bash
$ ruby -ropen-uri -rcgi -e 'open("http://www.idcf.jp/sevice_shared/js/cloud/cp/coupon.js").read.scan(/c:"(.+?)"/) { |m| puts CGI.unescapeHTML(m[0]) }'
JE0-XXXXXX
JE0-hogehoge1
JE0-foobar1
JE0-hogehoge2
JE0-foobar2
JE0-hogehoge3
JE0-foobar3
JE0-hogehoge4
JE0-foobar4
```

わかりやすく書くとこうなっています。

```rb
require "open-uri"
require "cgi"

# クーポンが書いてあるJavaScriptのURL
url = "http://www.idcf.jp/sevice_shared/js/cloud/cp/coupon.js"

# JavaScriptのソースコードを取得する
javascript = open(url).read

# クーポンコードを展開して出力する
javascript.scan(/c:"(.+?)"/) { |m| puts CGI.unescapeHTML(m[0]) }
```

# おわりに
次回はさらに難しいキャンペーンを楽しみにしています :grin::sparkles: