楽天ラッキーくじを自動化する【ポイント不労所得】

未分類
この記事は約11分で読めます。
本サイトはアフィリエイトリンクを使用しています。

こんにちは!

楽天には「ラッキーくじ」と呼ばれるくじがあります。

楽天ラッキーくじ
楽天ラッキーくじ

くじによりますが、当選すると1ポイントから最大1000ポイントほど当たるというくじです。
もっとも当たってもせいぜい10ポイントが関の山ですが…笑

ただこちらのくじは、種類が非常に多く、つねに40種類ほど用意されています。
これらのくじを自動的に引けばひょっとしたらポイントが大量に手に入るかもしれないと思い、自動化をしようと思い立ちました!

以下では自動化の方法、自動化した結果について解説していきます。
また以下の方法はPython、seleniumの環境があることを前提にしていますので、ご承知おき下さい。

自動化の手順

全体の構成

まず全体の構成として、くじ一覧を取得するところから始めます。
その後、各くじに順番にアクセスし、それぞれのくじを引くということを延々と繰り返します。
ただそれだけなので、それほど複雑にはなりません。

seleniumの準備

seleniumは既に準備済であるとして話を進めます!

#seleniumのインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from tqdm import tqdm

#ユーザーディレクトリの指定
user_profile = r'ユーザーディレクトリを指定する'

#Chromeドライバーの設定
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + user_profile)
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')

# Chromeドライバーの起動
driver = webdriver.Chrome(r'ドライバのディレクトリ', chrome_options=options)

まずseleniumをインポートします。
その後に、ユーザーディレクトリを指定する必要があります。

ユーザーディレクトリとは、ログイン情報などを保存するディレクトリです。
楽天ラッキーくじを引くには楽天にログインする必要があるのですが、毎回ログインし直すのは大変なので、ユーザーディレクトリを指定し、ログイン情報を保存するようにしています。
また初回は、一度手動で楽天にログインをする必要があります。

ユーザーディレクトリにはPythonファイルを置いてあるのと同じディレクトリを指定すればよいでしょう。
この際、相対パスでディレクトリを指定すると、バグが生じることがあります。
絶対パスで指定するようにしましょう!

その後にChromeドライバを起動します。
ドライバもPythonファイルと同一のディレクトリに保存するのが良いでしょう。

くじ一覧を取得

くじ一覧を取得するに当たって、非常に役に立つサイトがこちらになります。

楽天ラッキーくじ一覧
楽天ラッキーくじをまとめた一覧です。PC版、スマホ版両方掲載。

こちらのページは楽天ラッキーくじをまとめてくださっています(非常にありがたい…!)。
そこからくじの一覧をスクレイピングさせていただきます。

driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")

#リスト内包表記
url_txts = [url.get_attribute("href") for url in urls]

こちらで一旦くじのリンクのリストをurlsに代入したあと、for文でくじのリンクのテキストをurl_txtsという変数に代入しています。

各くじにアクセスし、くじを引いていく

まずソースコードを載せます。

for url_txt in tqdm(url_txts):

#URLにリダイレクトを含む時、上手くくじを引けないので、まず除外します
    if 'redirect' in url_txt:
        print(f'{url_txt}はリダイレクトを含むのでスキップします')
        continue
    try:
        driver.get(url_txt)
    except:
        print(f'{url_txt}に遷移出来ませんでした。')
        continue
    
    print(f"Accessing:{url_txt}")
    #もしくじを引くボタン(entry)が存在したら

  #entryボタンの有無を、配列の長さから判定します
    if(len(driver.find_elements(By.ID, "entry"))>0):
        print("くじを引きます")
        time.sleep(2)
        try:
            start_button = driver.find_element(By.ID, "entry")
            start_button.click()
            #webdriverwaitを使用して、くじを引いているURLから別のURLに変化するまで待ちます
            WebDriverWait(driver,60).until(EC.url_changes(url_txt))
        except:
            print('くじを引くボタンはありましたが、押せませんでした')
    #くじを引くボタンがなかった時
    else:
        try:
            print("くじを引くボタンがありませんでした")
            time.sleep(1)
        except Exception as e:
            print('不明なエラーが発生しました')
            print(f'エラー内容{e.message}')
            time.sleep(1)
driver.close()
driver.quit()
exit()

ページにアクセス→くじが引けるときは引き、引けない時は次のくじに遷移する→すべて終了したらseleniumとpythonファイルを終了する
という流れになります。

実際にやってみた

実際にプログラムを実行してみました。
Windowsの定期実行でやっても良かったのですが、どうせPCに触ることは多いので、デスクトップ上に上のコードを実行するbatファイルを置き、気が向いたら押すというアナログな方法をとっています笑
レンタルサーバーなんて借りようものなら絶対に元が取れないので…

その結果、一日0ポイント~10ちょいポイントほどゲットできています。
ただ最頻値は2ポイントくらいの印象です。割に合わない…
でも貰えるものはもらっておくの精神で気が向いたら実行しています笑

注意点:headlessモードだと上手く動かなくなった

chromeのバージョンを98.0.4758.102にした影響か、headlessモードにするとユーザーディレクトリが上手く読み込めず、毎回ログインを要求されるという事態に陥っています。
つい最近までは上手く行っていたのですが…

(追記)
バージョン100.0.4896.127でも変わらずに、headlessモードではuser directoryが上手く読み込めない状態です。
どうやらselenium側のバグのようです。

ソースコード

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
from tqdm import tqdm

#ユーザープロフィールの作成
user_profile = r'ユーザーディレクトリを指定する'

#Chromeオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--no-sandbox')
options.add_argument('--lang=ja')
options.add_argument('--user-data-dir=' + userdata)
options.add_argument('--user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_2 like Mac OS X) AppleWebKit/602.3.12 (KHTML, like Gecko) Version/10.0 Mobile/14C92 Safari/602.1')


#
# Chromeドライバーの起動
#
driver = webdriver.Chrome(r'driver/chromedriver.exe', chrome_options=options)

# くじ一覧にアクセスする
driver.get("https://rakucoin.appspot.com/rakuten/kuji/")
urls = driver.find_elements_by_xpath ("//table/tbody/tr/td/a")

#リスト内包表記
url_txts = [url.get_attribute("href") for url in urls]

for url_txt in tqdm(url_txts):
    if 'redirect' in url_txt:
        print(f'{url_txt}はリダイレクトを含むのでスキップします')
        continue
    try:
        driver.get(url_txt)
    except:
        print(f'{url_txt}に遷移出来ませんでした。')
        continue
    
    print(f"Accessing:{url_txt}")
    #もしくじを引くボタン(entry)が存在したら
    if(len(driver.find_elements(By.ID, "entry"))>0):
        print("くじを引きます")
        time.sleep(2)
        try:
            start_button = driver.find_element(By.ID, "entry")
            start_button.click()
            WebDriverWait(driver,60).until(EC.url_changes(url_txt))
        except:
            print('くじを引くボタンはありましたが、押せませんでした')
    #くじを引くボタンがなかった時
    else:
        try:
            print("くじを引くボタンがありませんでした")
            time.sleep(1)
        except Exception as e:
            print('不明なエラーが発生しました')
            print(f'エラー内容{e.message}')
            time.sleep(1)
driver.close()
driver.quit()
exit()

コメント