Posted at

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

More than 3 years have passed since last update.

locodol_twittericon00.jpg

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

投票はメールアドレス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 address@xxx.yyy passxxxxx

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


おわり

ゆるキャラグランプリに限らず、こういった操作はわりと簡単に自動化することができます。

みなさんも試してみてはいかがでしょうか。

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

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