如何实现多个用户同时使用Telegram机器人?

时间:2020-07-02 13:30:53

标签: python bots telegram

学习用Python编写机器人。例如,我选择了机器人交换器进行exmo交换。当我单独使用机器人时,一切正常,但是当同时使用多个帐户时,机器人会混淆变量并提供错误的数据,帮助,谁可以 这是我的代码(对不起,我的英语不好,我是俄语,但是在我们的论坛中没有人可以帮助我): '''

class MyBot:
    def __init__(self, bot,keyboard1, keyboard2, keyboard3,summa_code,summa_payment):
        self.bot=bot
        self.keyboard1=keyboard1
        self.keyboard1.row('EXMO')
        self.keyboard2=keyboard2
        self.keyboard2.row('Да',' Нет')
        self.keyboard3=keyboard3
        self.keyboard3.row('Я ОПЛАТИЛ')
        self.summa_code=summa_code
        self.summa_payment=summa_payment

'''
'''
import config
import mail
import exmo_exchange
import telebot
from telebot import types
from random import randint
from class_bot import *
        
summa_code=0
summa_payment=''
mybot_1=MyBot(telebot.TeleBot(config.token),telebot.types.ReplyKeyboardMarkup(True),telebot.types.ReplyKeyboardMarkup(True), telebot.types.ReplyKeyboardMarkup(True),summa_code,summa_payment)           

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

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


def send_digit (message):
    summ=message.text
    if summ.isdigit():
        **mybot_1.summa_code=int(summ)**
        summ2=int(summ)*1.10
        summ3=int(summ2)+randint(-3,+9)
        **mybot_1.summa_payment=str(summ3)**
        answer=str(summ3)+' рублей на карту'
        msg=mybot_1.bot.send_message(message.chat.id,answer)
        msg=mybot_1.bot.send_message(message.chat.id,' Готов?',reply_markup=mybot_1.keyboard2)
        mybot_1.bot.register_next_step_handler(msg, send_number)
    else:
        msg=mybot_1.bot.send_message(message.chat.id,'Вы ввели некорректные данные. Чтобы начать сначала, нажмите "/start"')
        mybot_1.bot.register_next_step_handler(msg, start_messages)
        

def send_number (message):
    if message.text.lower()=='да':
        number='5555 5555 5555 5555'
        answer='Переведите на номер карты "Тинькофф ": '+number+''' указанную выше сумму.
            После оплаты нажмите ОДИН РАЗ "Я ОПЛАТИЛ" и ждите получения кода.
            Как только средства поступят, бот выдаст код. Не нужно жать кнопку несколько раз.
            ПЕРЕВОДИТЕ ТОЧНО ТУ СУММУ, ЧТО УКАЗАНА БОТОМ, ИНАЧЕ ВОЗНИКНУТ СЛОЖНОСТИ С ВЫДАЧЕЙ КОДА'''
        msg=mybot_1.bot.send_message(message.chat.id, answer,reply_markup=mybot_1.keyboard3 )
        mybot_1.bot.register_next_step_handler(msg, send_code)
    else:
        msg=mybot_1.bot.send_message(message.chat.id, 'Чтобы начать сначала нажмите "/start" ')
        mybot_1.bot.register_next_step_handler(msg, start_messages)
        

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(**mybot_1.summa_code,mybot_1.summa_payment**)
        msg=mybot_1.bot.send_message(message.chat.id,excode_to_send)
        
mybot_1.bot.polling()

'''

1 个答案:

答案 0 :(得分:0)

看来我已经找到了解决方案。 我也遇到了这个问题。我做的第一件事就是面向对象编程。

  1. 创建类用户。
  2. 向类添加了方法和属性。

我还使用 Google Sheets API 作为数据库。所以当新用户发送 /start 命令程序创建新对象时,然后将其添加到数据库中。当存在用户发送/启动命令程序时,只需在数据库中找到他并复制到对象。但是,如果您启动它,它将不适用于多个用户。因为每次它只是替换用户属性而您不能与以前的用户一起工作。为了修复它,我创建了字典。 Key 是用户的 chat_id,值是 User 对象。 简单的代码如下所示:

import telebot
    users = {}
    bot = telebot.TeleBot(token, parse_mode=None) #Bot initialiaze
    
    class User:
        def __init__(self, chat_id, first_name, last_name):
            self.chat_id = chat_id
            self.first_name = first_name
            self.last_name = last_name
            
    @bot.message_handler(commands=['start'])
    def greetings(message):
        users["{0}".format(message.chat.id)] = User(message.chat.id, message.from_user.first_name, message.from_user.last_name)
    
    @bot.message_handler(content_types = ['text']
    def simple_response(message):
        bot.send_message(users["{0}".format(message.chat.id)], text = users["{0}".format(message.chat.id)].first_name + ": " + message.text)
        
    if __name__ == '__main__':
        bot.polling()

正如你所看到的,它总是找到等于 message.chat.id 的键,一旦它找到你就得到了用户的数据,因为这个键的值是用户对象。 希望我回答了你的问题。