jawikas/hamsterkombat

read tokens from database

Opened this issue · 10 comments

В базе данных одна таблица, 4 столбца. id, user_id, code, date
При вычитке нужно выбирать по префиксу игры (CUBE%, BIKE% итд), из строк, где в поле столбец пусто.
При изъятии промокода добавлять заполнять строку данными из tokens.txt - предлагаю брать user_id и датой изъятия в формате YYYY-MM-DD

provide details or screenshots

image
Пример токенов, помещённых в базу данных. mysql - исключительно потому, что мне с ней проще работать. На самом деле при таких объёмах данных можно использовать firebird или sqlite. Суть в том, что база данных структурирована и с ней можно работать одновременно нескольким приложениям.
Сейчас я помещаю в эту таблицу костылём уникальные токены из генератора токенов. Уже из этой таблицы беру их для выдачи в бота (можно запросить и он для одного user_id выдаст в день 16 токенов (по 4 для каждой из 4 игр). Это удобно.
У меня генератор работает круглосуточно, собирая по 4 токена каждые 10 минут. Таким образом в сутки можно нагенерировать 576 токенов. Итого можно отдать их 36 человекам, которые не имеют технической возможности ботоводства.
image

image
можем обсудить в личке то как скрестить функционал этого бота и генератора из соседнего репозитория.
Опять же понимаю, что функционал нужен не всем, поэтому достаточно сделать это опцией. Фактически в генератор и в бота добавится по функции и по параметру конфига (использовать ли СУБД, какую использовать СУБД, строка подключения)

sorry, what are you talking about and which part to fix? hamster kombat or code generator.

I only use translate and when Russian is translated to my language it's a mess. lol

And even if you discuss my hamster code generator, it will generate thousands of promo codes per day. Can you calculate if 10 codes every 3-5 minutes multiplied by 1 day?

I'm talking about writing an additional function in the bot. She will take tokens from the database. The code generator will write the codes to the database.
At the same time, you can add a separate bot that will give 16 codes per day to those who do not have the technical ability to generate them.

101224=2880 codes
2880/16=180 people will be able to receive Playground codes

Thus, writing to the database will not only allow you to transfer data between scripts, but also add additional features for working with codes.

    "read_from_db": true,
    "db_config":{
        "host": "localhost",
        "user": "root",
        "password": "123123",
        "database": "123123"
    }
import requests
from collections import defaultdict
from src.utils import get_headers
from src.__init__ import countdown_timer, log, hju, kng, mrh, pth, bru, read_config
import mysql.connector
from datetime import datetime

config = read_config()

def load_promo_from_file(filename='./data/promo.txt'):
    with open(filename, 'r') as file:
        promo_codes = [line.strip() for line in file]
    promo_dict = defaultdict(list)
    for code in promo_codes:
        code_type = code.split('-')[0]
        promo_dict[code_type].append(code)
    return promo_dict

def load_promo_from_db(db_config):
    connection = mysql.connector.connect(
        host=db_config['host'],
        user=db_config['user'],
        password=db_config['password'],
        database=db_config['database']
    )
    cursor = connection.cursor()
    cursor.execute("SELECT content FROM records WHERE user_id IS NULL")
    promo_codes = cursor.fetchall()
    cursor.close()
    connection.close()

    promo_dict = defaultdict(list)
    for code in promo_codes:
        code_type = code[0].split('-')[0]
        promo_dict[code_type].append(code[0])

    return promo_dict

def save_promo(promo_dict, filename='./data/promo.txt'):
    with open(filename, 'w') as file:
        for code_list in promo_dict.values():
            for code in code_list:
                file.write(code + '\n')

def update_promo_code_in_db(db_config, promo_code, user_id):
    connection = mysql.connector.connect(
        host=db_config['host'],
        user=db_config['user'],
        password=db_config['password'],
        database=db_config['database']
    )
    cursor = connection.cursor()
    update_query = """
    UPDATE records
    SET user_id = %s, date_sent = %s
    WHERE content = %s
    """
    current_date = datetime.now().strftime('%Y-%m-%d')
    cursor.execute(update_query, (user_id, current_date, promo_code))
    connection.commit()
    cursor.close()
    connection.close()

def redeem_promo(token):
    if config.get('read_from_db', False):
        promo_dict = load_promo_from_db(config['db_config'])
    else:
        promo_dict = load_promo_from_file()

    if not promo_dict:
        log(mrh + f"No codes available in {pth}promo.txt.")
        return

    user_id = "66666666"
    if not user_id:
        log(mrh + "User ID not found.")
        return

    max_attempts = 4
    attempts_tracker = defaultdict(int)
    http_error_tracker = defaultdict(int)
    max_http_errors = 2
requests
colorama
fake-useragent
lxml-html-clean
requests-html
mysql.connector

А почему уже два дня не даёт ключи на байк , кто то из знающих ответит? Бот не генерит ключи, в игре их пока дают, но дольше обычного

изменилась логика получения ключей байк.

Да ничего не изменилось. Просто изначально все эти генераторы кривые. И теперь им это аукнулось.
Они не учитывают ни время между эмуляцией событий (оно должно быть больше, а у пары игр в разы больше), ни самой длительности игры

 for i in range(11):
        await asyncio.sleep(EVENTS_DELAY * delay_random())
        has_code = await emulate_progress(client_token, game['promoId'], proxies)

что будет если за 11 событий не наступит момент "ключ можно забирать"?
вот вам и ответ почему что то ломается или палится (хотя разрабам СКАМяка на этот аспект плевать)