MENU

農村の茶番ダウンロード

目次

ダウンロード

var0.1.1
・大進歩カードの使用時に音声が再生されない問題を解決しました。

var0.1.1ダウンロード↓

https://drive.google.com/file/d/1xZrVaZ8AU7Cl90toeZ4O-rLAAQUEdQ1g/view?usp=drive_link

var0.1.0
・ドラフトbgmを追加しました。
・大進歩,生食い,物乞いbgmを追加しました。
・bgaの仕様変更に伴い音声再生が行われなくなっていた問題を解決しました。
・bgaの仕様変更に伴い自動ログインができなくなっていた問題を修正しました。
・各収穫の終わりにスクリーンショットをとる機能を追加しました。

var0.1.0ダウンロード↓

https://drive.google.com/file/d/1O3ssSMT7xScmAOPMjL_F4UPp7IvcvFgi/view?usp=drive_link

var0.0.3
・ゲームプレイ時アクションカードが捲れた時の音声がならない問題を修正しました。

var0.0.3ダウンロード↓

https://drive.google.com/file/d/1A_gMXrSphiX3WYmoUQQKS81b-Q-tQ5QL/view?usp=drive_link

var0.0.2
・ゲーム終了時にブラウザが終了しないようにしました。
・アクションスペースを踏んだ際に音声再生が2回行われることがある問題を修正しました。

var0.0.2ダウンロード↓

https://drive.google.com/file/d/1_YadiM344qk1W-Y2CWIUaka0cSRVVo8a/view?usp=sharing

var0.0.1ダウンロード↓

https://drive.google.com/file/d/1OEIRYlbaawsJJISEhvTa10o_u5Q3HvC9/view?usp=shar

ソースコード

音声の著作権の問題で以下のコードと音声ファイルやアイコン画像をpyinstallerでコンパイルしました。

var0.1.1

・大進歩カードの使用時に音声が再生されない問題を解決しました。

import os
import sys
import pygame
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.common.keys import Keys
import time
from datetime import datetime

# pygame用の初期化(失敗時にログ出力)
try:
    pygame.mixer.init()
    print("pygame.mixer.init() succeeded.")
except pygame.error as e:
    print("pygame.mixer.init() failed:", str(e))
    # pygameの初期化に失敗した場合、音声関連の機能が動作しないことを示すエラーメッセージ
    print("Pygameミキサーの初期化に失敗しました。音声は再生されません。")
    print("オーディオデバイスが利用可能か、または他のアプリケーションで使用されていないか確認してください。")

#ドラフト音楽再生初期設定
is_draft_bgm_playing = False

# 音声再生パス指定関数
def resource_path(relative_path):
    """リソースファイルのパスを取得します。_MEIPASS変数が定義されている場合、そのパスを使用します。"""
    try:
        # PyInstallerは一時フォルダを作成し、そのパスを _MEIPASS に格納する
        base_path = sys._MEIPASS
    except Exception:
        # 開発時は、スクリプトファイルがあるディレクトリを基準にする
        base_path = os.path.abspath(".")
    # 'sounds' フォルダとファイル名を結合する
    return os.path.join(base_path, "sounds", relative_path)


# ファイル内容を読み込む関数
def read_file_content(filename):
    """指定されたファイル名から内容を読み込んで返します。"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read().strip()
    except FileNotFoundError:
        # ファイルが見つからない場合はNoneを返す
        return None
    
# 設定ファイル名
bgm_setting_file = 'ドラフトBGM設定.txt'
play_draft_bgm = True  # デフォルトでは再生する

# 設定ファイルを読み込む
bgm_setting_content = read_file_content(bgm_setting_file)

# ファイルの内容をチェック
if bgm_setting_content == "再生しない":
    play_draft_bgm = False
    print(f"INFO: '{bgm_setting_file}' の設定により、ドラフトBGMは再生されません。")
else:
    print(f"INFO: ドラフトBGMは再生されます。('{bgm_setting_file}' が存在しないか、内容が '再生しない' ではありません。)")

def is_browser_open(driver):
    """ブラウザのセッションがまだ有効かチェックします。"""
    try:
        # ドライバーがまだページを取得できるかどうかを確認する簡単なチェック
        driver.current_url
        return True
    except WebDriverException:
        return False
    
# スクリーンショット保存用のディレクトリ作成
screenshot_dir = "screenshot"
if not os.path.exists(screenshot_dir):
    os.makedirs(screenshot_dir)

# スクリーンショットの連番
screenshot_counter = 0

# ユーザーネームとパスワードのファイルから内容を読み込む
username = read_file_content('ユーザー名.txt')
password = read_file_content('パスワード.txt')

# BGM(music)と効果音(Sound)を共存させるため、効果音再生をSoundオブジェクトに変更
def play_sound_if_needed(current_content, previous_content, keywords, sound_files):
    """指定されたキーワードが現在のコンテンツに含まれていて、前のコンテンツと異なる場合に音声を再生します。"""
    if current_content != previous_content and any(keyword in current_content for keyword in keywords):
        try:
            chosen_sound_file = random.choice(sound_files)
            # Soundオブジェクトを作成して再生(BGMと共存可能)
            sound = pygame.mixer.Sound(resource_path(chosen_sound_file))
            sound.play()
            return True
        except pygame.error as e:
            print(f"Failed to load or play {chosen_sound_file}: {e}")
            print("音声ファイルのロード失敗。デフォルトの'汎用.wav'を再生します。")
            try:
                # デフォルトサウンドを再生
                default_sound = pygame.mixer.Sound(resource_path('汎用.wav'))
                default_sound.play()
                return True
            except pygame.error as e_default:
                print(f"デフォルトの '汎用.wav' の再生にも失敗しました: {e_default}")
                return False
    return False

# Chrome オプションの設定
options = webdriver.ChromeOptions()
options.headless = False  # 音声再生が必要なので、ヘッドレスモードはオフ

# seleniuManagerを使用してChromeDriverを設定
driver = webdriver.Chrome(options=options)

# 監視するページにアクセス
driver.get('https://boardgamearena.com/lobby')

if username and password:
    try:
        # サイトが開くまで待機
        time.sleep(2)
        
        # ユーザー名を入力してEnter
        # BGAは最初に表示される入力フィールドにフォーカスが当たっていることを想定
        username_input = driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.space-y-4 > form > div.bga-emailfield > div > input')
        username_input.send_keys(username)
        username_input.send_keys(Keys.ENTER)
        print("ユーザー名を入力しました。")

        # パスワード入力画面に切り替わるのを待機
        time.sleep(2)

        # パスワードを入力してEnter
        password_input = driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > form > div.space-y-2 > div.bga-account-manager-form__password-field > div > input')
        password_input.send_keys(password)
        password_input.send_keys(Keys.ENTER)
        print("パスワードを入力しました。")
        
        # ログイン成功をチェック(例: ユーザー名が表示される要素を探す)
        time.sleep(2)  # ログイン処理とページ遷移を待つ
        driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div.text-center.items-center.space-y-4 > div.space-y-2 > div.text-xs.text-bga-gray-78.bga-registration-form__letsplay_button > div > div > a')  # ログイン後に出現する要素
        print("ログインに成功しました。")
    except Exception as e:
        print(f"ログインに失敗しました: {e}")
        print("ログインに失敗したため、HTMLの監視と音声再生に移行します。")
else:
    print("Username or password file is missing.")
    print("ログイン情報を読み込めなかったため、HTMLの監視と音声再生に移行します。")

previous_content = None  # 前回の特定の条件を満たす要素の内容を保存

try:
    while True:
        if not is_browser_open(driver):
            print("ブラウザが閉じられました。プログラムを終了します。")
            break

        try:
            try:
                draft_wrapper = driver.find_elements(By.CSS_SELECTOR, '#draft-wrapper.active')
                
                # BGM再生が有効で、ドラフト画面が表示され、かつBGMが再生されていない場合
                if play_draft_bgm and draft_wrapper and not is_draft_bgm_playing:
                    try:
                        # BGMファイルをロードしてループ再生を開始
                        pygame.mixer.music.load(resource_path('ドラフト職業シンポタイム.wav'))
                        pygame.mixer.music.play(-1)  # -1を指定するとループ再生
                        is_draft_bgm_playing = True
                        print("ドラフトBGMを開始しました。")
                    except pygame.error as e:
                        print(f"ドラフトBGMの再生に失敗しました: {e}")

                # ドラフト画面がなく、かつBGMが再生されている場合
                elif not draft_wrapper and is_draft_bgm_playing:
                    # BGMを停止
                    pygame.mixer.music.stop()
                    is_draft_bgm_playing = False
                    print("ドラフトBGMを停止しました。")
                    
            except Exception as e:
                # print('ループ内エラー:', e)
                pass # エラーが発生しても処理を継続

            # ログ要素を取得
            log_elements = driver.find_elements(By.CSS_SELECTOR, '[id^="log_"]')

            found_element = None
            event_type = None # イベントの種類を管理 ('raw_eat', 'begging', 'text')

            # 最新のログから順に条件に合うものを探す
            for element in log_elements:
                try:
                    # 生食い(穀物/野菜)のチェック
                    # 条件:テキストに '(' が含まれていないこと
                    if "(" not in element.text:
                        has_grain = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-grain'))
                        has_vegetable = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-vegetable'))
                        has_food = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-food'))

                        if (has_grain and has_food) or (has_vegetable and has_food):
                            found_element = element
                            event_type = 'raw_eat'
                            break  # 条件に一致したのでループを抜ける

                    # 物乞い(生食い)のチェック
                    if element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-begging'):
                        found_element = element
                        event_type = 'begging'
                        break  # 条件に一致したのでループを抜ける

                    # 既存のテキストベースのチェック
                    text = element.text
                    if "に家族コマを置いた" in text or "アクションが使えるようになった" in text or "収穫の開始" in text or "ゲーム終了" in text or "is" in text or "かまど" in text or "調理場" in text or "井戸" in text or "レンガ窯" in text or "石窯" in text or "家具製作所" in text or "製陶所" in text or "かご製作所" in text:
                        found_element = element
                        event_type = 'text'
                        break  # 条件に一致したのでループを抜ける

                except StaleElementReferenceException:
                    continue  # エレメントが古くなっていればスキップ
            
            if found_element:
                current_content = ""
                if event_type == 'raw_eat':
                    # 生食いイベントの場合、ログIDを使ってユニークな識別子を作成
                    current_content = "raw_eat_event_" + found_element.get_attribute('id')
                    print(f"生食い(穀物/野菜)を検出しました: {found_element.text}")
                elif event_type == 'begging':
                    # 物乞いイベントの場合
                    current_content = "begging_event_" + found_element.get_attribute('id')
                    print("物乞いを検出しました。")
                elif event_type == 'text':
                    # 通常のテキストイベント
                    current_content = found_element.text
                    print("Latest matching log text:", current_content)
                    # 最初の文字が"は"であれば後続の処理をスキップ
                    if current_content.startswith("は"):
                        continue  # 次のループへ移る
                
                # --- ここから音声再生処理 ---

                # 生食い(穀物/野菜)の音声再生
                if play_sound_if_needed(current_content, previous_content, ["raw_eat_event_"], ['生食い.wav']):
                    previous_content = current_content
                # 物乞いの音声再生
                elif play_sound_if_needed(current_content, previous_content, ["begging_event_"], ['物乞い.wav']):
                    previous_content = current_content
                # 踏んだ時の処理
                elif play_sound_if_needed(current_content, previous_content, ["「窪地」","「粘土坑」"], ['泥踏み1.wav','泥踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「森林」","「小さな森」","「雑木林」"], ['木.wav','汎用.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「資材市場」"], ['石葦飯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「葦原」"], ['葦原踏み1.wav','葦原踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「小劇場」","「漁」"], ['食料累積1.wav','食料累積2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「集会所」"], ['集会所踏み1.wav','集会所踏み2.wav','集会所踏み3.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「小麦の種」"], ['小麦踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農地」"], ['畑踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「授業」"], ['授業踏み1.wav','授業踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「日雇い労働者」"], ['日雇い踏み1.wav','日雇い踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「家畜市場」"], ['家畜市場踏み1.wav','家畜市場踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「羊市場」"], ['羊踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「大きい進歩」"], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「柵」"], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「穀物活用」"], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「家の建て直し」"], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「西の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「子供がほしい」"], ['子供踏み.wav','子供踏み2.wav','子供踏み3.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「猪市場」"], ['豚踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「野菜の種」"], ['野菜踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「東の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「牛市場」"], ['牛踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「耕作」"], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「急いで子供がほしい」"], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場の再開発」"], ['改築柵.wav']):
                    previous_content = current_content
                #めくれた時の処理リプレイ
                elif play_sound_if_needed(current_content, previous_content, ["__羊市場__ "], ['羊めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__大きい進歩__ "], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__柵__ "], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__穀物活用__ "], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__家の建て直し__ "], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__西の石切り場__ "], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__子供がほしい__ "], ['子供めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__猪市場__ "], ['豚めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__野菜の種__ "], ['野菜めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__東の石切り場__ "], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__牛市場__ "], ['牛めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__耕作__ "], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__急いで子供がほしい__ "], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__農場の再開発__ "], ['改築柵.wav']):
                    previous_content = current_content
                #めくれた時の処理リアルタイム
                elif play_sound_if_needed(current_content, previous_content, ["羊市場 is"], ['羊めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["大きい進歩 is"], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["柵 is"], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["穀物活用 is"], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["家の建て直し is"], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["西の石切り場 is"], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["急いで子供がほしい is"], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["猪市場 is"], ['豚めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["野菜の種 is"], ['野菜めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["東の石切り場 is"], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["牛市場 is"], ['牛めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["耕作 is"], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["子供がほしい is"], ['子供めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["農場の再開発 is"], ['改築柵.wav']):
                    previous_content = current_content
                #収穫の開始
                elif play_sound_if_needed(current_content, previous_content, ["収穫の開始"], ['収穫の開始.wav']):
                    # スクリーンショットを撮影
                    screenshot_counter += 1
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")  # タイムスタンプを追加
                    screenshot_path = os.path.join(screenshot_dir, f"screenshot_{screenshot_counter:04}_{timestamp}.png") # ファイル名にカウンターとタイムスタンプを追加
                    driver.save_screenshot(screenshot_path)
                    print(f"Screenshot saved to: {screenshot_path}")
                    previous_content = current_content
                #ゲーム終了時の処理
                elif play_sound_if_needed(current_content, previous_content, ["ゲーム終了"], ['ゲーム終了.wav']):
                    # スクリーンショットを撮影
                    screenshot_counter += 1
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")  # タイムスタンプを追加
                    screenshot_path = os.path.join(screenshot_dir, f"screenshot_{screenshot_counter:04}_{timestamp}.png") # ファイル名にカウンターとタイムスタンプを追加
                    driver.save_screenshot(screenshot_path)
                    print(f"Screenshot saved to: {screenshot_path}")
                    previous_content = current_content
                #大進歩獲得時の処理
                elif play_sound_if_needed(current_content, previous_content, ["かまど(大きい進歩カード)をプレイ(建設)した"], ['かまど.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["調理場(大きい進歩カード)をプレイ(建設)した"], ['調理場.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["井戸(大きい進歩カード)をプレイ(建設)した"], ['井戸.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["レンガ窯(大きい進歩カード)をプレイ(建設)した"], ['レンガ窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["石窯(大きい進歩カード)をプレイ(建設)した"], ['石窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["家具製作所(大きい進歩カード)をプレイ(建設)した"], ['家具製作所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["製陶所(大きい進歩カード)をプレイ(建設)した"], ['製陶所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["かご製作所(大きい進歩カード)をプレイ(建設)した"], ['かご製作所.wav']):
                    previous_content = current_content
                #大進歩使用時の処理
                elif play_sound_if_needed(current_content, previous_content, ["(かまど)"], ['かまど.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(調理場)"], ['調理場.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(レンガ窯)"], ['レンガ窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(石窯)"], ['石窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(家具製作所)"], ['家具製作所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(製陶所)"], ['製陶所食料.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(かご製作所)"], ['かご製作所食料.wav']):
                    previous_content = current_content

        except Exception as e:
            # print('ループ内エラー:', e)
            pass # エラーが発生しても処理を継続
        time.sleep(1)

except Exception as e:
    print('エラーが発生しました:', e)
    with open('エラー.txt', 'w', encoding='utf-8') as error_file:
        error_file.write(str(e))

finally:
    if 'driver' in locals() and is_browser_open(driver):
        driver.quit()
    print("プログラムを終了します。")

var0.1.0

・ドラフトbgmを追加しました。
・大進歩,生食い,物乞いbgmを追加しました。
・bgaの仕様変更に伴い音声再生が行われなくなっていた問題を解決しました。
・bgaの仕様変更に伴い自動ログインができなくなっていた問題を修正しました。
・各収穫の終わりにスクリーンショットをとる機能を追加しました。

import os
import sys
import pygame
import random
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.common.keys import Keys
import time
from datetime import datetime

# pygame用の初期化(失敗時にログ出力)
try:
    pygame.mixer.init()
    print("pygame.mixer.init() succeeded.")
except pygame.error as e:
    print("pygame.mixer.init() failed:", str(e))
    # pygameの初期化に失敗した場合、音声関連の機能が動作しないことを示すエラーメッセージ
    print("Pygameミキサーの初期化に失敗しました。音声は再生されません。")
    print("オーディオデバイスが利用可能か、または他のアプリケーションで使用されていないか確認してください。")

#ドラフト音楽再生初期設定
is_draft_bgm_playing = False

# 音声再生パス指定関数
def resource_path(relative_path):
    """リソースファイルのパスを取得します。_MEIPASS変数が定義されている場合、そのパスを使用します。"""
    try:
        # PyInstallerは一時フォルダを作成し、そのパスを _MEIPASS に格納する
        base_path = sys._MEIPASS
    except Exception:
        # 開発時は、スクリプトファイルがあるディレクトリを基準にする
        base_path = os.path.abspath(".")
    # 'sounds' フォルダとファイル名を結合する
    return os.path.join(base_path, "sounds", relative_path)


# ファイル内容を読み込む関数
def read_file_content(filename):
    """指定されたファイル名から内容を読み込んで返します。"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read().strip()
    except FileNotFoundError:
        # ファイルが見つからない場合はNoneを返す
        return None
    
# 設定ファイル名
bgm_setting_file = 'ドラフトBGM設定.txt'
play_draft_bgm = True  # デフォルトでは再生する

# 設定ファイルを読み込む
bgm_setting_content = read_file_content(bgm_setting_file)

# ファイルの内容をチェック
if bgm_setting_content == "再生しない":
    play_draft_bgm = False
    print(f"INFO: '{bgm_setting_file}' の設定により、ドラフトBGMは再生されません。")
else:
    print(f"INFO: ドラフトBGMは再生されます。('{bgm_setting_file}' が存在しないか、内容が '再生しない' ではありません。)")

def is_browser_open(driver):
    """ブラウザのセッションがまだ有効かチェックします。"""
    try:
        # ドライバーがまだページを取得できるかどうかを確認する簡単なチェック
        driver.current_url
        return True
    except WebDriverException:
        return False
    
# スクリーンショット保存用のディレクトリ作成
screenshot_dir = "screenshot"
if not os.path.exists(screenshot_dir):
    os.makedirs(screenshot_dir)

# スクリーンショットの連番
screenshot_counter = 0

# ユーザーネームとパスワードのファイルから内容を読み込む
username = read_file_content('ユーザー名.txt')
password = read_file_content('パスワード.txt')

# BGM(music)と効果音(Sound)を共存させるため、効果音再生をSoundオブジェクトに変更
def play_sound_if_needed(current_content, previous_content, keywords, sound_files):
    """指定されたキーワードが現在のコンテンツに含まれていて、前のコンテンツと異なる場合に音声を再生します。"""
    if current_content != previous_content and any(keyword in current_content for keyword in keywords):
        try:
            chosen_sound_file = random.choice(sound_files)
            # Soundオブジェクトを作成して再生(BGMと共存可能)
            sound = pygame.mixer.Sound(resource_path(chosen_sound_file))
            sound.play()
            return True
        except pygame.error as e:
            print(f"Failed to load or play {chosen_sound_file}: {e}")
            print("音声ファイルのロード失敗。デフォルトの'汎用.wav'を再生します。")
            try:
                # デフォルトサウンドを再生
                default_sound = pygame.mixer.Sound(resource_path('汎用.wav'))
                default_sound.play()
                return True
            except pygame.error as e_default:
                print(f"デフォルトの '汎用.wav' の再生にも失敗しました: {e_default}")
                return False
    return False

# Chrome オプションの設定
options = webdriver.ChromeOptions()
options.headless = False  # 音声再生が必要なので、ヘッドレスモードはオフ

# seleniuManagerを使用してChromeDriverを設定
driver = webdriver.Chrome(options=options)

# 監視するページにアクセス
driver.get('https://boardgamearena.com/lobby')

if username and password:
    try:
        # サイトが開くまで待機
        time.sleep(2)
        
        # ユーザー名を入力してEnter
        # BGAは最初に表示される入力フィールドにフォーカスが当たっていることを想定
        username_input = driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.space-y-4 > form > div.bga-emailfield > div > input')
        username_input.send_keys(username)
        username_input.send_keys(Keys.ENTER)
        print("ユーザー名を入力しました。")

        # パスワード入力画面に切り替わるのを待機
        time.sleep(2)

        # パスワードを入力してEnter
        password_input = driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > form > div.space-y-2 > div.bga-account-manager-form__password-field > div > input')
        password_input.send_keys(password)
        password_input.send_keys(Keys.ENTER)
        print("パスワードを入力しました。")
        
        # ログイン成功をチェック(例: ユーザー名が表示される要素を探す)
        time.sleep(2)  # ログイン処理とページ遷移を待つ
        driver.find_element(By.CSS_SELECTOR, '#account-module > div.bga-account-manager-form.rounded-lg.shadow-xl.pb-2.flex.mobile\:flex-col-reverse.desktop\:flex-row.w-min.mx-auto.svelte-8a71si > div.bga-account-manager-form--grid.w-min.desktop\:mb-4.svelte-8a71si > div > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div > div.grid.h-full.w-full > div.top-0.duration-300.row-span-full.col-span-full.delay-300 > div.text-center.items-center.space-y-4 > div.space-y-2 > div.text-xs.text-bga-gray-78.bga-registration-form__letsplay_button > div > div > a')  # ログイン後に出現する要素
        print("ログインに成功しました。")
    except Exception as e:
        print(f"ログインに失敗しました: {e}")
        print("ログインに失敗したため、HTMLの監視と音声再生に移行します。")
else:
    print("Username or password file is missing.")
    print("ログイン情報を読み込めなかったため、HTMLの監視と音声再生に移行します。")

previous_content = None  # 前回の特定の条件を満たす要素の内容を保存

try:
    while True:
        if not is_browser_open(driver):
            print("ブラウザが閉じられました。プログラムを終了します。")
            break

        try:
            try:
                draft_wrapper = driver.find_elements(By.CSS_SELECTOR, '#draft-wrapper.active')
                
                # BGM再生が有効で、ドラフト画面が表示され、かつBGMが再生されていない場合
                if play_draft_bgm and draft_wrapper and not is_draft_bgm_playing:
                    try:
                        # BGMファイルをロードしてループ再生を開始
                        pygame.mixer.music.load(resource_path('ドラフト職業シンポタイム.wav'))
                        pygame.mixer.music.play(-1)  # -1を指定するとループ再生
                        is_draft_bgm_playing = True
                        print("ドラフトBGMを開始しました。")
                    except pygame.error as e:
                        print(f"ドラフトBGMの再生に失敗しました: {e}")

                # ドラフト画面がなく、かつBGMが再生されている場合
                elif not draft_wrapper and is_draft_bgm_playing:
                    # BGMを停止
                    pygame.mixer.music.stop()
                    is_draft_bgm_playing = False
                    print("ドラフトBGMを停止しました。")
                    
            except Exception as e:
                # print('ループ内エラー:', e)
                pass # エラーが発生しても処理を継続

            # ログ要素を取得
            log_elements = driver.find_elements(By.CSS_SELECTOR, '[id^="log_"]')

            found_element = None
            event_type = None # イベントの種類を管理 ('raw_eat', 'begging', 'text')

            # 最新のログから順に条件に合うものを探す
            for element in log_elements:
                try:
                    # 生食い(穀物/野菜)のチェック
                    # 条件:テキストに '(' が含まれていないこと
                    if "(" not in element.text:
                        has_grain = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-grain'))
                        has_vegetable = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-vegetable'))
                        has_food = bool(element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-food'))

                        if (has_grain and has_food) or (has_vegetable and has_food):
                            found_element = element
                            event_type = 'raw_eat'
                            break  # 条件に一致したのでループを抜ける

                    # 物乞い(生食い)のチェック
                    if element.find_elements(By.CSS_SELECTOR, '.agricola-meeple.meeple-begging'):
                        found_element = element
                        event_type = 'begging'
                        break  # 条件に一致したのでループを抜ける

                    # 既存のテキストベースのチェック
                    text = element.text
                    if "に家族コマを置いた" in text or "アクションが使えるようになった" in text or "収穫の開始" in text or "ゲーム終了" in text or "is" in text:
                        found_element = element
                        event_type = 'text'
                        break  # 条件に一致したのでループを抜ける

                except StaleElementReferenceException:
                    continue  # エレメントが古くなっていればスキップ
            
            if found_element:
                current_content = ""
                if event_type == 'raw_eat':
                    # 生食いイベントの場合、ログIDを使ってユニークな識別子を作成
                    current_content = "raw_eat_event_" + found_element.get_attribute('id')
                    print(f"生食い(穀物/野菜)を検出しました: {found_element.text}")
                elif event_type == 'begging':
                    # 物乞いイベントの場合
                    current_content = "begging_event_" + found_element.get_attribute('id')
                    print("物乞いを検出しました。")
                elif event_type == 'text':
                    # 通常のテキストイベント
                    current_content = found_element.text
                    print("Latest matching log text:", current_content)
                    # 最初の文字が"は"であれば後続の処理をスキップ
                    if current_content.startswith("は"):
                        continue  # 次のループへ移る
                
                # --- ここから音声再生処理 ---

                # 生食い(穀物/野菜)の音声再生
                if play_sound_if_needed(current_content, previous_content, ["raw_eat_event_"], ['生食い.wav']):
                    previous_content = current_content
                # 物乞いの音声再生
                elif play_sound_if_needed(current_content, previous_content, ["begging_event_"], ['物乞い.wav']):
                    previous_content = current_content
                # 踏んだ時の処理
                elif play_sound_if_needed(current_content, previous_content, ["「窪地」","「粘土坑」"], ['泥踏み1.wav','泥踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「森林」","「小さな森」","「雑木林」"], ['木.wav','汎用.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「資材市場」"], ['石葦飯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「葦原」"], ['葦原踏み1.wav','葦原踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「小劇場」","「漁」"], ['食料累積1.wav','食料累積2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「集会所」"], ['集会所踏み1.wav','集会所踏み2.wav','集会所踏み3.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「小麦の種」"], ['小麦踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農地」"], ['畑踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「授業」"], ['授業踏み1.wav','授業踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「日雇い労働者」"], ['日雇い踏み1.wav','日雇い踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「家畜市場」"], ['家畜市場踏み1.wav','家畜市場踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「羊市場」"], ['羊踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「大きい進歩」"], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「柵」"], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「穀物活用」"], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「家の建て直し」"], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「西の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「子供がほしい」"], ['子供踏み.wav','子供踏み2.wav','子供踏み3.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「猪市場」"], ['豚踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「野菜の種」"], ['野菜踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「東の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「牛市場」"], ['牛踏み.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「耕作」"], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「急いで子供がほしい」"], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["「農場の再開発」"], ['改築柵.wav']):
                    previous_content = current_content
                #めくれた時の処理リプレイ
                elif play_sound_if_needed(current_content, previous_content, ["__羊市場__ "], ['羊めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__大きい進歩__ "], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__柵__ "], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__穀物活用__ "], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__家の建て直し__ "], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__西の石切り場__ "], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__子供がほしい__ "], ['子供めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__猪市場__ "], ['豚めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__野菜の種__ "], ['野菜めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__東の石切り場__ "], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__牛市場__ "], ['牛めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__耕作__ "], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__急いで子供がほしい__ "], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["__農場の再開発__ "], ['改築柵.wav']):
                    previous_content = current_content
                #めくれた時の処理リアルタイム
                elif play_sound_if_needed(current_content, previous_content, ["羊市場 is"], ['羊めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["大きい進歩 is"], ['大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["柵 is"], ['柵.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["穀物活用 is"], ['種パン.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["家の建て直し is"], ['改築大進歩.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["西の石切り場 is"], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["急いで子供がほしい is"], ['急いで子供がほしい.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["猪市場 is"], ['豚めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["野菜の種 is"], ['野菜めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["東の石切り場 is"], ['石めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["牛市場 is"], ['牛めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["耕作 is"], ['畑種.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["子供がほしい is"], ['子供めくれ.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["農場の再開発 is"], ['改築柵.wav']):
                    previous_content = current_content
                #収穫の開始
                elif play_sound_if_needed(current_content, previous_content, ["収穫の開始"], ['収穫の開始.wav']):
                    # スクリーンショットを撮影
                    screenshot_counter += 1
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")  # タイムスタンプを追加
                    screenshot_path = os.path.join(screenshot_dir, f"screenshot_{screenshot_counter:04}_{timestamp}.png") # ファイル名にカウンターとタイムスタンプを追加
                    driver.save_screenshot(screenshot_path)
                    print(f"Screenshot saved to: {screenshot_path}")
                    previous_content = current_content
                #ゲーム終了時の処理
                elif play_sound_if_needed(current_content, previous_content, ["ゲーム終了"], ['ゲーム終了.wav']):
                    # スクリーンショットを撮影
                    screenshot_counter += 1
                    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")  # タイムスタンプを追加
                    screenshot_path = os.path.join(screenshot_dir, f"screenshot_{screenshot_counter:04}_{timestamp}.png") # ファイル名にカウンターとタイムスタンプを追加
                    driver.save_screenshot(screenshot_path)
                    print(f"Screenshot saved to: {screenshot_path}")
                    previous_content = current_content
                #大進歩獲得時の処理
                elif play_sound_if_needed(current_content, previous_content, ["かまど(大きい進歩カード)をプレイ(建設)した"], ['かまど.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["調理場(大きい進歩カード)をプレイ(建設)した"], ['調理場.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["井戸(大きい進歩カード)をプレイ(建設)した"], ['井戸.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["レンガ窯(大きい進歩カード)をプレイ(建設)した"], ['レンガ窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["石窯(大きい進歩カード)をプレイ(建設)した"], ['石窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["家具製作所(大きい進歩カード)をプレイ(建設)した"], ['家具製作所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["製陶所(大きい進歩カード)をプレイ(建設)した"], ['製陶所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["かご製作所(大きい進歩カード)をプレイ(建設)した"], ['かご製作所.wav']):
                    previous_content = current_content
                #大進歩使用時の処理
                elif play_sound_if_needed(current_content, previous_content, ["(かまど)"], ['かまど.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(調理場)"], ['調理場.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(レンガ窯)"], ['レンガ窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(石窯)"], ['石窯.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(家具製作所)"], ['家具製作所.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(製陶所)"], ['製陶所食料.wav']):
                    previous_content = current_content
                elif play_sound_if_needed(current_content, previous_content, ["(かご製作所)"], ['かご製作所食料.wav']):
                    previous_content = current_content

        except Exception as e:
            # print('ループ内エラー:', e)
            pass # エラーが発生しても処理を継続
        time.sleep(1)

except Exception as e:
    print('エラーが発生しました:', e)
    with open('エラー.txt', 'w', encoding='utf-8') as error_file:
        error_file.write(str(e))

finally:
    if 'driver' in locals() and is_browser_open(driver):
        driver.quit()
    print("プログラムを終了します。")

var0.0.3

・ゲームプレイ時アクションカードが捲れた時の音声がならない問題を修正しました。

import os
import sys
import pygame
import random
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
import time

# pygame用の初期化
pygame.mixer.init()

# 音声再生パス指定関数
def resource_path(relative_path):
    """リソースファイルのパスを取得します。_MEIPASS変数が定義されている場合、そのパスを使用します。"""
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

# ファイル内容を読み込む関数
def read_file_content(filename):
    """指定されたファイル名から内容を読み込んで返します。"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read().strip()
    except FileNotFoundError:
        print(f"Error: {filename} not found.")
        return None

# ユーザーネームとパスワードのファイルから内容を読み込む
username = read_file_content('ユーザー名.txt')
password = read_file_content('パスワード.txt')

# 音声再生の関数
def play_sound_if_needed(current_content, previous_content, keywords, sound_files):
    """指定されたキーワードが現在のコンテンツに含まれていて、前のコンテンツと異なる場合に音声を再生します。"""
    if current_content != previous_content and any(keyword in current_content for keyword in keywords):
        try:
            chosen_sound_file = random.choice(sound_files)
            pygame.mixer.music.load(resource_path(chosen_sound_file))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return True
        except pygame.error:
            print(f"Failed to load {chosen_sound_file}, playing default sound.")
            pygame.mixer.music.load(resource_path('汎用.wav'))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return False
    return False

def is_browser_open(driver):
    """ブラウザのセッションがまだ有効かチェックします。"""
    try:
        # ドライバーがまだページを取得できるかどうかを確認する簡単なチェック
        driver.current_url
        return True
    except WebDriverException:
        return False

# Chrome オプションの設定
options = webdriver.ChromeOptions()
options.headless = False  # 音声再生が必要なので、ヘッドレスモードはオフ

# ChromeDriverManagerを使用してChromeDriverを設定
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

# 監視するページにアクセス
driver.get('https://boardgamearena.com/lobby')

# ログイン情報を入力してログイン処理を行う
if username and password:
    username_input = driver.find_element(By.CSS_SELECTOR, '#username_input')
    password_input = driver.find_element(By.CSS_SELECTOR, '#password_input')
    submit_button = driver.find_element(By.CSS_SELECTOR, '#submit_login_button')

    username_input.send_keys(username)  # ユーザー名を入力
    password_input.send_keys(password)  # パスワードを入力
    submit_button.click()  # ログインボタンをクリック
else:
    print("Username or password file is missing.")

previous_content = None  # 前回の特定の条件を満たす要素の内容を保存

try:
    while True:
        if not is_browser_open(driver):
            print("ブラウザが閉じられました。プログラムを終了します。")
            break

        try:
            log_elements = driver.find_elements(By.CSS_SELECTOR, '[id^="log_"]')
            found_element = None
            for element in log_elements:
                try:
                    text = element.text
                    if "に家族コマを置いた" in text or "アクションが使えるようになった" in text or "収穫の開始" in text:
                        found_element = element
                        break
                except StaleElementReferenceException:
                    continue  # エレメントが古くなっていればスキップ

            if found_element:
                current_content = found_element.text
                # 最初の文字が"は"であれば後続の処理をスキップ
                if current_content.startswith("は"):
                    continue  # 次のループへ移る
                # 踏んだ時の処理
                # ここに音声再生の処理を追加
                #踏んだ時の処理
            if play_sound_if_needed(current_content, previous_content, ["「窪地」","「粘土坑」"], ['泥踏み1.wav','泥踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「森林」","「小さな森」","「雑木林」"], ['木.wav','汎用.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「資材市場」"], ['石葦飯.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「葦原」"], ['葦原踏み1.wav','葦原踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小劇場」","「漁」"], ['食料累積1.wav','食料累積2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「集会所」"], ['集会所踏み1.wav','集会所踏み2.wav','集会所踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小麦の種」"], ['小麦踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農地」"], ['畑踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「授業」"], ['授業踏み1.wav','授業踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「日雇い労働者」"], ['日雇い踏み1.wav','日雇い踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家畜市場」"], ['家畜市場踏み1.wav','家畜市場踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「羊市場」"], ['羊踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「大きい進歩」"], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「柵」"], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「穀物活用」"], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家の建て直し」"], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「西の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「子供がほしい」"], ['子供踏み.wav','子供踏み2.wav','子供踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「猪市場」"], ['豚踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「野菜の種」"], ['野菜踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「東の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「牛市場」"], ['牛踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「耕作」"], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「急いで子供がほしい」"], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場の再開発」"], ['改築柵.wav']):
                previous_content = current_content
            #めくれた時の処理リプレイ
            elif play_sound_if_needed(current_content, previous_content, ["__羊市場__ "], ['羊めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__大進歩__ "], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__柵__ "], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__穀物活用__ "], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__家の建て直し__ "], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__西の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__子供がほしい__ "], ['子供めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__猪市場__ "], ['豚めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__野菜の種__ "], ['野菜めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__東の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__牛市場__ "], ['牛めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__耕作__ "], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__急いで子供がほしい__ "], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__農場の再開発__ "], ['改築柵.wav']):
                previous_content = current_content
            #めくれた時の処理リアルタイム
            elif play_sound_if_needed(current_content, previous_content, ["羊市場 is"], ['羊めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["大進歩 is"], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["柵 is"], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["穀物活用 is"], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["家の建て直し is"], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["西の石切り場 is"], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["子供がほしい is"], ['子供めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["猪市場 is"], ['豚めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["野菜の種 is"], ['野菜めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["東の石切り場 is"], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["牛市場 is"], ['牛めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["耕作 is"], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["急いで子供がほしい is"], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["農場の再開発 is"], ['改築柵.wav']):
                previous_content = current_content
            #収穫の開始
            elif play_sound_if_needed(current_content, previous_content, ["収穫の開始"], ['収穫の開始.wav']):
                previous_content = current_content

        except Exception as e:
            #print('ループ内エラー:', e)
            time.sleep(0)
        time.sleep(1)

except Exception as e:
    print('エラーが発生しました:', e)
    with open('エラー.txt', 'w', encoding='utf-8') as error_file:
        error_file.write(str(e))

finally:
    driver.quit()
    print("プログラムを終了します。")

var0.0.2

・ゲーム終了時にブラウザが終了しないようにしました。
・アクションスペースを踏んだ際に音声再生が2回行われることがある問題を修正しました。

import os
import sys
import pygame
import random
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import WebDriverException
import time

# pygame用の初期化
pygame.mixer.init()

# 音声再生パス指定関数
def resource_path(relative_path):
    """リソースファイルのパスを取得します。_MEIPASS変数が定義されている場合、そのパスを使用します。"""
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

# ファイル内容を読み込む関数
def read_file_content(filename):
    """指定されたファイル名から内容を読み込んで返します。"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read().strip()
    except FileNotFoundError:
        print(f"Error: {filename} not found.")
        return None

# ユーザーネームとパスワードのファイルから内容を読み込む
username = read_file_content('ユーザー名.txt')
password = read_file_content('パスワード.txt')

# 音声再生の関数
def play_sound_if_needed(current_content, previous_content, keywords, sound_files):
    """指定されたキーワードが現在のコンテンツに含まれていて、前のコンテンツと異なる場合に音声を再生します。"""
    if current_content != previous_content and any(keyword in current_content for keyword in keywords):
        try:
            chosen_sound_file = random.choice(sound_files)
            pygame.mixer.music.load(resource_path(chosen_sound_file))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return True
        except pygame.error:
            print(f"Failed to load {chosen_sound_file}, playing default sound.")
            pygame.mixer.music.load(resource_path('汎用.wav'))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return False
    return False

def is_browser_open(driver):
    """ブラウザのセッションがまだ有効かチェックします。"""
    try:
        # ドライバーがまだページを取得できるかどうかを確認する簡単なチェック
        driver.current_url
        return True
    except WebDriverException:
        return False

# Chrome オプションの設定
options = webdriver.ChromeOptions()
options.headless = False  # 音声再生が必要なので、ヘッドレスモードはオフ

# ChromeDriverManagerを使用してChromeDriverを設定
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

# 監視するページにアクセス
driver.get('https://boardgamearena.com/lobby')

# ログイン情報を入力してログイン処理を行う
if username and password:
    username_input = driver.find_element(By.CSS_SELECTOR, '#username_input')
    password_input = driver.find_element(By.CSS_SELECTOR, '#password_input')
    submit_button = driver.find_element(By.CSS_SELECTOR, '#submit_login_button')

    username_input.send_keys(username)  # ユーザー名を入力
    password_input.send_keys(password)  # パスワードを入力
    submit_button.click()  # ログインボタンをクリック
else:
    print("Username or password file is missing.")

previous_content = None  # 前回の特定の条件を満たす要素の内容を保存

try:
    while True:
        if not is_browser_open(driver):
            print("ブラウザが閉じられました。プログラムを終了します。")
            break

        try:
            log_elements = driver.find_elements(By.CSS_SELECTOR, '[id^="log_"]')
            found_element = None
            for element in log_elements:
                try:
                    text = element.text
                    if "に家族コマを置いた" in text or "アクションが使えるようになった" in text or "収穫の開始" in text:
                        found_element = element
                        break
                except StaleElementReferenceException:
                    continue  # エレメントが古くなっていればスキップ

            if found_element:
                current_content = found_element.text
                # 最初の文字が"は"であれば後続の処理をスキップ
                if current_content.startswith("は"):
                    continue  # 次のループへ移る
                # 踏んだ時の処理
                # ここに音声再生の処理を追加
                #踏んだ時の処理
            if play_sound_if_needed(current_content, previous_content, ["「窪地」","「粘土坑」"], ['泥踏み1.wav','泥踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「森林」","「小さな森」","「雑木林」"], ['木.wav','汎用.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「資材市場」"], ['石葦飯.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「葦原」"], ['葦原踏み1.wav','葦原踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小劇場」","「漁」"], ['食料累積1.wav','食料累積2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「集会所」"], ['集会所踏み1.wav','集会所踏み2.wav','集会所踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小麦の種」"], ['小麦踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農地」"], ['畑踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「授業」"], ['授業踏み1.wav','授業踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「日雇い労働者」"], ['日雇い踏み1.wav','日雇い踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家畜市場」"], ['家畜市場踏み1.wav','家畜市場踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「羊市場」"], ['羊踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「大きい進歩」"], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「柵」"], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「穀物活用」"], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家の建て直し」"], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「西の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「子供がほしい」"], ['子供踏み.wav','子供踏み2.wav','子供踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「猪市場」"], ['豚踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「野菜の種」"], ['野菜踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「東の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「牛市場」"], ['牛踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「耕作」"], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「急いで子供がほしい」"], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場の再開発」"], ['改築柵.wav']):
                previous_content = current_content
            #めくれた時の処理
            elif play_sound_if_needed(current_content, previous_content, ["__羊市場__ "], ['羊めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__大進歩__ "], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__柵__ "], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__穀物活用__ "], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__家の建て直し__ "], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__西の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__子供がほしい__ "], ['子供めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__猪市場__ "], ['豚めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__野菜の種__ "], ['野菜めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__東の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__牛市場__ "], ['牛めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__耕作__ "], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__急いで子供がほしい__ "], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__農場の再開発__ "], ['改築柵.wav']):
                previous_content = current_content
            #収穫の開始
            elif play_sound_if_needed(current_content, previous_content, ["収穫の開始"], ['収穫の開始.wav']):
                previous_content = current_content

        except Exception as e:
            #print('ループ内エラー:', e)
            time.sleep(0)
        time.sleep(1)

except Exception as e:
    print('エラーが発生しました:', e)
    with open('エラー.txt', 'w', encoding='utf-8') as error_file:
        error_file.write(str(e))

finally:
    driver.quit()
    print("プログラムを終了します。")

var0.0.1

import os
import sys
import pygame
import random
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time

# pygame用の初期化
pygame.mixer.init()

# 音声再生パス指定関数
def resource_path(relative_path):
    """リソースファイルのパスを取得します。_MEIPASS変数が定義されている場合、そのパスを使用します。"""
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

# ファイル内容を読み込む関数
def read_file_content(filename):
    """指定されたファイル名から内容を読み込んで返します。"""
    try:
        with open(filename, 'r', encoding='utf-8') as file:
            return file.read().strip()
    except FileNotFoundError:
        print(f"Error: {filename} not found.")
        return None

# ユーザーネームとパスワードのファイルから内容を読み込む
username = read_file_content('ユーザー名.txt')
password = read_file_content('パスワード.txt')

# 音声再生の関数
def play_sound_if_needed(current_content, previous_content, keywords, sound_files):
    """指定されたキーワードが現在のコンテンツに含まれていて、前のコンテンツと異なる場合に音声を再生します。"""
    if current_content != previous_content and any(keyword in current_content for keyword in keywords):
        try:
            chosen_sound_file = random.choice(sound_files)
            pygame.mixer.music.load(resource_path(chosen_sound_file))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return True
        except pygame.error:
            print(f"Failed to load {chosen_sound_file}, playing default sound.")
            pygame.mixer.music.load(resource_path('汎用.wav'))
            pygame.mixer.music.play()
            while pygame.mixer.music.get_busy():  # 再生が完了するまで待機
                time.sleep(1)
            return False
    return False

# Chrome オプションの設定
options = webdriver.ChromeOptions()
options.headless = False  # 音声再生が必要なので、ヘッドレスモードはオフ

# ChromeDriverManagerを使用してChromeDriverを設定
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)

# 監視するページにアクセス
driver.get('https://boardgamearena.com/lobby')

# ログイン情報を入力してログイン処理を行う
if username and password:
    username_input = driver.find_element(By.CSS_SELECTOR, '#username_input')
    password_input = driver.find_element(By.CSS_SELECTOR, '#password_input')
    submit_button = driver.find_element(By.CSS_SELECTOR, '#submit_login_button')

    username_input.send_keys(username)  # ユーザー名を入力
    password_input.send_keys(password)  # パスワードを入力
    submit_button.click()  # ログインボタンをクリック
else:
    print("Username or password file is missing.")

previous_content = None  # 前回の特定の条件を満たす要素の内容を保存

try:
    while True:
        log_elements = driver.find_elements(By.CSS_SELECTOR, '[id^="log_"]')
        found_element = None
        for element in log_elements:
            text = element.text
            if "に家族コマを置いた" in text or "アクションが使えるようになった" in text or "収穫の開始" in text:
                found_element = element
                break

        if found_element:
            current_content = found_element.text
            #踏んだ時の処理
            if play_sound_if_needed(current_content, previous_content, ["「窪地」","「粘土坑」"], ['泥踏み1.wav','泥踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「森林」","「小さな森」","「雑木林」"], ['木.wav','汎用.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「資材市場」"], ['石葦飯.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「葦原」"], ['葦原踏み1.wav','葦原踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小劇場」","「漁」"], ['食料累積1.wav','食料累積2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「集会所」"], ['集会所踏み1.wav','集会所踏み2.wav','集会所踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「小麦の種」"], ['小麦踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農地」"], ['畑踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場拡充」"], ['増築増員だ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「授業」"], ['授業踏み1.wav','授業踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「日雇い労働者」"], ['日雇い踏み1.wav','日雇い踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家畜市場」"], ['家畜市場踏み1.wav','家畜市場踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「羊市場」"], ['羊踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「大きい進歩」"], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「柵」"], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「穀物活用」"], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「家の建て直し」"], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「西の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「子供がほしい」"], ['子供踏み.wav','子供踏み2.wav','子供踏み3.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「猪市場」"], ['豚踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「野菜の種」"], ['野菜踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「東の石切り場」"], ['石踏み1.wav','石踏み2.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「牛市場」"], ['牛踏み.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「耕作」"], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「急いで子供がほしい」"], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["「農場の再開発」"], ['改築柵.wav']):
                previous_content = current_content
            #めくれた時の処理
            elif play_sound_if_needed(current_content, previous_content, ["__羊市場__ "], ['羊めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__大進歩__ "], ['大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__柵__ "], ['柵.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__穀物活用__ "], ['種パン.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__家の建て直し__ "], ['改築大進歩.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__西の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__子供がほしい__ "], ['子供めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__猪市場__ "], ['豚めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__野菜の種__ "], ['野菜めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__東の石切り場__ "], ['石めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__牛市場__ "], ['牛めくれ.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__耕作__ "], ['畑種.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__急いで子供がほしい__ "], ['急いで子供がほしい.wav']):
                previous_content = current_content
            elif play_sound_if_needed(current_content, previous_content, ["__農場の再開発__ "], ['改築柵.wav']):
                previous_content = current_content
            #収穫の開始
            elif play_sound_if_needed(current_content, previous_content, ["収穫の開始"], ['収穫の開始.wav']):
                previous_content = current_content

            time.sleep(1)

except Exception as e:
    print('エラーが発生しました:', e)
    with open('エラー.txt', 'w', encoding='utf-8') as error_file:
        error_file.write(str(e))

finally:
    driver.quit()
    print("プログラムを終了します。")

※デバック用のコメントアウトは一部削除しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次