upd to sqlite3

This commit is contained in:
Denis 2025-05-20 08:05:56 +03:00
parent 4911a879c9
commit 24c3e61390
2 changed files with 83 additions and 23 deletions

38
main.py
View File

@ -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)

View File

@ -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()