【cURLのススメ】ゆるきゃらグランプリの魚心くんを応援しよう！

![locodol_twittericon00.jpg](https://qiita-image-store.s3.amazonaws.com/0/10548/1e773e5c-fa29-aa27-53c8-55a40189870f.jpeg)

今期の難民枠「普通の女子校生が【ろこどる】やってみた。」のマスコットキャラクター「**魚心くん**」がゆるキャラグランプリに出場中です。

- [最新情報｜TBSテレビ：普通の女子校生が【ろこどる】やってみた。 公式ホームページ](http://www.tbs.co.jp/anime/locodol/news/#news201409052010)

- [魚心くん｜ゆるキャラグランプリ オフィシャルウェブサイト](http://www.yurugp.jp/vote/detail.php?id=00002402)

投票はメールアドレス1つにつき1日1回答票可能です。

魚心くんは**現在41位**(2014年9/21時点)となかなか厳しい順位。
応援したいけど毎日HPにいって投票するのは結構手間…

というわけで、cURLコマンドを使ってさくっと投票を自動化してみました。

## ゆるキャラグランプリに登録

あらかじめ、[ゆるキャラグランプリ オフィシャルウェブサイト](https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/login/index) でメールアドレスを登録しておく必要があります。

- [ゆるキャラ®グランプリ ID（メールアドレス）登録｜ゆるキャラグランプリ オフィシャルウェブサイト](https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/members/)

詳細は割愛

## cURLを使った認証〜フォーム送信

まずは主要部分を抜粋

```bash
# 以下を自身のメールアドレスとパスワードに書き換える
MAIL='your-mail-address'
PASS='your-password'

ENTRY_ID=1482
CHARACTER_ID=00001509
TMPFILE='cookie.txt'

urlencode() {
    echo "$1" | nkf -wMQ | tr = %
}

urlencode_param() {
    local key value
    key=$(urlencode "$1")
    value=$(urlencode "$2")
    echo "$key=$value"
}

MAIL_PARAM=$(urlencode_param 'data[Member][email]' "$MAIL")
PASS_PARAM=$(urlencode_param 'data[Member][password]' "$PASS")

curl -v -d "entry_id=$ENTRY_ID&character_id=$CHARACTER_ID" \
     -c "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/vote/comp

curl -v -d "$MAIL_PARAM&$PASS_PARAM" \
     -b "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/login/comp

curl -v \
     -b "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/vote/comp
```

やってることは単純で、HPでの投票操作(POSTによるフォーム送信)をcURLコマンドを使ってそのまま再現してるだけです。

また、認証が必要なのでクッキーを引き継ぐようにしてます。

#### cURLオプションの説明

- -v: 詳細表示
- -d &lt;key=value&gt;: フォーム送信(key=value)
- -c &lt;file&gt;: cookieをファイルに保存
- -b &lt;file&gt;: 保存したcookieを使用

こんな感じで簡単にフォーム操作を自動化することができます。

## コマンド化

コマンド化します。あくまで一例です。

```bash:vote_yuru_uogokoro.sh
#!/bin/bash
#
# vote_yuru_uogokoro.sh
#
# Vote Uogokoro-kun at Yuru-GP
#
# http://www.yurugp.jp/vote/detail.php?id=00002402
#
# USAGE:
#   vote_yuru_uogokoro.sh <mail address> <password>
#   vote_yuru_uogokoro.sh <file>
#
#   file format:
#     MAIL=xxxx@yyyy
#     PASS=xxxxxxxxx
#
#------------------------------------------------------------------------------

ENTRY_ID=${ENTRY_ID:-1482}
CHARACTER_ID=${CHARACTER_ID:-00001509}


urlencode() {
    echo "$1" | nkf -wMQ | tr = %
}

urlencode_param() {
    local key value
    key=$(urlencode "$1")
    value=$(urlencode "$2")
    echo "$key=$value"
}

atexit() {
    [[ -n ${TMPFILE-} ]] && rm -f "$TMPFILE"
}


if [[ $# -eq 1 && -r ${1-} ]]; then
    source "$1"
fi

MAIL=${MAIL:-${1-}}
PASS=${PASS:-${2-}}
TMPFILE=

echo "MAIL=$MAIL"
echo "PASS=$PASS"
echo


if [[ -z ${MAIL-} || -z ${PASS-} ]]; then
    echo 'ERROR: Illegal arguments' 1>&2
    echo "USAGE: ${0##*/} <mail address> <password> | <file>"
    exit 1
fi

MAIL_PARAM=$(urlencode_param 'data[Member][email]' "$MAIL")
PASS_PARAM=$(urlencode_param 'data[Member][password]' "$PASS")
if [[ $DEBUG ]]; then
    echo "MAIL_PARAM=$MAIL_PARAM"
    echo "PASS_PARAM=$PASS_PARAM"
    echo
fi


trap atexit EXIT
trap 'trap - EXIT; atexit; exit -1' INT PIPE TERM

TMPFILE=$(mktemp "/tmp/${0##*/}.tmp.XXXXXX")


curl -d "entry_id=$ENTRY_ID&character_id=$CHARACTER_ID" \
     -c "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/vote/comp

curl -d "$MAIL_PARAM&$PASS_PARAM" \
     -b "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/login/comp \
     2>&1 \
     | GREP_OPTIONS= grep 'メールアドレスかパスワードが間違っています' \
     | sed 's/<[^<]*>//g'

curl -v \
     -b "$TMPFILE" \
     https://yurugp2014.secureserv.jp/yurugp.jp2014/pc/vote/comp \
     2>&1 \
     | GREP_OPTIONS= grep -A 1 '<h3>投票エラー</h3>\|<h3>投票完了</h3>' \
     | sed 's/<[^<]*>//g'
```

使用例

```
$ vote_yuru_uogokoro.sh address@xxx.yyy passxxxxx
```

あとはcronなどに登録して、1日1回実行すればOK!

## おわり

ゆるキャラグランプリに限らず、こういった操作はわりと簡単に自動化することができます。
みなさんも試してみてはいかがでしょうか。

ただし！言わなくて分かると思いますが、くれぐれも**悪用厳禁**です！

**魚心くんの応援もぜひ！！**