From 24c3e613903c102c4d7335ce09a5f3519b2108e9 Mon Sep 17 00:00:00 2001 From: Denis <87643305+love-apples@users.noreply.github.com> Date: Tue, 20 May 2025 08:05:56 +0300 Subject: [PATCH] upd to sqlite3 --- main.py | 38 ++++++++++++++++++++++-- steam_parser/steam.py | 68 ++++++++++++++++++++++++++++++------------- 2 files changed, 83 insertions(+), 23 deletions(-) diff --git a/main.py b/main.py index e901d7b..687ec9c 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ import json import logging import os +import aiosqlite from dotenv import load_dotenv from pyrogram import Client @@ -60,12 +61,43 @@ async def fetch_and_monitor_accounts(): accounts.sort(key=lambda x: x['date'], reverse=True) top_50 = accounts[:50] - with open('credentials.json', 'w', encoding='utf-8') as f: - json.dump({'accounts': top_50}, f, indent=4, ensure_ascii=False) + async with aiosqlite.connect('credentials.db') as db: + # Создаем таблицу, если её нет + 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") - SteamLogin().open_steam_login_page_and_type() + await SteamLogin().open_steam_login_page_and_type() await asyncio.sleep(30) diff --git a/steam_parser/steam.py b/steam_parser/steam.py index 6df5702..a03a5c3 100644 --- a/steam_parser/steam.py +++ b/steam_parser/steam.py @@ -3,6 +3,7 @@ import os import logging import time +import aiosqlite from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait @@ -36,12 +37,30 @@ class SteamLogin(): ... - def __write_to_json(self, account: dict): - with open('credentials_backup.json', 'r') as file: - data = json.load(file) - data['accounts'].append(account) - - open('credentials_backup.json', 'w').write(json.dumps(data)) + async def __write_to_database(self, account: dict): + async with aiosqlite.connect('credentials.db') as db: + # Создаем таблицу если её нет + await db.execute(''' + CREATE TABLE IF NOT EXISTS backup_accounts ( + 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): @@ -53,22 +72,31 @@ class SteamLogin(): # time.sleep(15) - def open_steam_login_page_and_type(self): + async def open_steam_login_page_and_type(self): # Открываем страницу входа в Steam self.driver.get("https://steamcommunity.com/login/home/?goto=") # Загружаем учетные данные из JSON файла - with open('credentials.json', 'r') as file: - data = json.load(file) + async with aiosqlite.connect('credentials.db') as db: + # Получаем свежие аккаунты из основной таблицы + cursor = await db.execute('SELECT username, password, date FROM accounts') + data = await cursor.fetchall() - with open('credentials_backup.json', 'r') as file: - archive = json.load(file)['accounts'] + cursor = await db.execute('SELECT username, password, date FROM backup_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) 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) if is_code: self.driver.get("https://steamcommunity.com/login/home/?goto=") - self.__write_to_json(account) + await self.__write_to_database(account) logger.info(f"Вход для аккаунта {username} не удался. Ошибка: требуется код из почты") continue is_authed = self.__wait_get('//*[@id="account_pulldown"]', 5) if not is_authed: self.driver.get("https://steamcommunity.com/login/home/?goto=") - self.__write_to_json(account) + await self.__write_to_database(account) logger.info(f"Вход для аккаунта {username} не удался. Ошибка: не авторизован") continue @@ -109,7 +137,7 @@ class SteamLogin(): self.__wait_get('//*[@id="account_pulldown"]').click() self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click() self.__restart_driver() - self.__write_to_json(account) + await self.__write_to_database(account) logger.info(f"Вход для аккаунта {username} не удался. Ошибка: семейный доступ") continue @@ -135,7 +163,7 @@ class SteamLogin(): self.__wait_get('//*[@id="account_pulldown"]').click() self.__wait_get('//*[@id="account_dropdown"]/div/a[last()]').click() self.__restart_driver() - self.__write_to_json(account) + await self.__write_to_database(account) logger.info(f"Вход для аккаунта {username} не удался. Ошибка: красная табличка") continue @@ -155,6 +183,6 @@ class SteamLogin(): logger.info(f"Вход для аккаунта {username} не удался. Ошибка: {str(e)}") # Возвращаемся на страницу входа для следующего аккаунта - self.__write_to_json(account) + await self.__write_to_database(account) self.__restart_driver()