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


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

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

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

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

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

あらかじめ、ゆるキャラグランプリ オフィシャルウェブサイト でメールアドレスを登録しておく必要があります。

詳細は割愛

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

まずは主要部分を抜粋

# 以下を自身のメールアドレスとパスワードに書き換える
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 <key=value>: フォーム送信(key=value)
  • -c <file>: cookieをファイルに保存
  • -b <file>: 保存したcookieを使用

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

コマンド化

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

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 [email protected] passxxxxx

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

おわり

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

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

魚心くんの応援もぜひ!!