@Usenovich

Как обслуживать юзеров по очереди телебот?

У меня есть бот, который принимает от пользователя адрес на кошелек на бирже. И вставляет этот адрес в конец ссылки и парсит оттуда цифру, сохраняет результат в xlsx файл и отправляет пользователю. У меня такая проблема, если один и тот же пользователь заново отправит адресы то бот добавит результаты в прежни файл, и отправит пользователю. Мне надо что-бы бот перезаписывал данные в файл. Вторая проблема если два пользователя отправят одновременно адресы то бот сохраняет адресы двух пользователей в один файл и отправляет обеим. Есть ли способ что бы бот обслуживал юзереов по очереди или не знаю хоть какое то решение.

import requests
import telebot
import pandas as pd

bot = telebot.TeleBot(',,,')

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",
    "Accept-Language": "ru,en-US;q=0.9,en;q=0.8,ru-RU;q=0.7"
}

@bot.message_handler(commands=['start'])
def start(message):
    global user_id
    user_id = message.from_user.id
    msg = bot.send_message(message.chat.id,'Здравствуйте, отправьте адреса кошельков что бы между адресами был пробел(запятая и перевод строки не подходят),')
    bot.register_next_step_handler(msg, sender)

urls_list = []
price_list = []

@bot.message_handler(func=lambda m: True)
def sender(message):
    user_id = message.from_user.id
    number = (len(message.text.split(' ')))
    for count in range(0,number):
        addresses = message.text.split(' ')[count]
        response = requests.get(url = f'https://api.debank.com/hi/user/info?id={addresses}', headers=HEADERS).text
        price = response.split('"usd_value":')[1].split(',')[0].split('.')[0]
        print(price)

        urls_list.append('https://debank.com/profile/' + addresses)
        price_list.append(price)

        df = pd.DataFrame ({'urls':urls_list,'amounts':price_list})
        df.to_excel(f'D:\PYTHON\DeBank\{user_id}.xlsx', sheet_name='Info', index=False)
    

    file = open(f'D:\PYTHON\DeBank\{user_id}.xlsx','rb')
    bot.send_document(message.chat.id,file)

bot.infinity_polling(skip_pending = True)
  • Вопрос задан
  • 211 просмотров
Решения вопроса 4
Vindicar
@Vindicar
RTFM!
global user_id
Ну как бы вот виновник. Глобальные переменные. Они общие на всего бота и на всех пользователей. Если тебе нужно дифференцировать пользователей - делай это сам.
Делай хранилище "ключ-значение", где ключ - ID пользователя, значение - хранимые для этого пользователя данные. При обработке сообщения читай ID пользователя, доставай из хранилища данные, и уже сообразно им обрабатывай сообщение.
Таким хранилищем может быть простой словарь (если не нужно сохранять состояние между перезапусками бота), БД или ещё что.

Не знаю, есть ли в telebot реализация Finite State Machine, но обычно для реализации сценариев используют её. Идея та же - для каждого юзера храним его текущее состояние (шаг в сценарии) и ассоциированные с ним данные.
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
У тебя глобальные urls_list, price_list. Перемести их в функцию sender, они всё равно при каждом её вызове должны инициализироваться заново. Именно это и вызывает сейчас проблемы.
Ответ написан
Комментировать
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Проблема в этой строке:
global user_id
Вам надо построить код так, чтобы не использовать global.
Ответ написан
@nozzy
Symfony, Laravel, SQL
@bot.message_handler(commands=['start'])
def start(message):
    msg = bot.send_message(message.chat.id,'Здравствуйте, отправьте адреса кошельков что бы между адресами был пробел(запятая и перевод строки не подходят),')
    bot.register_next_step_handler(msg, sender)

@bot.message_handler(func=lambda m: True)
def sender(message):
    urls_list = []
    price_list = []
    user_id = message.from_user.id
    number = (len(message.text.split(' ')))
    for count in range(0,number):
        addresses = message.text.split(' ')[count]
        response = requests.get(url = f'https://api.debank.com/hi/user/info?id={addresses}', headers=HEADERS).text
        price = response.split('"usd_value":')[1].split(',')[0].split('.')[0]
        print(price)

        urls_list.append('https://debank.com/profile/' + addresses)
        price_list.append(price)

        df = pd.DataFrame ({'urls':urls_list,'amounts':price_list})
        df.to_excel(f'D:\PYTHON\DeBank\{user_id}.xlsx', sheet_name='Info', index=False)
    

    file = open(f'D:\PYTHON\DeBank\{user_id}.xlsx','rb')
    bot.send_document(message.chat.id,file)
    #Здесь удали файл 'D:\PYTHON\DeBank\{user_id}.xlsx'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы