from typing import Optional
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from latest_user_agents import get_latest_user_agents
def write_thread(
driver, server: str, board: str, thread: str,
body: str, name: str = None, mail: str = None
) -> (bool, Optional[str]):
url = f"https://{server}.5ch.net/test/read.cgi/{board}/{thread}/l50"
# TODO: エラー処理
driver.get(url)
# 要素に値を詰める
elem = driver.find_element(By.XPATH, '//textarea[@name="MESSAGE"]')
elem.send_keys(body)
if name is not None:
elem = driver.find_element(By.XPATH, '//input[@name="FROM"]')
elem.send_keys(name)
if mail is not None:
elem = driver.find_element(By.XPATH, '//input[@name="mail"]')
elem.send_keys(mail)
# 書きこみボタンを押す
elem = WebDriverWait(driver, 10).until(
expected_conditions.element_to_be_clickable((
By.XPATH, '//input[@name="submit"]'
))
)
# ref: https://office54.net/python/scraping/selenium-click-exception
driver.execute_script("arguments[0].click();", elem)
# Cookieをセットしてない場合は承諾ボタンを押す
if "書きこみ&クッキー確認" in driver.page_source:
elem = WebDriverWait(driver, 10).until(
expected_conditions.element_to_be_clickable((
By.XPATH, '//input[@name="submit"]'
))
)
elem.click()
if driver.title == "ERROR!":
elem = driver.find_element(By.XPATH, '/html/body/font[1]/b')
return False, elem.text
else:
driver.get("https://www.google.com")
return True, None
def setup_driver():
ua_list = get_latest_user_agents()
ua = ""
for ua_ in ua_list:
if "Windows" in ua_ and "Chrome" in ua_:
ua = ua_
break
options = webdriver.ChromeOptions()
options.add_argument('--user-agent=' + ua)
# ref: https://stackoverflow.com/questions/73930313/python-selenium-button-click-causes-browser-console-error
options.add_argument('--disable-blink-features=AutomationControlled')
# ref: https://sushiringblog.com/chromedriver-error
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument("--disable-setuid-sandbox")
# ref: https://stackoverflow.com/questions/53902507/unknown-error-session-deleted-because-of-page-crash-from-unknown-error-cannot
options.add_argument('--disable-dev-shm-usage')
# ref: https://stackoverflow.com/questions/46322165/dont-wait-for-a-page-to-load-using-selenium-in-python/46339092#46339092
caps = DesiredCapabilities().CHROME
caps['pageLoadStrategy'] = 'eager'
return webdriver.Chrome(options=options, desired_capabilities=caps)
if __name__ == '__main__':
import time
driver = setup_driver()
print(write_thread(driver, 'mi', 'news4vip', '1671786885', 'Cookieのテスト1', '>>1', 'mail address'))
time.sleep(60)
print(write_thread(driver, 'mi', 'news4vip', '1671786885', 'Cookieのテスト2', '>>1', 'mail address'))