#自動で購入する君を作る
今回は自動で購入するbotを作成したので備忘録として。
コード全体は載せないけど、これを組み合わせれば自動購入botはほぼ作れます。
#使用するパッケージ
パッケージ | バージョン |
---|---|
datetime | 標準モジュール |
requests | 2.25.1 |
selenium | 3.141.0 |
chromedriver_binary | ブラウザに合わせる |
chromedriver_binaryは下記参照。Chromeのドライバと合わせてインストールします。
ChromeとPythonのchromedriver-binaryのバージョンを合わせたい。
#初期値設定
url = input("購入したいサイトのトップページURL:")
url2 = input("購入するURL:")
login = "ログインID"
password = "パスワード"
options = webdriver.ChromeOptions()
driver = webdriver.Chrome()
ここで初手詰まりポイント。driverのカッコ内を(Options = Options)
としていたが、何故かログインできず。
ログイン時にロボットと勘違いされてしまいます。
#webdriverの設定
def init_condition():
#If you want to run as headless, remove commentout
#options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--disable-desktop-notifications')
options.add_argument("--disable-extensions")#
options.add_argument('--lang=ja')
return
def photo_leading_off():
#Ignore photos
options.add_argument('--blink-settings=imagesEnabled=false')
options.add_argument("--proxy-server='direct://'")
options.add_argument("--proxy-bypass-list=*")
return
webdriver
の動作設定。ここは脳死で書けばほぼ問題なし。
--headless
はコメントアウトしてあるが、読み込み時にブラウザを起動せずにバックグラウンド動作的な感じにしたいときはコメントアウトを外す。
photo_leading_off
は、起動すると画像をすべてすっ飛ばして起動。読み込みが早くなります。
#ログインをする
def login():
driver.find_element_by_link_text("ログイン").click()
driver.execute_script('document.getElementById("login_id").value="%s";' % login)
#For Amazon
#driver.find_element_by_id('continue').submit()
driver.execute_script('document.getElementById("password").value="%s";' % password)
#For check box to remember
#driver.find_element_by_name('rememberMe').click()
driver.find_element_by_class_name('button').submit()
print("\n\n Success login \n\n")
return
ログインは、基本Webサイトを動作するイメージ。
一行目でHTML内から”ログイン”の文字を探しクリック。だいたいログインボタンにはログイン
と書いてあるので結構汎用性あり。
そこから先はログインページの中身次第で” ”内を変更する必要があるが、だいたい似たような名づけをされているのでわかりやすい。
#時間設定
def time_control():
i=0
def job():
print("Start job")
nonlocal i
i=1
return
start = input("開始時間(00:00:00) ")
start1 = datetime.datetime.strptime(start, '%H:%M:%S').time()
start2 = datetime.datetime.combine(datetime.date.today(), start1) + datetime.timedelta(seconds=5)
start3 = start2.strftime("%H:%M:%S")
print("Start at ", start1)
schedule.every().day.at(start3).do(job)
while i==0:
schedule.run_pending()
sleep(1)
return
PC内の時間とリアルタイムの時差をとってプログラムを起動させる。start2内の数字が現実世界との差。
1秒ごとに更新しながら開始時間になったらjob起動するよ!jobが起動するとiが変わって無限ループキャンセルするよ!の意。
ちなみにPythonだと変数は特に指定がない限りすべてGlobalで認識されるらしい。
ただし、jobで変えた変数は返せないので一応nonlocalで定義している。
do()では関数しか入らず、式は入れられないのでiの返り値ではできなかった。
#購入!!!!
def purchace_ticket():
driver.get(url2)
driver.find_element_by_link_text("押したいボタンの名前とか").click()
return
ログインのところとほぼ同じ。
find_elementは適当に使って問題なし。一番明瞭なのはxpathかも。
以上をmainの中に好きな順番で突っ込めば勝手に好きな時間にログイン、購入できる。
訂正やらなにやらあればコメントください!!!!!!!!
*時間設定は実際成功していないので時間やらなにやらもうちょっと色々調整してみてください