Posts
怪盗ロワイヤル用ウィンクツール作成記 (JavaScript 後編)
前回作成した Browse クラスを使って自動ウィンク処理を作成する。まず、ログインを行うコード。
var browse = new Browse(); var url = 'https://ssl.sp.mbga.jp/_lg'; var params = { '_from' : 'lg', 'login_cb': '/_lg', 'new' : '', 'login_id': id, 'login_pw': pw }; browse.postPage(url, params);
URL やパラメータはモバゲーのログインフォームを元に作成した。中にはログインに必要ないパラメータが含まれている可能性もあるが、通常ログインと同じ動作になった方が不正を疑われにくいので忠実に真似しておく。実際に使う場合は、フォーム入力部である id と pw に適切な値を入れておくこと。
POST してログインに成功すればブラウザ上にログインセッションが生成されるので、その状態でページ巡回とウィンクをひたすら繰り返せばよい。ただ、単純に実装するとサーバとクライアントが処理可能な最大スピードでウィンクすることになるので、DoS (Denial of Service) 攻撃のような状態になってしまう。調子にのってアクセスすると「過剰アクセス規制中です」と返されアクセス規制を食らうので実験しないように。
規制を回避するには単純にウィンクスピードを緩めてやればいいわけだが、JavaScript には sleep のような実行休止関数が用意されていないので話がややこしくなる。タイマ系の処理は setInterval くらいしか残されていないので、これを使ってどうにかするしかない。
setInterval は一定間隔でコールバック関数を呼び出す関数なので、一塊だったウィンク処理を細切れにし、それらを呼び出すことで処理単位毎に休止する作戦を採用した。とりあえず、既存のウィンクツールをステートマシンとして再実装する。ステートマシンというと難しく聞こえるが、大したことはやっていない。
// 状態に応じて処理を分岐 switch (this._state) { case 0: // 怪盗一覧 // まだ取得ポイント数が閾値に達していない if (this._winkPoint < this._maxWinkPoint) { // 怪盗一覧にアクセス html = this._brows.getPage(this._kaitoListUrl); // 怪盗 URL 一覧を取得 this._kaitoUrls = getKaitoUrls(html); // 次ページ URL を取得 this._nextKaitoListUrl = getNextKaitoListUrl(html); // 状態を「怪盗ページ巡回」に変更 this._state = 1; // 巡回した怪盗の数を初期化 this._kaitoCount = 0; } else { // 終了 this.stop(); } break;
ウィンク処理の一部を抜粋。独自のメソッドやプロパティが多く出てくるので、コメントを元に雰囲気を掴んでもらえればと。ステートマシンのポイントは状態に応じた処理を行い、次の状態を決定すること。ウィンク処理を分割すると、どこまで実行したのかわからなくなってしまうので、状態を保持できるステートマシンは好都合だったというわけです。
あと、クラスとしてウィンク処理を実装した場合、setInterval が要求するのはコールバック「関数」なのでメソッドをそのまま渡すことができない。クロージャーを経由することで呼び出しが出来るようなので、そうすることにした。
// ウィンク処理スタート this.start = function() { // クロージャでの呼び出し用 var obj = this; // クロージャを定義 var callback = function() { // ウィンク処理実行 obj.run(); } // 1000ms 間隔で呼び出す setInterval(callback, 1000); }
つまづきそうなポイントはほとんど説明したので、これで解説は終わり。残りは自力で作成して大量のウィンクポイントをゲットしてください。
Windows 用やスマホ用のウィンクツールアプリが出回っているみたいだけど、裏でパスワードが抜かれているかと思うと怖くて使えない・・・。