KOSEN{BLOG}について

自動購入Bot完成まで

ここは自動購入Bot完成までやってきたことをまとめたページです。

基本的にリンク先を見ればわかるようにしています。

質問などあればコメントなどでしてください。

流れ

手順2
Seleniumでスクレイピング
手順3
パパっとネット見ながら簡単に作成
手順4
問題点の改善
下記に示す

問題点

問題1
時間演算(n分前にログイン処理を行うため)
問題2
要素が見つからない(結果として時間に関する問題だった)
問題3
PC内時間のズレ(インターネット時報とのズレを検出)
問題4
if文でズレを判断し修正

簡単な動作説明

  1. 取りたいチケットのURLを入力
  2. 開始時間を入力
  3. PCとインターネット時報のズレを検出し修正
  4. 2分前にサイトにログイン
  5. 開始時間に購入

とまーざっくりですがこんな感じですね

コード

とりあえず完成したコードの一部を公開します。

作れたことを載せたいのであってこのコードを使えば誰でもできるって訳では無いです。

あくまでも参考程度になればと思ってます。

大半はコピペでいいですが、Amazonだったり楽天だったり自動購入する目的のサイトによってもコードは変わります。

自分は今回は地下アイドルのチケットの購入に使いました。

整理番号1番を取ることもできました

ボタンをクリックや文字を入力などのサイトによって変わるようなものは1部端折ってます。
(載せてても結局サイトによって変わるため)

具体的に変える部分としてはdef()の中身です。

基本動作などほかの記事にしてるため参考にしてみてください。

PythonとSeleniumでスクレイピング Seleniumを用いた自動購入Bot(試作)

作りたいなと思った人は頑張ってください。

未経験独学でもちゃんと作れましたので

import requests
from bs4 import BeautifulSoup
import math
import time
from time import sleep
import datetime
import schedule
from datetime import timedelta
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
options = webdriver.ChromeOptions()
# 必須
options.add_argument('--headless')
options.add_argument('--disable-gpu')
# headlessでは不要そうな機能
options.add_argument('--disable-desktop-notifications')
options.add_argument("--disable-extensions")
# UA
#options.add_argument('--user-agent=puepue')
# 言語
options.add_argument('--lang=ja')
# 画像を読み込まないで軽くする
options.add_argument('--blink-settings=imagesEnabled=false')

options.add_argument("--proxy-server='direct://'")
options.add_argument("--proxy-bypass-list=*")
driver = webdriver.Chrome(chrome_options=options)

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) #指定したdriverに対して最大で10秒間待つように設定する

driver.set_window_size(1045,722) # window size change

url1 = "https://t"
url2 = input("取りたいチケットのURL>")
login = "gmail.com"
password = "k"

start = input("開始時間>")
start1 = datetime.datetime.strptime(start, '%H:%M:%S').time()
start2 = datetime.datetime.combine(datetime.date.today(), start1) - datetime.timedelta(minutes=2)
start3 = start2.strftime("%H:%M:%S")


r = requests.get('https://ntp-a1.nict.go.jp/cgi-bin/jst')
soup = BeautifulSoup(r.text,'lxml')

t1 = soup.find("body").string
t2 = t1.rstrip('\n')
t3 = time.time()
t4 = float(t2)-t3

if t4 >= 0:
    t5 = 0
    t6 = math.ceil(t4)
    t7 = t6 - t4

else:
    t5 = -t4
    t6 = 0
    t7 = 0

start5 = datetime.datetime.combine(datetime.date.today(), start1) + datetime.timedelta(seconds = t6)
start6 = start5.strftime("%H:%M:%S")

def Login():
    driver.get(url1)
    print(datetime.datetime.now())
    print("ログイン出来ました。")

def Main():
    sleep(t5)
    sleep(t7)
    driver.get(url2)

    driver.find_element_by_name('c').submit()
    print(datetime.datetime.now())
    print("get")
    sleep(5)
    driver.quit()
schedule.every().day.at(start3).do(Login)  
schedule.every().day.at(start6).do(Main)  
while True:
  schedule.run_pending()
  time.sleep(0.1)

さいごに

色々調べながら作成しました。

プログラミング初心者でも作れました。努力次第ですね。

これによりPythonの知識もつき良かったです。

これにて自動購入Botの作成は終わりにします。

まだ関係のある記事は書くかもしれませんが笑

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

書籍など買ってみて実践したほうがよりいいと思います。

無料でPythonが学ぶオススメ講座

techgym(テックジム)というプログラミングスクールが初心者向けに週4で無料講座を開いてくれています。

プログラミングの勉強法などから教えてくれます。

直接的に自動購入Botのことやスクレイピングについては学べませんが、

Pythonの基礎が学べるので第一歩としておすすめします。

また、参加後には講座についていけなかったり復習したい方向けに解説動画ももらえます

Python勉強してみたいなーと思っている方は一度参加してみてはいかがでしょうか?

テックジムのサイトはこちら

以下の記事で詳しく書いてみたのでよかったら覗いてみてください。

【無料】ゼロからPython学習したいなら「テックジム」がおすすめ!

チケ発サイトでの攻略・Bot作成

この記事を訪れる方でオタクでチケ発関係を知りたい方が多いです。

その方向けに記事を書いてみました。

チケット購入まとめ:Botや攻略など

お知らせ:自動でページを更新してくれるWEBアプリを開発しました。

今回、WEBアプリで時間になったらページを更新してくれるものを開発しました。

ページ更新君

登録などの詳細は以下の記事になります。

【ページ更新君】DjangoでWEBアプリを開発!

ぜひ活用してみてください。

31 COMMENTS

たなか

すみません
こちらを参考に初心者なりに自動購入のbotを作ろうと努めているのですが、要素を抽出する際にidやnameなどが更新のたびに変わる(クレカの打ち込みです)のですが、具体的にどのようにしたらいいか教えていただけないでしょうか?ここだけ抜けれなくて本当に困ってます泣

返信する
こうせ

たなかさん
コメントありがとうございます。
自分もまだまだなのではっきりこうしたほうがいいとは言えないです。
そのサイトによっても違うと思いますし
ですが、コメントを頂いたので解決方法を探してみたいです。
いくつかこうしたらできるのでは?、と思いついたので試してみたいです。
よければどのサイトか教えていただけないでしょうか?
ここで言いにくいのであれば「KosenBlog@gmail.com」こちらでも大丈夫です。

返信する

コメント失礼します、こちらから購入をお願いすることは可能でしょうか?

返信する
こうせ

コメントありがとうございます。
すみませんが基本的にそれはできかねます。
理由としてはスケジュールの問題や費用の問題です。
正直作成したり調整したりなどを含めると高額になります。
自分で使っているならついでにお小遣い稼ぎ程度にしてもいいですが、現在自分は用がなくなり使用していないため費用は割高になるでしょう。
あとは単純に問題回避です。
取れなかったり番号が悪かったりした場合トラブルとかにもなりかねないので

返信する

はじめまして。プログラミング初心者です。
(こちらのコメントは公開されるため、名前は非公開とさせてください)

現在、はじめて同じ用途での自動購入botを作成中なのですが、うまくいかないため
ご相談させていただければと思いコメントさせていただきました。

もしお時間ありましたらご相談させていただきたく存じます。
問題なければ、記載いただいているメールアドレスにお送りさせていただいても
よろしいでしょうか?

返信する
木場

はじめまして木場と申します。
図々しくて大変申し訳ないのですが、お願いがございます。

指定時間にならないと、商品ページが表示されない場合のコードを載せてもらえないでしょうか?
無理を言いまして、申し訳ございません。

返信する
こうせ

木場さんコメントありがとうございます。
時間指定からdriver.get()で飛べると思います。
時間指定はScheduleを使います。Schedule
事前にURLがわからない場合この方法は使えないです。

返信する
木場

URLがわからないサイトです
とりあえず頑張ってみます

不躾なお願いですのに、教えて下さりありがとうございました‍♀️

返信する
tech

こうせさんのコードを参考に私もbotを作成中なのですが、プルダウン?ドロップダウン?のあるチケットの枚数の選択が上手くできません。
以下のように欲しいチケットのidを〜に書き、セレクト関数で指定して、枚数をvalue値で指定するプログラムです。idで上手く指定出来ていないのかなと考えて、classnameやxpathで指定しても上手く出来ませんでした。
con_element= driver.find_element_by_id(“〜”)
con_select_element = Select(con_element)
con_select_element.select_by_value(“1”)
ログインするのは出来たのでここを突破出来れば完成できそうです…
御手数ですが、なにかアドバイスを頂けたら幸いです。

返信する
こうせ

どのサイトでしょうか?
ノンヘッドレスで動きを確かめてみる。というのも一つの手です。
あとは指定要素にcss_selectorを使うと便利で使いやすいですよ

tech

アドバイスありがとうございます。livepocketというサイトです。
アドバイスを参考に挑戦してみます!

こうせ

ライポケだとうまくいくはずですよ
自分も作ったことあるので。
頑張ってください!

名無し

コメント失礼します。
47行目にある、r = requests.get(‘https://ntp-a1.nict.go.jp/cgi-bin/jst’)というコードで質問があるのですが、ここにあるgetの引数には何を入れればよいのでしょうか?

返信する
こうせ

getの引数にはURLを入れます。
このやり方は時報とpc内部の時間差で時間調整をしています。
しかし、現在時報の方で取得できない状況で多分エラーが出ているかと思います。
他のやり方でやるしかないですね。

返信する

初めまして。

記事を参考に自動購入botをプログラミングさせて頂いています。
クレジットカード番号の自動入力等、質問したいことがいくつかあります。メールを送らせていただこうと思っているのですが、宜しいでしょうか。

返信する
tech

コメント失礼します。
ライポケ用のbotが完成し、ノンヘッドレスで挙動を確かめて上手く実行できて購入できたのですが、ヘッドレスにするとエラーになるのですが、どういった原因が考えられるか心当たりがございましたらご教授お願いします。ヘッドレスにするのにこのサイトのコードをコピーして使用したためタイプミスなどでは無いはずです。

返信する
こうせ

自分は前にページ遷移の際にスクショをとって確認したことが何回かありました。
原因としては以下があげられます。
・スタート時間になっていない(時間が少し早かった)
・アクセス集中になってた
・ページ遷移の際に遷移していないのにコードが実行された(待機処理など必要)
多分細かいとこでちょっとしたエラーが起きていると思います。
このブログのコードも参考程度のコードなので。

返信する
tech

アドバイスを参考にやっと動きました。ありがとうございました。
最後に一つだけお伺いしたいのですが、コードの中で t7 = t4 – t6 のような記述で、PC内蔵時計のずれを解消していると思うのですが、math.ceilで小数の切り上げを行ったt6の方が大きくなり、負の値になりこのままではエラーが起きませんか?
例えば、t4が0.5くらいの場合、t6が1になりsleepで-0.5秒待機のようなコードになると思います。t7 = t6 – t4のミスでしょうか?

返信する
こうせ

いま見返すと確かにその通りだと思いました。
たまにエラー出てん?となったことがあったんですけどそのままでした。
試してないので何とも言えないですがt7 = t6 – t4であっていますか?
多分あっているとは思いますが、しっかりあっていることが確認できれば変更しておきます。

返信する
tech

t6 – t4で上手く行きました。また理論的にも合っていると思います。
こうせさんのコード中にも書かれているNICTが提供してくれている日本標準時のサイトがかなりの頻度で落ちていて、代わりを探しているのですが、なかなか日本標準時を取得できそうなサイトがないのですが、なにか良い方法がありませんか?

こうせ

ありがとうございます。
変わりは自分は今はPythonだと「ntplib」というのが一番いいかなと思っています。
詳しくは調べてみてください。
同じような使い方ができます。

てて

tigetでチケットを見るボタンにあるurlを取得しようとすると、ログイン前のurlしか取れないのですが回避方法はありますか?

返信する
すけのまつ

以前頂いたアドバイスを元にntplibで組んでみました
今のところ機嫌良く動いてくれています
現在はスタート時間を早めに設定しJSTとOS時間の差分をスリープ時間に反映させていますがntplibだと直接OS時間を修正できるようです
先々実装したいのですが参考になる情報があまり無いですね…

返信する
こうせ

遅くなりました。
直接OS時間修正できると楽になりますね!
ぱっと調べただけですがhttps://qiita.com/kotaronov27/items/dd6869ff092696702772
こんな感じのを参考にしてみてはいかがですか?

返信する
すけのまつ

そうなんですよ!
ざっくり調べるとそのページとコメントが中国語のサイトくらいしか見つからないんです
あんまり需要無いんですかね笑

次はスクレイピングでやりたいことがあるのでbsとpandasを勉強します
引き続きよろしくお願いします

返信する
こうせ

んー需要はありそうですけど、セットするってよりかは取得のほうが使う場面が多いんでしょうね笑
分からないですけど

自分はもうやりたいことが特になくなりました笑
頑張ってくださいね!

返信する

木場 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です