アフィリエイトとXの自動化(最終回)

前回までで大体スクリプトが完成しました。

完成したスクリプトを再度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()

コメント

タイトルとURLをコピーしました