Автоматическое создание профилей chrome и получение cookies файлов, с передачей на удалённый хост
179 lines
7.9 KiB
Python
179 lines
7.9 KiB
Python
import os
|
||
import time
|
||
import subprocess
|
||
from selenium import webdriver
|
||
from selenium.webdriver.chrome.options import Options
|
||
from selenium.webdriver.common.by import By
|
||
from selenium.webdriver.common.keys import Keys
|
||
from selenium.webdriver.support.ui import WebDriverWait
|
||
from selenium.webdriver.support import expected_conditions as EC
|
||
|
||
BASE_COOKIES_PATH = "/root/script/cookies" # Базовый путь для сохранения cookies
|
||
PRIVATE_KEY_PATH = "id_rsa" # Путь к приватному ключу для SCP
|
||
SERVER_USER = "root" # Пользователь на удалённом сервере
|
||
SERVER_IP = "45.140.146.245" # IP удалённого сервера
|
||
REMOTE_COOKIES_PATH = "/usr/script/cookies_" # Путь на удалённом сервере
|
||
|
||
BASE_CHROME_PROFILE_PATH = "/root/.chrome-profile_" # Базовый путь к профилю Chrome
|
||
|
||
# Акаунты
|
||
ACCOUNTS = [
|
||
{"email": "rugikmeg@gmail.com", "password": "k88mGHVQ"},
|
||
{"email": "13ivanill2025@gmail.com", "password": "k88mGHVQ"},
|
||
|
||
]
|
||
|
||
def is_profile_created(profile_index):
|
||
"""Проверка, создан ли профиль."""
|
||
profile_path = f"{BASE_CHROME_PROFILE_PATH}{profile_index}"
|
||
return os.path.exists(profile_path)
|
||
|
||
def is_logged_in(driver):
|
||
"""Проверка, выполнен ли вход в аккаунт YouTube."""
|
||
try:
|
||
driver.get("https://www.youtube.com")
|
||
time.sleep(3)
|
||
return "Sign in" not in driver.page_source
|
||
except Exception as e:
|
||
print(f"Ошибка при проверке авторизации: {e}")
|
||
return False
|
||
|
||
def login_to_youtube(driver, email, password):
|
||
"""Авторизация в YouTube."""
|
||
try:
|
||
driver.get("https://accounts.google.com/ServiceLogin?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252F&hl=en&ec=65620")
|
||
time.sleep(2)
|
||
|
||
# Вводим email
|
||
email_field = WebDriverWait(driver, 10).until(
|
||
EC.presence_of_element_located((By.ID, "identifierId"))
|
||
)
|
||
email_field.send_keys(email)
|
||
email_field.send_keys(Keys.RETURN)
|
||
time.sleep(2)
|
||
|
||
# Вводим пароль
|
||
password_field = WebDriverWait(driver, 10).until(
|
||
EC.presence_of_element_located((By.NAME, "Passwd"))
|
||
)
|
||
password_field.send_keys(password)
|
||
password_field.send_keys(Keys.RETURN)
|
||
time.sleep(5)
|
||
|
||
# Проверяем успешность авторизации
|
||
return is_logged_in(driver)
|
||
except Exception as e:
|
||
print(f"Ошибка при авторизации: {e}")
|
||
return False
|
||
|
||
def extract_cookies(driver, profile_index):
|
||
"""Извлечение cookies и сохранение в файл."""
|
||
try:
|
||
cookies = driver.get_cookies()
|
||
cookies_path = f"{BASE_COOKIES_PATH}{profile_index}.txt"
|
||
with open(cookies_path, "w") as file:
|
||
file.write("# Netscape HTTP Cookie File\n")
|
||
file.write("# http://curl.haxx.se/rfc/cookie_spec.html\n")
|
||
file.write("# This is a generated file! Do not edit.\n\n")
|
||
for cookie in cookies:
|
||
expiry = cookie.get('expiry', '')
|
||
file.write(
|
||
f"{cookie['domain']}\tTRUE\t{cookie['path']}\t{str(cookie['secure']).upper()}\t{expiry}\t{cookie['name']}\t{cookie['value']}\n"
|
||
)
|
||
print(f"Cookies сохранены в {cookies_path}")
|
||
return True
|
||
except Exception as e:
|
||
print(f"Ошибка при извлечении cookies для профиля {profile_index}: {e}")
|
||
return False
|
||
|
||
def transfer_cookies_via_scp(profile_index):
|
||
"""Передача cookies на сервер через SCP."""
|
||
try:
|
||
if not os.path.exists(PRIVATE_KEY_PATH):
|
||
print(f" Файл ключа {PRIVATE_KEY_PATH} не найден.")
|
||
return False
|
||
|
||
# Команда SCP
|
||
cookies_path = f"{BASE_COOKIES_PATH}{profile_index}.txt"
|
||
remote_cookies_path = f"{REMOTE_COOKIES_PATH}{profile_index}.txt"
|
||
scp_command = [
|
||
"scp",
|
||
"-o", "StrictHostKeyChecking=no",
|
||
"-i", PRIVATE_KEY_PATH,
|
||
cookies_path,
|
||
f"{SERVER_USER}@{SERVER_IP}:{remote_cookies_path}"
|
||
]
|
||
|
||
# Выполняем SCP
|
||
result = subprocess.run(scp_command, check=True, text=True, capture_output=True)
|
||
|
||
if result.returncode == 0:
|
||
print(f"Cookies успешно переданы на сервер {SERVER_IP} для профиля {profile_index}.")
|
||
return True
|
||
else:
|
||
print(f"Ошибка при передаче cookies для профиля {profile_index}: {result.stderr}")
|
||
return False
|
||
except subprocess.CalledProcessError as e:
|
||
print(f"Ошибка при выполнении SCP для профиля {profile_index}: {e.stderr}")
|
||
return False
|
||
except Exception as e:
|
||
print(f"Общая ошибка для профиля {profile_index}: {e}")
|
||
return False
|
||
|
||
def process_profile(profile_index, email, password):
|
||
"""Обработка одного профиля."""
|
||
try:
|
||
# Настройки Chrome
|
||
options = Options()
|
||
# options.add_argument("--headless") # Без интерфейса
|
||
options.add_argument("--disable-gpu")
|
||
options.add_argument("--no-sandbox")
|
||
options.add_argument("--disable-dev-shm-usage")
|
||
|
||
# Указываем профиль пользователя
|
||
profile_path = f"{BASE_CHROME_PROFILE_PATH}{profile_index}"
|
||
options.add_argument(f"--user-data-dir={profile_path}")
|
||
options.add_argument("--profile-directory=Default")
|
||
|
||
# Запуск браузера
|
||
driver = webdriver.Chrome(options=options)
|
||
|
||
# Проверка авторизации
|
||
if is_profile_created(profile_index):
|
||
print(f"Профиль {profile_index} уже создан. Проверяем авторизацию...")
|
||
if not is_logged_in(driver):
|
||
print(f"Пользователь не авторизован. Пытаемся войти...")
|
||
if not login_to_youtube(driver, email, password):
|
||
print(f" Не удалось авторизоваться для профиля {profile_index}.")
|
||
driver.quit()
|
||
return False
|
||
else:
|
||
print(f"Профиль {profile_index} не создан. Создаем и авторизуемся...")
|
||
if not login_to_youtube(driver, email, password):
|
||
print(f" Не удалось авторизоваться для профиля {profile_index}.")
|
||
driver.quit()
|
||
return False
|
||
|
||
# Извлекаем куки
|
||
if extract_cookies(driver, profile_index):
|
||
if transfer_cookies_via_scp(profile_index):
|
||
print(f" Процесс завершён успешно для профиля {profile_index}.")
|
||
else:
|
||
print(f"Ошибка при передаче cookies для профиля {profile_index}.")
|
||
else:
|
||
print(f"Ошибка при извлечении cookies для профиля {profile_index}.")
|
||
|
||
driver.quit()
|
||
return True
|
||
except Exception as e:
|
||
print(f"Общая ошибка выполнения скрипта для профиля {profile_index}: {e}")
|
||
return False
|
||
|
||
if __name__ == "__main__":
|
||
print("Начинаем выполнение скрипта.")
|
||
for profile_index, account in enumerate(ACCOUNTS, start=1):
|
||
print(f"Обработка профиля {profile_index}...")
|
||
process_profile(profile_index, account["email"], account["password"])
|
||
|
||
print("Все профили обработаны.")
|