Diablo IIIベータ版のキーを取得した方法

ThisIsHoroshoの YouTubeビデオ最近、Diablo IIIベータ版のキーを紹介し始めました。 7分間のクリップでは、最初にキーをアクティブにした人が勝者として、キーが1秒間表示されます。 これは、フリーズフレームでキーがどのように見えるかです。





私と同じことを考えましたか?





10個のキーのみ。



キー1

最初のキーについては知りませんでしたが、おそらく誰も知りませんでした。 誰かが幸運だった。



キー2

最も単純なボットは2番目のビデオの準備ができていました。10秒ごとに、追加されたビデオでページが更新され、新しいビデオが表示されると、アラートの形式のモーダルウィンドウがこれを報告します。 4時間後、youtubeがボットを発見し、recaptchaに入室するよう要求し、その後1時間ごとに別のボットを要求することが判明しました。 あまり便利ではありませんが、2番目のキーが別の方法で、たとえば少なくとも緑の文字で表示されると思っていたので、通常の方法で時間を無駄にしたくはありませんでした。 2番目のキーを見逃しましたが、同じ灰色の数字と文字、同じフォント、同じサイズ、同じ白い背景、同じ3行のサイズを見たとき、通常のボットを作ることにしました。



キー3

3番目のビデオでは、ボットはyoutube apiを使用しました。これは、5秒ごとに12時間スキャンを許可したリクエスト数のクォータです。



アルゴリズムは簡単でした:

  1. 5秒ごとにhttp://gdata.youtube.com/feeds/api/users/ThisIsHorosho/uploads?max-results=1&fields=openSearch:totalResults,entry/idにGETを取得し、ユーザー動画の総数と最後の動画へのリンクを取得します。

  2. 動画の数が変更されている場合、最後のリンクからvideoId:3J1CYzzZjNcを取得します
  3. http://www.youtube.com/get_video_info?video_id=3J1CYzzZjNcへのGETを行い、URLエンコードされたパラメーターを取得します
  4. url_encoded_fmt_stream_mapパラメーターを使用します。これは、さまざまな形式と品質のビデオへのURLエンコードされた直接リンクです。 リンクは、リクエストの送信元のIPに対してのみ機能します。 シャーマナイズ後、美しいリンクhttp://oo.preferred.lhr14s07.v2.lscache8.c.youtube.com/videoplayback?sparams=cp,id,ip,ipbits,itag,ratebypass,source,expire&fexp=906929,907720、 904821&ITAG = 18、およびIP = 88.0.0.0&署名= BA6D9C66CA9DF74931C899ABC3816E6FFB3AF2B5.326CFD03BDE8430990DEE9E8DC62046FAC43C62B &sver = 3&ratebypass = YES&ソース=動画を再生 &期限切れ= 1332983106&キー= YT1&ipbits = 8&CP = U0hSR1lTUV9FUENOMl9RTVVCOmNpbEFrX1hXTllx&ID = dc9d42633cd98cd7
  5. ビデオをダウンロードした後、ボットは、ボックスからmp4、flv、webmを理解するvlcライブラリを使用してビデオの分析を開始します。
  6. 1秒後にフレームをスキャンし、シリアル番号が存在すると思われるフレームを見つけて保存します。 ビデオの4分の1の部分をそれぞれ4つのストリームでスキャンします。
  7. ユーザー、つまり 見つかったスクリーンショットを見て、キーを入力するだけです


そこで、新しいビデオのリリースを知らせるアラートがポップアップ表示され、バトル.netにログインしました。ビデオがダウンロードされて10秒後に、別の10個がシリアル番号付きのスクリーンショットになりました。



私はそれを紹介しました...それはすでに使用されていることが判明しました。 エラー分析により、youtube apiを介したデータが最大5分の遅延で更新されることが示されました。 ボットが新しいビデオを発見したとき、すでに手遅れでした。 F5を振る他のボットまたはユーザーの誰かは幸運でした。



キー4

4番目のビデオまでに、ボットは完成しました。現在、約100のプロキシサーバー(プロキシサーバーごとに1つのストリーム)を使用し、5秒ごとにgdataをスキャンします。 テストによると、約20のプロキシが新しいビデオのリリースを即座にアナウンスし、残りは1分以内に引き締められました。 gdataとは異なり、直接リンクはすべてのIPにすぐに表示されるため、プロキシなしではボットは20ストリームでビデオをダウンロードします(1000ストリームでも機能し、youtubeが可能になります)。 ダウンロード速度が向上しました。 スキャンアルゴリズムが改善されました。ボットは最初に4つのストリームでクリップの2番目の部分をスキャンし(以前のすべてのビデオでは、クリップの最後にシリアルキーが表示されます)、4つのストリームで最初の部分をスキャンします。 信頼性のために、スキャン手順は500ミリ秒に短縮され、他のパラメーターもわずかに弱められました。



そのため、新しいビデオのリリースを知らせるアラートがポップアップしました。 動画が既にダウンロードされており(10秒)、シリアル番号が記載されたスクリーンショットが表示されていたとき、battle.netに入る時間はありませんでした。





2行で表示される可能性を考慮に入れて良かったです。 握手しながら、なんとかしてそれを書いて活性化させました! すべてのスキャンに約20秒かかりましたが、完全なスキャンが30秒続いたにもかかわらず、アルゴリズムはほぼすぐにシリアル番号を示しました。 このビデオでは、判明したように、連続しているように見える2つのキーがあり、2番目に入力しました。 最初にアクティベートした方、おめでとうございます!



残り5個のキー

ダウンロードの開始とともにスキャンを開始すると、アルゴリズムはより複雑になりますが、ゲインは10秒になり、シリアル番号を認識して、battle.netに自動的に入力することもできます。 その後、5秒以内でもキーを入力できます。



すべては、HttpComponents(httpプロトコル)およびVLCj(ビデオ処理)を使用してJavaで作成されました。



PS Diablo IIIクール



更新

ボット自体を作成するのは面白かったので、20時間をエンターテインメントに費やした時間と見なし、キー自体が費やすよりもはるかに多くのお金を稼ぐことができる20時間とは考えません。 暇なときには、リラックスしたり、何か新しいことを学びます。仕事ではありませんが、ここでは便利で便利です。 ゲームはまだ終わっていません。



アルゴリズム

シリアルを決定するためのアルゴリズムは、特に2つの理由ですぐに示しませんでした。 ThisIsHoroshoの作成者は、絶対に正確なアルゴリズムを学んだので、キーをすぐに認識できなくなり、ボットを作成する人にも害を与えます。 私はそのような人はいないことを認めていますが、コメントから判断すると、シリアル番号は3分で導入され、待っている間に本当にF5を押すことができますか...



さて、アルゴリズムについては多くの質問があるので...主なことは、アルゴリズムが非常に高速であることです。 シリアル番号が記載されたスクリーンショットから、主要なアイデアがすぐにわかります。



  1. フレームから写真を撮り、640x320のサイズで保存します。VLCjでは、ビデオの解像度が異なる場合でも、任意の解像度で写真を保存できます。 すべてのドットをテキストの色に近くし、それ以外はすべて白にします。 その結果、白黒写真が得られます。 これらの写真をこの記事に挿入します。
  2. スクリーンショットごとに、白と黒のドットの統計を考慮します。 背景には、白い点の数が92%を超え、テストでは94%で十分であると宣言していますが、これには余裕があります。 背景のあるフレームでは、シリアルを探しています。
  3. シリアルは中央に近いように見えますが、エッジからは決して見えないため、エッジから30ピクセル後退します。 残りのフィールドを20x20の正方形に分割し、それぞれで黒いドットの数を数えます
  4. 10%から60%の黒い点の数を持つ正方形を、文字のある正方形として宣言します。これは、文字が半分の正方形でマージンがあることを考慮に入れています。
  5. 水平方向に文字のある少なくとも6つの正方形と垂直方向に3つの正方形の連続したシーケンスがあるフレームは、シリアル番号付きのフレームを宣言します。 それらをフォルダーに保存します。




その結果、シリアル番号に類似したテキストの写真のみが表示されます。





実際には、それらの多くはありませんので、正しいものを見つけることは難しくありません。



VLCjを使用する

VLCjの操作は非常に簡単です。 最初にドキュメントwww.capricasoftware.co.uk/vlcj/tutorial1.phpを読んでから、MediaPlayerクラスで少し遊んでみましたが、どういうわけかバグがありました。一般的に、LibVlcライブラリから直接関数を呼び出すことに決めました。



最初にライブラリを作成します

LibVlc libvlc = LibVlcFactory.factory().create();







次に、8個のAnalyzerThread(Runnableタイプ)の配列(各ビデオの1/8時間)の配列を作成し、4、5、6、7、0、1、2、3の順序でExecutors.newFixedThreadPool(4)に渡します。つまり ビデオの2番目の部分が最初にスキャンされ、次に最初の部分がスキャンされます。 各AnalyzerThreadには次のコードがあります。



 System.out.println("Run section " + num); libvlc_media_player_t p_mi = null; libvlc_media_t media = null; try { // prepare //libvlc_instance_t instance = libvlc.libvlc_new(0, new String[0]); libvlc_instance_t instance = libvlc.libvlc_new(2, new String[]{"--vout", "dummy"}); p_mi = libvlc.libvlc_media_player_new(instance); libvlc.libvlc_audio_toggle_mute(p_mi); media = libvlc.libvlc_media_new_path(instance, fileName); libvlc.libvlc_media_player_set_media(p_mi, media); libvlc.libvlc_media_player_play(p_mi); Thread.sleep(msPlayerWait); libvlc.libvlc_media_player_pause(p_mi); // start snapshoting int block = blockFrom; for (long msTime = msFrom; msTime <= msTo; msTime += msInBlock, block++) { String path = snapshotPath + File.separator + "snap-" + String.format("%03d.png", block); libvlc.libvlc_media_player_set_time(p_mi, msTime); int r = libvlc.libvlc_video_take_snapshot(p_mi, 0, path, picWidth, picHeight); if (r != 0) System.out.println("SNAPSHOT FAILED: block=" + block + ", returnCode=" + r); else analyzeImage(path); } } finally { if (p_mi != null) libvlc.libvlc_media_player_stop(p_mi); if (media != null) libvlc.libvlc_media_release(media); if (p_mi != null) libvlc.libvlc_media_player_release(p_mi); System.out.println("Close section " + num); }
      
      







analyzeImage関数は、キーがスクリーンショットにあるかどうかを判断するだけです。キーがある場合は、キーを特別なフォルダーに保存します。



All Articles