KOSEN{BLOG}について

Seleniumを用いた自動購入Bot(試作)

はじめに

まずはじめにこの記事は前回の記事の続きです。

とりあえずばばーっと調べながら書いたコードを下に示します。(要素など適当なものに変えてます。)

CAUTION
これを作るまでPythonを触ったことのないもののコードです。ご理解ください。

これをもとに前回の記事で紹介してないSeleniumのコードを紹介出来たらなと思ってます。

また、Seleniumだけでは無理なこともあるので他のPythonのライブラリも使います。
その都度紹介します。

import schedule
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
if __name__ == '__main__':

  url1="login画面のURL"
  url2="購入するもののURL"
  login="mailadless"
  password="password"

def job():
 driver.get(url1)
 driver.find_element_by_id("email").send_keys(login)
 driver.find_element_by_id("password").send_keys(password)
 driver.find_element_by_class_name('btn').send_keys(Keys.ENTER)
 schedule.every().day.at("21:59:30").do(job)
while True:
    schedule.run_pending()
    if schedule.every().day.at("21:59:45"):
        break
        
def job():    
 driver.get(url2)
 driver.find_element_by_id("t").send_keys("2")
 driver.find_element_by_xpath('//*').click()

 driver.find_element_by_id("img").click()
 con_element= driver.find_element_by_id("cvs_select")
 con_select_element = Select(con_element)
 con_select_element.select_by_value("002")
 driver.find_element_by_class_name('agreement').click()
 
 driver.save_screenshot('1.png')
schedule.every().day.at("22:00:00").do(job)
while True:
    schedule.run_pending()

コードの分解

Pythonはimport文を使いライブラリやpipでインストールしたパッケージ、自作のパッケージなどを
インポートし使うことができる。

試行錯誤の末に書けたコードなのでよく見ると結局使わなかったものまで残ってました。
以下はImport文を削ったコードです。(わかりやすいように順番入れ替えてます。)

これから、以下のImport文になぞり上記の全体のコードと合わせて紹介します。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

import schedule

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.support.ui import Select

Chromeをheadlessに

最初のImport文ですが、簡単にいうとchromeをheadlessモードで動くようにするもの

headlessモードというのはGUIでは無くCUIで動作させること。
from selenium.webdriver.chrome.options import Options
options = webdriver.ChromeOptions()
options.add_argument('--headless')
#ヘッドレスモードを有効にする(次の行をコメントアウトすると画面が表示される)。
driver = webdriver.Chrome(options=options)
#ChromeのWebDriverのオブジェクトを作成する。

schedule

import schedule

def job():
    #ここにメインの処理
schedule.every().day.at("21:59:30").do(job)
while True:
    schedule.run_pending()
    if schedule.every().day.at("21:59:45"):
        break

コマンドプロンプトでpipをつかいscheduleをインストールできます。
pip install schedule

ここでは21:59:30になるとメインの処理が行われるように書いてます。
他にも何分毎や曜日指定で実行できるようになります。

keys

from selenium.webdriver.common.keys import Keys

driver.find_element_by_class_name('btn').send_keys(Keys.ENTER)

こちらはキーを入力することができるようになります。
このコードではエンターを入力しています。

以下が主なキーとそのコードです。

コード キー
Keys.DOWN 矢印下
Keys.UP 矢印上
Keys.LEFT 矢印左
Keys.RIGHT 矢印右
Keys.ENTER エンターキー
Keys.RETURN リターンキー
Keys.ESCAPE Escキー
Keys.TAB タブキー

select

from selenium.webdriver.support.ui import Select

 con_element= driver.find_element_by_id("cvs_select")
 # 要素を取得
 con_select_element = Select(con_element)
 # 取得した要素をSelectタグに対応した要素に変化させる
 con_select_element.select_by_value("002")
 # 選択したいvalueを指定

selectはドロップダウンメニューなどSelectタグを扱うことができるようになります。

今回はid要素である”cvs_select”というドロップメニューの”002”という要素を選択しました。

おわりに

これを作る際にPythonの基本的な文法など無知だったので至らない部分もあると思いますが、
形として作れたのでとりあえずは満足しました。

あとはうまーく使ってWEBページの自動操作をおこなえば何とかなると思います。
頑張ってください。

ちなみに楽天チケットとかのreCAPTCHAなどの突破は想定してないので無理です。
初心者が相手するものではないですよ(挑戦はした)

Botの購入の速さはインターネット回線によりますので
チケットなどでいい番号取りたいならより速い回線にしましょう。


今回試作品ですが一応色々調整した完成品を以下の記事で紹介しています。

自動購入Bot完成まで

要らないImport文省いたコードはこちらです。

import schedule
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
if __name__ == '__main__':

  url1="login画面のURL"
  url2="購入するもののURL"
  login="mailadless"
  password="password"

def job():
 driver.get(url1)
 driver.find_element_by_id("email").send_keys(login)
 driver.find_element_by_id("password").send_keys(password)
 driver.find_element_by_class_name('btn').send_keys(Keys.ENTER)
 schedule.every().day.at("21:59:30").do(job)
while True:
    schedule.run_pending()
    if schedule.every().day.at("21:59:45"):
        break
        
def job():    
 driver.get(url2)
 driver.find_element_by_id("t").send_keys("2")
 driver.find_element_by_xpath('//*').click()

 driver.find_element_by_id("img").click()
 con_element= driver.find_element_by_id("cvs_select")
 con_select_element = Select(con_element)
 con_select_element.select_by_value("002")
 driver.find_element_by_class_name('agreement').click()
 
 driver.save_screenshot('1.png')
schedule.every().day.at("22:00:00").do(job)
while True:
    schedule.run_pending()
   

2 COMMENTS

やすひろ

コメント失礼します。このツールはローソンチケットでも可能ですか??

返信する
い。

やすひろさん
コメントありがとうございます。
結論から言いますと、厳しいと思います。
理由としては、ローチケを見てきたところ不正な利用を防ぐためにアイテム認証がありました。
不正な利用はBOTなどによる利用ですね、このアイテム認証を突破するのはかなり難しいと思います。
reCAPTCHAや今回のアイテム認証などBOTの対策をされてると基本的には無理と考えたほうがいいです。
BOT対策されていないサイトだと自分の記事を見ていただけたら比較的簡単に作れるようになると思います。

返信する

コメントを残す

メールアドレスが公開されることはありません。