selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="rc-anchor-form"]"}
(Session info: chrome=113.0.5672.127)
Stacktrace:
Backtrace:
GetHandleVerifier [0x00A08893+48451]
(No symbol) [0x0099B8A1]
(No symbol) [0x008A5058]
(No symbol) [0x008D0467]
(No symbol) [0x008D069B]
(No symbol) [0x008FDD92]
(No symbol) [0x008EA304]
(No symbol) [0x008FC482]
(No symbol) [0x008EA0B6]
(No symbol) [0x008C7E08]
(No symbol) [0x008C8F2D]
GetHandleVerifier [0x00C68E3A+2540266]
GetHandleVerifier [0x00CA8959+2801161]
GetHandleVerifier [0x00CA295C+2776588]
GetHandleVerifier [0x00A92280+612144]
(No symbol) [0x009A4F6C]
(No symbol) [0x009A11D8]
(No symbol) [0x009A12BB]
(No symbol) [0x00994857]
BaseThreadInitThunk [0x76C400C9+25]
RtlGetAppContainerNamedObjectPath [0x77597B4E+286]
RtlGetAppContainerNamedObjectPath [0x77597B1E+238]
import logging
import time
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
logging.basicConfig(level=logging.INFO, format='[%(levelname)s] %(message)s')
def submit_report(driver, domain):
# Открываем страницу для отправки отчета
driver.get('https://safebrowsing.google.com/safebrowsing/report_error/?hl=en')
# Вводим домен в поле "URL"
url_field = driver.find_element(By.ID, 'url')
url_field.clear()
url_field.send_keys(domain)
# Вводим текст в поле "Additional details: (Optional)"
additional_details_field = driver.find_element(By.ID, 'dq')
additional_details_text = '''text text text text text text'''
additional_details_field.clear()
additional_details_field.send_keys(additional_details_text)
# Ожидаем решения Google reCAPTCHA
WebDriverWait(driver, 300).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'iframe[src^="https://www.google.com/recaptcha/api2/anchor"]')))
# Ждем, пока пользователь решает капчу
time.sleep(15) # Приостановка выполнения программы на 25 секунд
# Находим форму и отправляем отчет
form = driver.find_element(By.ID, 'rc-anchor-form')
form.submit()
# Ожидаем перехода на страницу успешной отправки отчета
try:
WebDriverWait(driver, 10).until(EC.url_contains('submit_success'))
# Проверяем, был ли успешно отправлен отчет
if 'submit_success' in driver.current_url:
logging.info(f'Report for {domain} sent successfully')
return True
except TimeoutException:
logging.warning(f'Timeout while waiting for report submission for {domain}.')
return False
# Открываем файл с доменами
with open('domain.txt', 'r') as f:
domains = f.read().splitlines()
# Опции для ChromeDriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
# Устанавливаем путь к ChromeDriver
service = webdriver.chrome.service.Service(ChromeDriverManager().install())
# Открываем браузер
driver = webdriver.Chrome(service=service, options=chrome_options)
try:
index = 0 # Индекс текущего домена
max_attempts = 3 # Максимальное количество попыток отправки отчета
# Открываем файл successful.txt для записи
with open('successful.txt', 'a') as successful_domains_file:
while index < len(domains):
domain = domains[index]
attempts = 0 # Счетчик попыток отправки отчета
while attempts < max_attempts:
success = submit_report(driver, domain)
if success:
# Записываем успешно отправленный домен в successful.txt
successful_domains_file.write(f'{domain} - успешно отправлен отчет ({time.strftime("%Y-%m-%d %H:%M:%S")})\n')
break # Успешно отправлено, переходим к следующему домену
else:
attempts += 1
logging.warning(f'Retrying report submission for {domain} (attempt {attempts})...')
if attempts >= max_attempts:
logging.error(f'Failed to submit report for {domain} after {max_attempts} attempts.')
index += 1 # Переходим к следующему домену
finally:
# Закрываем браузер после работы скрипта
driver.quit()
import urllib.request
import json
# Функция проверки безопасности домена на основе сервиса SafeBrowsing
def check_domain(domain):
url = "https://safebrowsing.googleapis.com/v4/threatMatches:find"
api_key = "тут мой api ключ"
headers = {"Content-Type": "application/json", "x-goog-api-key": api_key}
data = {
"client": {
"clientId": "mycompany",
"clientVersion": "1.5.2"
},
"threatInfo": {
"threatTypes": ["MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE", "POTENTIALLY_HARMFUL_APPLICATION"],
"platformTypes": ["ANY_PLATFORM"],
"threatEntryTypes": ["URL"],
"threatEntries": [{"url": domain}]
}
}
try:
req = urllib.request.Request(url=url, headers=headers, data=json.dumps(data).encode("utf-8"))
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode("utf-8"))
if result.get("matches"):
return True
else:
return False
except urllib.error.HTTPError as e:
print(f"HTTP Error: {e.code} - {e.reason}")
return False
# Открытие файла для чтения
with open("domains.txt", "r") as file:
# Открытие файлов для записи
block_file = open("block_domain.txt", "w")
white_file = open("white_domain.txt", "w")
# Чтение каждой строки файла domains.txt
for line in file:
domain = line.strip() # Удаление пробелов и переносов строки
if check_domain(domain):
block_file.write(domain + "\n") # Запись в файл block_domain.txt
else:
white_file.write(domain + "\n") # Запись в файл white_domain.txt
# Закрытие файлов
block_file.close()
white_file.close()