A
A
AlexSn20202020-07-01 19:28:44
Python
AlexSn2020, 2020-07-01 19:28:44

How to implement simultaneous use of Telegram bot by several users?

I am learning to write bots in Python. For example, I chose a bot-exchanger for the exmo exchange. When I access the bot alone, everything works fine, but when from several accounts at the same time, the bot confuses the variables and gives incorrect data, help, who can)

import config
import mail
import exmo_exchange
import telebot
from telebot import types
from random import randint

bot=telebot.TeleBot(config.token)

keyboard1=telebot.types.ReplyKeyboardMarkup(True)
keyboard1.row('EXMO')
keyboard2=telebot.types.ReplyKeyboardMarkup(True)
keyboard2.row('Да',' Нет')
keyboard3=telebot.types.ReplyKeyboardMarkup(True)
keyboard3.row('Я ОПЛАТИЛ')

summi_coda_i_plati=[]

@bot.message_handler(commands=['start'])
def start_messages(message):
    msg=bot.send_message(message.chat.id, 'Привет, что хотите обменять?: ',reply_markup=keyboard1)

@bot.message_handler(content_types=["text"])
def send_text(message):
    try:
        if message.text.lower()=='exmo':
            msg=bot.send_message(message.chat.id,'Введите сумму в EXMO')
        elif message.text.lower()=='btc':
            msg=bot.send_message(message.chat.id,'Введите сумму в BTC')
        bot.register_next_step_handler(msg, send_digit)
    except Exception as e:
        bot.reply_to(message,'Чтобы начать сначала нажмите "/start"')

@bot.message_handler(content_types=["text"])
def send_digit (message):
    summ=message.text
    if summ.isdigit():
        summi_coda_i_plati.append(int(summ))
        summ2=int(summ)*1.10
        summ3=int(summ2)+randint(-3,+9)
        summi_coda_i_plati.append(str(summ3))
        otvet=str(summ3)+' рублей на карту'
        msg=bot.send_message(message.chat.id,otvet)
        msg=bot.send_message(message.chat.id,' Готов?',reply_markup=keyboard2)
        bot.register_next_step_handler(msg, send_number)
    else:
        msg=bot.send_message(message.chat.id,'Вы ввели некорректные данные. Чтобы начать сначала, нажмите "/start"')
        bot.register_next_step_handler(msg, start_messages)
    
@bot.message_handler(content_types=["text"])
def send_number (message):
    if message.text.lower()=='да':
        number='5536 9137 7601 0502'
        otvet='Переведите на номер карты "Тинькофф ": '+number+''' указанную выше сумму.
        После оплаты нажмите ОДИН РАЗ "Я ОПЛАТИЛ" и ждите получения кода.
        Как только средства поступят, бот выдаст код. Не нужно жать кнопку несколько раз.
        ПЕРЕВОДИТЕ ТОЧНО ТУ СУММУ, ЧТО УКАЗАНА БОТОМ, ИНАЧЕ ВОЗНИКНУТ СЛОЖНОСТИ С ВЫДАЧЕЙ КОДА'''
        msg=bot.send_message(message.chat.id, otvet,reply_markup=keyboard3 )
        bot.register_next_step_handler(msg, send_code)
    else:
        msg=bot.send_message(message.chat.id, 'Чтобы начать сначала нажмите "/start" ')
        bot.register_next_step_handler(msg, start_messages)
    
@bot.message_handler(content_types=["text"])
def send_code(message):
    if message.text.lower()=='я оплатил':
        user_id=message.from_user.id
        name_of_user=message.from_user.username
        excode_to_send=mail.email_check(summi_coda_i_plati[0],summi_coda_i_plati[1])
        msg=bot.send_message(message.chat.id,excode_to_send)
        
bot.polling()

Answer the question

In order to leave comments, you need to log in

3 answer(s)
H
Hukyl, 2020-07-01
@Hukyl

Try to wrap all the code in OOP, then most likely there will be no problems with overlapping variables

A
AlexSn2020, 2020-07-01
@AlexSn2020

Create variables through a separate class or what do you mean? :)

S
soremix, 2020-07-01
@SoreMix

So you are constantly accessing the same data. Who first wrote down the data here - those data are returned.

excode_to_send=mail.email_check(summi_coda_i_plati[0],summi_coda_i_plati[1])

Also remove unnecessary handlers, why do you need four identical decorators

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question