前回までで大体スクリプトが完成しました。
完成したスクリプトを再度ChatGPTに通して「リファクタリング」してもらった
結果は以下の通り、スクリプトと同じディレクトリにxconfig.pyを作成しKEYを入れたら動きます
# -*- coding: utf-8 -*-
"""
Created on Thu Feb
@author: momo
"""
import re
import pyperclip
import random
import os
import tweepy
import xconfig # APIキーとパスワードを管理するconfig.pyをインポート
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import time
# 設定
FILE_NAME = "numbers.txt"
HISTORY_LIMIT = 5 # 直近5回分の履歴
def weighted_random():
"""0~4の値が5~9の値の2倍の確率で選ばれるようにする"""
return random.choices(range(10), weights=[2] * 5 + [1] * 5, k=1)[0]
def generate_unique_numbers():
"""過去の直近履歴と異なる0~9の3つの値を生成する"""
previous_numbers = []
if os.path.exists(FILE_NAME):
with open(FILE_NAME, "r") as file:
previous_numbers = [tuple(map(int, line.strip().split(","))) for line in file]
previous_numbers = previous_numbers[-HISTORY_LIMIT:] # 最新HISTORY_LIMIT件のみ保持
while True:
new_numbers = tuple(weighted_random() for _ in range(3))
if new_numbers not in previous_numbers:
break
with open(FILE_NAME, "w") as file:
for nums in previous_numbers:
file.write(f"{nums[0]},{nums[1]},{nums[2]}\n")
file.write(f"{new_numbers[0]},{new_numbers[1]},{new_numbers[2]}\n")
return new_numbers
def perform_login(driver):
"""DMM Affiliate にログイン"""
try:
driver.get('https://accounts.dmm.com/service/login/password/=/path=https%3A%2F%2Faffiliate.dmm.com%2F')
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "login_id"))).send_keys(xconfig.LOGIN_ID)
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "password"))).send_keys(xconfig.PASSWORD)
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//button[@type="submit"]'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[3]/div[2]/div[2]/div/div/a/img'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '/html/body/div[3]/div/div/div[3]/div/a[1]/span'))).click()
print("ログイン成功")
except Exception as e:
print(f"ログインに失敗しました: {e}")
def perform_web_actions(driver, cate, rank):
"""指定されたWeb操作を実行し、抽出テキストを取得"""
try:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, f'//*[@id="rank-0{cate}"]/ul/li[{rank}]/div/a/img'))).click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="fn-modal"]/div[2]/form/div[2]/div[2]/div[3]/div[4]/div/p/input'))).click()
clipboard_content = pyperclip.paste()
try:
driver.find_element(By.XPATH, "//button[text()='OK']").click()
except:
pass
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="fn-modalClose"]/span'))).click()
match1 = re.search(r'left;">(.*?)</span>', clipboard_content)
match2 = re.search(r'href="(.*?)package_text', clipboard_content)
extracted_text = match1.group(1) if match1 else "Pattern not found."
extracted_text2 = match2.group(1) if match2 else "Pattern not found."
return f"{extracted_text} {extracted_text2} twitter"
except Exception as e:
print(f"Error in cate={cate}, rank={rank}: {e}")
return None
def main():
"""メイン処理"""
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
try:
perform_login(driver)
tweet_lists = {cate: [perform_web_actions(driver, cate, rank) for rank in range(1, 11)] for cate in range(1, 4)}
print(tweet_lists)
time.sleep(1)
except Exception as e:
print("error",e)
finally:
driver.quit()
print("ブラウザを閉じました。")
# 認証セットアップ
client = tweepy.Client(
consumer_key=xconfig.API_KEY,
consumer_secret=xconfig.API_SECRET,
access_token=xconfig.ACCESS_TOKEN,
access_token_secret=xconfig.ACCESS_TOKEN_SECRET,
bearer_token=xconfig.BEARER_TOKEN,
wait_on_rate_limit=True
)
def tweet(text):
"""ツイート投稿"""
try:
client.create_tweet(text=text)
print("ツイートを投稿しました!")
except Exception as e:
print(f"ツイートエラー: {e}")
N1, N2, N3 = generate_unique_numbers()
print(N1, N2, N3)
if tweet_lists[1][N1]: tweet(tweet_lists[1][N1])
time.sleep(random.uniform(3, 6))
if tweet_lists[2][N2]: tweet(tweet_lists[2][N2])
time.sleep(random.uniform(3, 6))
if tweet_lists[3][N3]: tweet(tweet_lists[3][N3])
if __name__ == "__main__":
main()
コメント