Compare commits

..

2 Commits

Author SHA1 Message Date
Denis
24c3e61390 upd to sqlite3 2025-05-20 08:05:56 +03:00
Denis
4911a879c9 fix 2025-05-16 13:02:12 +03:00
6 changed files with 215 additions and 64 deletions

4
.env
View File

@ -1,3 +1,3 @@
API_ID= API_ID=21965168
API_HASH= API_HASH=99a551f86da94fbe39097f449434fd53
CHANNEL_URL=https://t.me/Burger_Game CHANNEL_URL=https://t.me/Burger_Game

View File

@ -1,5 +1,35 @@
{ {
"accounts": [ "accounts": [
{
"username": "steamok1089773",
"password": "steamok987",
"date": "2025-05-16T12:29:33"
},
{
"username": "ets2xiajsh",
"password": "https://playerok.com/profile/QAVIX/products",
"date": "2025-05-15T22:29:18"
},
{
"username": "qq1070414930",
"password": "mhEklDDkjP",
"date": "2025-05-15T19:27:34"
},
{
"username": "ivpopov13",
"password": "BQDhvkGfAPYh4Voqd8aco",
"date": "2025-05-15T14:11:40"
},
{
"username": "amlv63032",
"password": "CExXMoJXF1TU",
"date": "2025-05-15T10:30:16"
},
{
"username": "operpolnomochenxd",
"password": "208368382DashJiovanniNumber030993994",
"date": "2025-05-14T21:03:45"
},
{ {
"username": "thb111990", "username": "thb111990",
"password": "steamok111990", "password": "steamok111990",
@ -219,36 +249,6 @@
"username": "fpfuryfamily", "username": "fpfuryfamily",
"password": "thxfp362", "password": "thxfp362",
"date": "2025-05-02T15:07:06" "date": "2025-05-02T15:07:06"
},
{
"username": "ShezyyyFunPay",
"password": "funpay.com/users/8943271/",
"date": "2025-05-01T16:45:17"
},
{
"username": "fmih9tqp",
"password": "BulbulofficialFunPay",
"date": "2025-05-01T16:45:17"
},
{
"username": "impericon",
"password": "2O9CLXJFBQXT",
"date": "2025-04-30T21:47:13"
},
{
"username": "fpfuryfamily",
"password": "thxfp362",
"date": "2025-04-30T14:23:32"
},
{
"username": "komski01",
"password": "omarca06",
"date": "2025-04-29T22:59:56"
},
{
"username": "quincypugy",
"password": "0Heh%v4SSG",
"date": "2025-04-29T18:42:08"
} }
] ]
} }

View File

@ -1 +1 @@
{"accounts": [{"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:40:48"}, {"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:33:40"}, {"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:32:32"}, {"username": "thb111990", "password": "steamok111990", "date": "2025-05-14T16:16:05"}, {"username": "lrtts643631", "password": "dGCR2cEfN_", "date": "2025-05-14T12:44:33"}, {"username": "hazer3", "password": "S2477TT27EC6", "date": "2025-05-14T11:11:14"}, {"username": "brbba2063", "password": "che600220", "date": "2025-05-13T21:52:58"}]} {"accounts": [{"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:40:48"}, {"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:33:40"}, {"username": "enigma2370", "password": "users/14642501", "date": "2025-05-13T15:32:32"}, {"username": "thb111990", "password": "steamok111990", "date": "2025-05-14T16:16:05"}, {"username": "lrtts643631", "password": "dGCR2cEfN_", "date": "2025-05-14T12:44:33"}, {"username": "hazer3", "password": "S2477TT27EC6", "date": "2025-05-14T11:11:14"}, {"username": "brbba2063", "password": "che600220", "date": "2025-05-13T21:52:58"}, {"username": "ets2xiajsh", "password": "https://playerok.com/profile/QAVIX/products", "date": "2025-05-14T16:16:05"}, {"username": "steamok1089773", "password": "steamok987", "date": "2025-05-16T12:29:33"}, {"username": "ets2xiajsh", "password": "https://playerok.com/profile/QAVIX/products", "date": "2025-05-15T22:29:18"}, {"username": "qq1070414930", "password": "mhEklDDkjP", "date": "2025-05-15T19:27:34"}, {"username": "ivpopov13", "password": "BQDhvkGfAPYh4Voqd8aco", "date": "2025-05-15T14:11:40"}]}

39
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,15 +61,47 @@ 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)
if __name__ == '__main__': if __name__ == '__main__':
asyncio.run(fetch_and_monitor_accounts()) asyncio.run(fetch_and_monitor_accounts())
# asyncio.run(SteamLogin().open_steam_login_page_and_type())

View File

@ -64,3 +64,82 @@
2025-05-14 17:57:25,245 - steam_parser.steam - INFO - Вход для аккаунта lrtts643631 не удался. Ошибка: семейный доступ 2025-05-14 17:57:25,245 - steam_parser.steam - INFO - Вход для аккаунта lrtts643631 не удался. Ошибка: семейный доступ
2025-05-14 17:57:46,616 - steam_parser.steam - INFO - Вход для аккаунта hazer3 не удался. Ошибка: красная табличка 2025-05-14 17:57:46,616 - steam_parser.steam - INFO - Вход для аккаунта hazer3 не удался. Ошибка: красная табличка
2025-05-14 17:58:09,894 - steam_parser.steam - INFO - Вход для аккаунта brbba2063 не удался. Ошибка: красная табличка 2025-05-14 17:58:09,894 - steam_parser.steam - INFO - Вход для аккаунта brbba2063 не удался. Ошибка: красная табличка
2025-05-16 12:45:58,328 - steam_parser.steam - INFO - ✅ Guard code установлен для аккаунта: ets2xiajsh
2025-05-16 12:51:00,688 - pyrogram.session.auth - INFO - Start creating a new auth key on DC2
2025-05-16 12:51:00,689 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:51:00,690 - pyrogram.connection.connection - INFO - Connected! Production DC2 - IPv4
2025-05-16 12:51:02,939 - pyrogram.session.auth - INFO - Done auth key exchange: DhGenOk
2025-05-16 12:51:02,940 - pyrogram.connection.connection - INFO - Disconnected
2025-05-16 12:51:02,954 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:51:02,955 - pyrogram.connection.connection - INFO - Connected! Production DC2 - IPv4
2025-05-16 12:51:02,956 - pyrogram.session.session - INFO - NetworkTask started
2025-05-16 12:51:03,676 - pyrogram.session.session - INFO - Session initialized: Pyrogram v2.2.3 (Layer 203)
2025-05-16 12:51:03,677 - pyrogram.session.session - INFO - Device: CPython 3.10.0 - Pyrogram 2.2.3
2025-05-16 12:51:03,677 - pyrogram.session.session - INFO - System: Windows 10 (en)
2025-05-16 12:51:03,677 - pyrogram.session.session - INFO - Session started
2025-05-16 12:51:03,680 - pyrogram.session.session - INFO - PingTask started
2025-05-16 12:51:23,029 - pyrogram.session.session - INFO - PingTask stopped
2025-05-16 12:51:23,029 - pyrogram.connection.connection - INFO - Disconnected
2025-05-16 12:51:23,030 - pyrogram.session.session - INFO - NetworkTask stopped
2025-05-16 12:51:23,030 - pyrogram.session.session - INFO - Session stopped
2025-05-16 12:51:23,039 - pyrogram.session.auth - INFO - Start creating a new auth key on DC1
2025-05-16 12:51:23,039 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:51:23,040 - pyrogram.connection.connection - INFO - Connected! Production DC1 - IPv4
2025-05-16 12:51:25,707 - pyrogram.session.auth - INFO - Done auth key exchange: DhGenOk
2025-05-16 12:51:25,707 - pyrogram.connection.connection - INFO - Disconnected
2025-05-16 12:51:25,721 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:51:25,722 - pyrogram.connection.connection - INFO - Connected! Production DC1 - IPv4
2025-05-16 12:51:25,722 - pyrogram.session.session - INFO - NetworkTask started
2025-05-16 12:51:27,374 - pyrogram.session.session - INFO - Session initialized: Pyrogram v2.2.3 (Layer 203)
2025-05-16 12:51:27,374 - pyrogram.session.session - INFO - Device: CPython 3.10.0 - Pyrogram 2.2.3
2025-05-16 12:51:27,374 - pyrogram.session.session - INFO - System: Windows 10 (en)
2025-05-16 12:51:27,374 - pyrogram.session.session - INFO - Session started
2025-05-16 12:51:27,374 - pyrogram.session.session - INFO - PingTask started
2025-05-16 12:51:37,036 - pyrogram.dispatcher - INFO - Started 16 HandlerTasks
2025-05-16 12:51:39,584 - __main__ - INFO -
✅ Сохранено 50 аккаунтов в credentials.json
2025-05-16 12:53:06,874 - steam_parser.steam - INFO - ✅ Guard code установлен для аккаунта: steamok1089773
2025-05-16 12:54:55,102 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:54:55,104 - pyrogram.connection.connection - INFO - Connected! Production DC1 - IPv4
2025-05-16 12:54:55,106 - pyrogram.session.session - INFO - NetworkTask started
2025-05-16 12:54:56,204 - pyrogram.session.session - INFO - Session initialized: Pyrogram v2.2.3 (Layer 203)
2025-05-16 12:54:56,204 - pyrogram.session.session - INFO - Device: CPython 3.10.0 - Pyrogram 2.2.3
2025-05-16 12:54:56,204 - pyrogram.session.session - INFO - System: Windows 10 (en)
2025-05-16 12:54:56,204 - pyrogram.session.session - INFO - Session started
2025-05-16 12:54:56,215 - pyrogram.session.session - INFO - PingTask started
2025-05-16 12:54:56,965 - pyrogram.dispatcher - INFO - Started 16 HandlerTasks
2025-05-16 12:54:58,857 - __main__ - INFO -
✅ Сохранено 50 аккаунтов в credentials.json
2025-05-16 12:56:11,688 - steam_parser.steam - INFO - ✅ Guard code установлен для аккаунта: ets2xiajsh
2025-05-16 12:57:49,539 - pyrogram.connection.connection - INFO - Connecting...
2025-05-16 12:57:49,542 - pyrogram.connection.connection - INFO - Connected! Production DC1 - IPv4
2025-05-16 12:57:49,544 - pyrogram.session.session - INFO - NetworkTask started
2025-05-16 12:57:50,765 - pyrogram.session.session - INFO - Session initialized: Pyrogram v2.2.3 (Layer 203)
2025-05-16 12:57:50,765 - pyrogram.session.session - INFO - Device: CPython 3.10.0 - Pyrogram 2.2.3
2025-05-16 12:57:50,766 - pyrogram.session.session - INFO - System: Windows 10 (en)
2025-05-16 12:57:50,766 - pyrogram.session.session - INFO - Session started
2025-05-16 12:57:50,774 - pyrogram.session.session - INFO - PingTask started
2025-05-16 12:57:51,414 - pyrogram.dispatcher - INFO - Started 16 HandlerTasks
2025-05-16 12:57:53,257 - __main__ - INFO -
✅ Сохранено 50 аккаунтов в credentials.json
2025-05-16 12:58:53,750 - steam_parser.steam - INFO - ✅ Guard code установлен для аккаунта: qq1070414930
2025-05-16 12:59:40,770 - steam_parser.steam - INFO - Вход для аккаунта ivpopov13 не удался. Ошибка: Message: invalid session id
Stacktrace:
GetHandleVerifier [0x00007FF6BBF3CF65+75717]
GetHandleVerifier [0x00007FF6BBF3CFC0+75808]
(No symbol) [0x00007FF6BBD08DCC]
(No symbol) [0x00007FF6BBD4F54F]
(No symbol) [0x00007FF6BBD87242]
(No symbol) [0x00007FF6BBD81C63]
(No symbol) [0x00007FF6BBD80D29]
(No symbol) [0x00007FF6BBCD5A55]
GetHandleVerifier [0x00007FF6BC23D74D+3223469]
GetHandleVerifier [0x00007FF6BC237CF2+3200338]
GetHandleVerifier [0x00007FF6BC255B23+3322755]
GetHandleVerifier [0x00007FF6BBF56A3A+180890]
GetHandleVerifier [0x00007FF6BBF5E13F+211359]
(No symbol) [0x00007FF6BBCD4AC8]
GetHandleVerifier [0x00007FF6BC326FF8+4180056]
BaseThreadInitThunk [0x00007FF9DF79259D+29]
RtlUserThreadStart [0x00007FF9E0CCAF38+40]

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
@ -16,15 +17,15 @@ class SteamLogin():
if not os.path.exists('credentials_backup.json'): if not os.path.exists('credentials_backup.json'):
open('credentials_backup.json', 'w').write(json.dumps({'accounts': []})) open('credentials_backup.json', 'w').write(json.dumps({'accounts': []}))
options = Options() self.options = Options()
prefs = { prefs = {
"credentials_enable_service": False, "credentials_enable_service": False,
"profile.password_manager_enabled": False, "profile.password_manager_enabled": False,
"profile.password_manager_leak_detection": False # Отключение проверки утечек паролей "profile.password_manager_leak_detection": False # Отключение проверки утечек паролей
} }
options.add_experimental_option("prefs", prefs) self.options.add_experimental_option("prefs", prefs)
self.driver = webdriver.Chrome( self.driver = webdriver.Chrome(
options=options options=self.options
) )
def __wait_get(self, xpath: str, timeout: int = 15): def __wait_get(self, xpath: str, timeout: int = 15):
@ -36,37 +37,73 @@ 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 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
date TEXT NOT NULL,
added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
open('credentials_backup.json', 'w').write(json.dumps(data)) # Пробуем вставить новую запись (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 open_steam_login_page_and_type(self): def __restart_driver(self):
self.driver.quit()
self.driver = webdriver.Chrome(
options=self.options
)
self.driver.get("https://steamcommunity.com/login/home/?goto=")
# time.sleep(15)
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()
for account in data['accounts']: # Преобразуем в множества для быстрой проверки
archived_set = {(acc[0], acc[1]) for acc in archived_accounts}
if account in archive: # Фильтруем уникальные аккаунты
continue unique_accounts = [
{'username': acc[0], 'password': acc[1], 'date': acc[2]}
for acc in data
if (acc[0], acc[1]) not in archived_set
]
time.sleep(30) for account in unique_accounts:
# time.sleep(30)
username = account['username'] username = account['username']
password = account['password'] password = account['password']
# Задержка перед заходом в аккаунт # Задержка перед заходом в аккаунт
WebDriverWait(self.driver, 30).until( WebDriverWait(self.driver, 15).until(
EC.presence_of_element_located(("xpath", '//*[@id="responsive_page_template_content"]/div[1]/div[1]/div/div/div/div[2]/div/form/div[1]/input')) EC.presence_of_element_located(("xpath", '//*[@id="responsive_page_template_content"]/div[1]/div[1]/div/div/div/div[2]/div/form/div[1]/input'))
) )
@ -84,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
@ -99,8 +136,8 @@ class SteamLogin():
if is_family: if is_family:
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.driver.get("https://steamcommunity.com/login/home/?goto=") self.__restart_driver()
self.__write_to_json(account) await self.__write_to_database(account)
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: семейный доступ") logger.info(f"Вход для аккаунта {username} не удался. Ошибка: семейный доступ")
continue continue
@ -115,6 +152,8 @@ class SteamLogin():
WebDriverWait(self.driver, 10).until( WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(('xpath', '//*[@id="main_content"]/div[2]/div/div[2]/div[3]/div[5]/div[2]/a')) EC.presence_of_element_located(('xpath', '//*[@id="main_content"]/div[2]/div/div[2]/div[3]/div[5]/div[2]/a'))
).click() ).click()
# ключевой момент
WebDriverWait(self.driver, 10).until( WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located(('xpath', '//*[@id="email_authenticator_form"]/div/div[2]/label')) EC.presence_of_element_located(('xpath', '//*[@id="email_authenticator_form"]/div/div[2]/label'))
).click() ).click()
@ -123,8 +162,8 @@ class SteamLogin():
if is_red: if is_red:
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.driver.get("https://steamcommunity.com/login/home/?goto=") self.__restart_driver()
self.__write_to_json(account) await self.__write_to_database(account)
logger.info(f"Вход для аккаунта {username} не удался. Ошибка: красная табличка") logger.info(f"Вход для аккаунта {username} не удался. Ошибка: красная табличка")
continue continue
@ -144,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.driver.get("https://steamcommunity.com/login/home/?goto=") self.__restart_driver()