bashで知能指数の低いbotを作成する

何らかのAPIを延々と自然な形で叩き続けたいときがありますよね。え?ないw? ←

JMeterのようなテスト用のフレームワークを使っても良いのですがそこまでするのは準備が面倒だし、ApacheBenchのようにDDoS…もとい負荷テストをするわけでもないといった場合にはbashのようなシェルスクリプトをちょちょいと書いてやると簡単に実現できます。

こういった類いのプログラムをゲーム界隈では「bot」や「バッチ」と呼称しています。

コード例

ここでは例としてとあるゲームのクエストの開始と終了用のAPIをリクエストしています。

#!/bin/bash

#
# 雑bot
#

#--------------------------------------------
# 設定
#--------------------------------------------
## クエスト用API
queststart='https://api.example.com/quest/start?userid=xxxxx'
questend='https://api.example.com/quest/end?userid=xxxxx'

## クエストの想定プレイ秒数
wait1=15

#--------------------------------------------
# 無限にAPIリクエスト
#--------------------------------------------
i=1
while :
do
  echo "--- ${i}回目"
  i=$((i+1))

  ### クエスト開始と終了APIをリクエスト
  curl -s -D - -o /dev/null ${queststart} | head -1
  sleep ${wait1}
  curl -s -D - -o /dev/null ${questend} | head -1

  ### 怪しまれないよう次回リクエストまでしばらく待つ
  wait2=$(expr $RANDOM % 10)
  sleep ${wait2}
done

curlのオプション

今回使用しているcurlのオプションは次の通りです。

オプション 内容
-s silentモード。実行中のメッセージなどを表示しません
-D HTTPヘッダーの出力先を指定します。ここでは標準出力(-)に出力しています
-o 出力先のファイルを指定。ここでは/dev/nullという名の"無"に葬り去っています

bashで乱数を扱う

今回は自然な挙動を演出するために次回リクエストするまでの秒数に乱数を考慮しています。 具体的には以下の箇所ですが、bashでは変数$RANDOMにランダムな整数(0〜32767)が自動で入るのでこの末尾1桁を剰余算で取得しています。exprは計算を行うためのコマンドになります。

  wait2=$(expr $RANDOM % 10)

厳密には上記コードだと0秒のときが発生するので、最低秒数を加算していおいた方が良いでしょう。

実行してみる

無限ループしますので、終了時はCtrl+cで強制終了してください。

$ chmod 0755 bot.sh
$ ./bot.sh
--- 1回目
HTTP/1.1 200 OK
HTTP/1.1 200 OK
--- 2回目
HTTP/1.1 200 OK
HTTP/1.1 200 OK
^C

悪用は厳禁

わずか30行程度のコードで、非常に簡易的ではありますがbotを作成することができましたね。これ以上のことがしたくなった場合は別の手段を考えた方が楽ちんです。例えばレスポンスの内容を見て処理を分岐したいとか、テストデータを予め大量に準備して順番にリクエストしていく…といったケースです。それまではこういった知能指数が低めのボットで十分活躍してくれるでしょう。

開発時にはこういったコードを使ってデバッグを行うこともありますが、一般ユーザーがボットやバッチを使うことは利用規約の上で禁止されているケースがほとんどです。もし見つかるとBAN対象となることもありますのでくれぐれもご注意を。