今回はyobitダイスゲームの自動化に成功したのでシェアしておきます。

※yobitの登録方法はこちらから。



yobitのダイスゲームは自分でポチポチと地味に手動でプレイしてたんですが、ダイスのAPIがないのに他の人達がダイスゲームの自動化出来ているのは何でだろう?とちょっと調べてみたらあっさりと手法が理解出来ました。


この方法を使えば自分の編み出したアルゴリズムでダイスゲームが自動化されて、上手くいけば自分が寝ている間でも24時間不眠不休でダイスゲームで稼いでくれるという、まさに夢の不労収入が実現出来ます!

もしくはyobitでレンディングしていて、「毎日5回ダイスゲームしないと日利がゲット出来ないのが面倒くさい...」という方にもオススメの方法です。

やり方はパソコンが得意(?)な方だとさほど難しくありません。
Windowsパソコンとインターネット接続、あとpythonの少しの知識されあれば可能です。



では以下、手順を説明します。

(※以下の記事はソフトウェアの動作環境について少し知識がある方を対象としています。サポートは受け付けておりません。自己責任で何卒💦)



環境構築

https://www.inet-solutions.jp/technology/python-selenium/

このページなどを参照にしてpythonの実行環境とseleniumと、chrome用のWebドライバをインストールします。

この段階でpython、selenium、chrome、chrome用Webドライバがインストールされている状態にしておきます。



プログラム(ソースコード)

今回のダイスゲームの自動化は、chromeでブラウザ上に表示されたyobitのダイスゲームの画面で、seleniumというWebブラウザのテスト自動化ツールを使ってリモート操作(Webスクレイピング)する、という手法を用いています。


以下、pythonのソースコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import sys
import random
import re
from selenium.webdriver.common.keys import Keys

InitialValue = 0.00000001
InitialValue = 0.0000001
MaxValue = 0.02
Count = 0
WinCount = 0
LoseCount = 0
MaxLoseCount = 0
CriticalLoseCount = 0
ContinuousLoseCount = 0
NumberExpressionPattern = r'([+-]?[0-9]+\.?[0-9]*)'


###############################################################
# Get current value of currency
#フォームから現在の資産を取得する
# ret(float): value
###############################################################
def GetCurrentAmount():
    
    element = driver.find_element_by_class_name("chosen-single")
    list1 = element.find_elements(By.TAG_NAME, "span")

    line = ""
    for j in range(0, len(list1)):
        if j < len(list1) - 1:
            line += "%s\t" % (list1[j].text)
        else:
            line += "%s" % (list1[j].text)

    
    # 数字のみを取得する
    number = re.findall(NumberExpressionPattern, line)

    ret = 0.0
    
    for j in number:
        ret = float(j)

    return ret

 
############################################################
# Main routine
#
# Yobitで自力でログインする
# ログインしてからIDEでリターンキーを押してスタート
############################################################
if __name__ == '__main__':

    driver = webdriver.Chrome("./chromedriver.exe")
    #driver = webdriver.Firefox()
    
    driver.get("https://yobit.net/en/dice/")
    
    input ("When logged in manually and got ready, type enter key.")     # Wait for logged in

    BetValue = InitialValue

    ReturnValue = GetCurrentAmount()    # 例 'BTC (Bitcoin) - 0.01123232 BTC'
    print(ReturnValue)

    LastValue = ReturnValue             #最初は同じ金額
    
    while (True):
        
        #フォームをクリアする
        element = driver.find_element_by_name('bet')

        #for i in range(12):
        #    element.send_keys(Keys.BACK_SPACE);    #一文字ずつ消去する方法
        #element.clear()                            #この方法では全然消えない!!
        element.send_keys(Keys.CONTROL,"a")         #CTRL+Aで全選択
        element.send_keys('%03.8f' % BetValue)

        time.sleep(0.1)    # Wait for DDoS proof
        
        driver.find_element_by_class_name('clDicePlay').click()  # ( Roll < 48) button

        time.sleep(0.5)     # Wait for DDoS proof
    
    ############################################################
    # Simulator
    ############################################################
    ##    rnd = random.randrange(100)
    ##    if (rnd > 52):
    ##        ReturnValue = ReturnValue + BetValue
    ##
    ##    elif (rnd < 48):
    ##        ReturnValue = ReturnValue - BetValue
    ##
    ##    else:
    ##        ReturnValue = ReturnValue - BetValue
    ##
    ##    ReturnValue = round(ReturnValue, 8)
    ############################################################
    ############################################################

        Count = Count + 1
        WaitCount = 0
        while (True):
            # フォームから現在の資産を取得する
            ReturnValue = GetCurrentAmount()    # 例 'BTC (Bitcoin) - 0.01123232 BTC'

            if (LastValue == ReturnValue):      # Result is not yet set
                #print ("Now playing...")
                time.sleep(0.3)                 # Wait for DDoS proof
                WaitCount = WaitCount + 1
                
                if (WaitCount > 33):            # Betting pending (Something strange...)
                    driver.find_element_by_class_name('clDicePlay').click()  # Push button again
                    print ("Push the button again. " )
                continue

            else:
                break
            
            
        if (LastValue > ReturnValue):   # Lose
            BetValue = BetValue * 2     # Apply Martingale method
            LoseCount = LoseCount + 1
            ContinuousLoseCount = ContinuousLoseCount + 1
            
            if (MaxLoseCount < ContinuousLoseCount):
                MaxLoseCount = ContinuousLoseCount
            
        else:                           # Win
            BetValue = InitialValue     # Apply Martingale method
            WinCount = WinCount + 1
            ContinuousLoseCount = 0
            
        LastValue = ReturnValue
        
        print(str(Count) + " Win:" + str(WinCount) + " Lose:" + str(LoseCount) + " MaxLose:" + str(MaxLoseCount) + " Value:" + str(LastValue) )
        
    driver.close()
    driver.quit()

    sys.exit()




プログラム実行

pythonを実行するとchromeが自動的に立ち上がるので、自分のユーザー名とパスワードでyobitにログインします。

毎回pythonを実行すると最初にログインして、おなじみの「私はロボットではありません」というパネルで車選んだり店の外観を選んだりしてロボットではない事を証明して、二段階認証している場合はキャプチャコードを入力します。

この手続きは結構面倒なのでログインも自動化しようと考えましたが「私はロボットではありません」を自動で解除する技術はもちろん持ち合わせていないので自分には無理だと悟りました。
(ていうか逆に解除出来たとしたらグーグルのこのセキュリティはザルだというコトですが...)


無事ログイン出来たらyobitのダイスゲームの画面が表示されると思います。

この時にダイスゲーム画面の "□Show my bets only" にチェックしておくと自分のベットだけが表示されて結果が凄く分かりやすいです。


で、pythonの標準出力に

When logged in manually and got ready, type enter key.

と出てるので、何かENTERキーを押します。


SnapCrab_Python 363 Shell_2018-3-14_20-37-19_No-00


すると自動で最低ベット金額(このソースコードでは0.00000010BTC)が入力されて、( Roll < 48) のボタンが押されてゲームが始まります。

→ 勝ったら再び0.00000010BTCが入力されて( Roll < 48) のボタンが押されてベットされます。

→ 負けたら倍の0.00000020BTCが入力されて( Roll < 48) のボタンが押されてベットされます。
連続して負け続けると、2倍、4倍、8倍... 2n倍 と2倍ずつベット金額が増えていきます。

WinかLostかの結果が表示されたら、次のベットが自動的に始まります。
1回のベットは1秒~1.5秒くらいの間隔です。
(使用環境によっては速くなったり遅くなったりするのでウェイトを調整する必要があります)

以上、プログラムを強制終了するか破産するまで繰り返されます。


これは有名なゲーム理論のマーチンゲール法のアルゴリズムです。
つまり倍掛けゲームです。


これは必勝法でもなんでもないんですが、とりあえずある程度は確率的に資産が増えると思います。


「お、コレは実質錬金術じゃね?ウハウハじゃね?」

と欲張ってずっとプログラムを動かしていると多分いつかは破滅します。潤沢な資金があれば別ですが。


ちなみに0.0025BTCがyobitの口座にある状態で、3時間ほどプログラムを実行した結果、5814回ベットして0.00028830BTC(250円くらい)の儲けが出ました。
この時の連続負け数は14でした。
18回連続で負けてたら破産してたところです。


【試行結果】
SnapCrab_NoName_2018-3-14_20-39-43_No-00



ダイスゲームの(ほぼ)必勝法はあるちゃーあるんですが、ここでは伏せておきます。

上述のpythonサンプルはベタで分かりやすく記述しているので、サンプルのスクリプトを変更して自分なりの必勝アルゴリズムを実装して是非ともウハウハな不労収入生活を送ってみてください!!


本日は以上です。





今、激アツ!の仮想通貨取引所
yobit

ビットコインを買うなら