upd to sqlite3
This commit is contained in:
parent
4911a879c9
commit
24c3e61390
38
main.py
38
main.py
@ -4,6 +4,7 @@ import json
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import aiosqlite
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from pyrogram import Client
|
from pyrogram import Client
|
||||||
|
|
||||||
@ -60,12 +61,43 @@ async def fetch_and_monitor_accounts():
|
|||||||
accounts.sort(key=lambda x: x['date'], reverse=True)
|
accounts.sort(key=lambda x: x['date'], reverse=True)
|
||||||
top_50 = accounts[:50]
|
top_50 = accounts[:50]
|
||||||
|
|
||||||
with open('credentials.json', 'w', encoding='utf-8') as f:
|
async with aiosqlite.connect('credentials.db') as db:
|
||||||
json.dump({'accounts': top_50}, f, indent=4, ensure_ascii=False)
|
# Создаем таблицу, если её нет
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS accounts (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL,
|
||||||
|
password TEXT NOT NULL,
|
||||||
|
date TEXT NOT NULL,
|
||||||
|
added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
await db.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS backup_accounts (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL,
|
||||||
|
password TEXT NOT NULL,
|
||||||
|
date TEXT NOT NULL,
|
||||||
|
added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Очищаем старые записи перед добавлением новых
|
||||||
|
await db.execute('DELETE FROM accounts')
|
||||||
|
|
||||||
|
# Вставляем новые записи
|
||||||
|
for account in top_50:
|
||||||
|
await db.execute(
|
||||||
|
'INSERT INTO accounts (username, password, date) VALUES (?, ?, ?)',
|
||||||
|
(account['username'], account['password'], account['date'])
|
||||||
|
)
|
||||||
|
|
||||||
|
await db.commit()
|
||||||
|
|
||||||
logger.info(f"\n✅ Сохранено {len(top_50)} аккаунтов в credentials.json")
|
logger.info(f"\n✅ Сохранено {len(top_50)} аккаунтов в credentials.json")
|
||||||
|
|
||||||
SteamLogin().open_steam_login_page_and_type()
|
await SteamLogin().open_steam_login_page_and_type()
|
||||||
|
|
||||||
await asyncio.sleep(30)
|
await asyncio.sleep(30)
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ import os
|
|||||||
import logging
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import aiosqlite
|
||||||
from selenium import webdriver
|
from selenium import webdriver
|
||||||
from selenium.webdriver.chrome.options import Options
|
from selenium.webdriver.chrome.options import Options
|
||||||
from selenium.webdriver.support.ui import WebDriverWait
|
from selenium.webdriver.support.ui import WebDriverWait
|
||||||
@ -36,12 +37,30 @@ class SteamLogin():
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
def __write_to_json(self, account: dict):
|
async def __write_to_database(self, account: dict):
|
||||||
with open('credentials_backup.json', 'r') as file:
|
async with aiosqlite.connect('credentials.db') as db:
|
||||||
data = json.load(file)
|
# Создаем таблицу если её нет
|
||||||
data['accounts'].append(account)
|
await db.execute('''
|
||||||
|
CREATE TABLE IF NOT EXISTS backup_accounts (
|
||||||
open('credentials_backup.json', 'w').write(json.dumps(data))
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL UNIQUE,
|
||||||
|
password TEXT NOT NULL,
|
||||||
|
date TEXT NOT NULL,
|
||||||
|
added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||||
|
)
|
||||||
|
''')
|
||||||
|
|
||||||
|
# Пробуем вставить новую запись (UNIQUE constraint предотвратит дубликаты)
|
||||||
|
try:
|
||||||
|
await db.execute(
|
||||||
|
'''INSERT INTO backup_accounts (username, password, date)
|
||||||
|
VALUES (?, ?, ?)''',
|
||||||
|
(account['username'], account['password'], account['date'])
|
||||||
|
)
|
||||||
|
await db.commit()
|
||||||
|
except aiosqlite.IntegrityError:
|
||||||
|
# Аккаунт уже существует в базе
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def __restart_driver(self):
|
def __restart_driver(self):
|
||||||
@ -53,22 +72,31 @@ class SteamLogin():
|
|||||||
# time.sleep(15)
|
# time.sleep(15)
|
||||||
|
|
||||||
|
|
||||||
def open_steam_login_page_and_type(self):
|
async def open_steam_login_page_and_type(self):
|
||||||
# Открываем страницу входа в Steam
|
# Открываем страницу входа в Steam
|
||||||
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
||||||
|
|
||||||
# Загружаем учетные данные из JSON файла
|
# Загружаем учетные данные из JSON файла
|
||||||
with open('credentials.json', 'r') as file:
|
async with aiosqlite.connect('credentials.db') as db:
|
||||||
data = json.load(file)
|
# Получаем свежие аккаунты из основной таблицы
|
||||||
|
cursor = await db.execute('SELECT username, password, date FROM accounts')
|
||||||
|
data = await cursor.fetchall()
|
||||||
|
|
||||||
with open('credentials_backup.json', 'r') as file:
|
cursor = await db.execute('SELECT username, password, date FROM backup_accounts')
|
||||||
archive = json.load(file)['accounts']
|
archived_accounts = await cursor.fetchall()
|
||||||
|
|
||||||
|
# Преобразуем в множества для быстрой проверки
|
||||||
|
archived_set = {(acc[0], acc[1]) for acc in archived_accounts}
|
||||||
|
|
||||||
|
# Фильтруем уникальные аккаунты
|
||||||
|
unique_accounts = [
|
||||||
|
{'username': acc[0], 'password': acc[1], 'date': acc[2]}
|
||||||
|
for acc in data
|
||||||
|
if (acc[0], acc[1]) not in archived_set
|
||||||
|
]
|
||||||
|
|
||||||
for account in data['accounts']:
|
for account in unique_accounts:
|
||||||
|
|
||||||
if account in archive:
|
|
||||||
continue
|
|
||||||
|
|
||||||
# time.sleep(30)
|
# time.sleep(30)
|
||||||
|
|
||||||
username = account['username']
|
username = account['username']
|
||||||
@ -93,14 +121,14 @@ class SteamLogin():
|
|||||||
is_code = self.__wait_get('//*[@id="responsive_page_template_content"]/div[1]/div[1]/div/div/div/div[2]/form/div/a', 5)
|
is_code = self.__wait_get('//*[@id="responsive_page_template_content"]/div[1]/div[1]/div/div/div/div[2]/form/div/a', 5)
|
||||||
if is_code:
|
if is_code:
|
||||||
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
||||||
self.__write_to_json(account)
|
await self.__write_to_database(account)
|
||||||
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: требуется код из почты")
|
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: требуется код из почты")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
is_authed = self.__wait_get('//*[@id="account_pulldown"]', 5)
|
is_authed = self.__wait_get('//*[@id="account_pulldown"]', 5)
|
||||||
if not is_authed:
|
if not is_authed:
|
||||||
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
self.driver.get("https://steamcommunity.com/login/home/?goto=")
|
||||||
self.__write_to_json(account)
|
await self.__write_to_database(account)
|
||||||
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: не авторизован")
|
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: не авторизован")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -109,7 +137,7 @@ class SteamLogin():
|
|||||||
self.__wait_get('//*[@id="account_pulldown"]').click()
|
self.__wait_get('//*[@id="account_pulldown"]').click()
|
||||||
self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click()
|
self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click()
|
||||||
self.__restart_driver()
|
self.__restart_driver()
|
||||||
self.__write_to_json(account)
|
await self.__write_to_database(account)
|
||||||
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: семейный доступ")
|
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: семейный доступ")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -135,7 +163,7 @@ class SteamLogin():
|
|||||||
self.__wait_get('//*[@id="account_pulldown"]').click()
|
self.__wait_get('//*[@id="account_pulldown"]').click()
|
||||||
self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click()
|
self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click()
|
||||||
self.__restart_driver()
|
self.__restart_driver()
|
||||||
self.__write_to_json(account)
|
await self.__write_to_database(account)
|
||||||
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: красная табличка")
|
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: красная табличка")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -155,6 +183,6 @@ class SteamLogin():
|
|||||||
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: {str(e)}")
|
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: {str(e)}")
|
||||||
|
|
||||||
# Возвращаемся на страницу входа для следующего аккаунта
|
# Возвращаемся на страницу входа для следующего аккаунта
|
||||||
self.__write_to_json(account)
|
await self.__write_to_database(account)
|
||||||
self.__restart_driver()
|
self.__restart_driver()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user