学习用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()
'''
答案 0 :(得分:0)
看来我已经找到了解决方案。 我也遇到了这个问题。我做的第一件事就是面向对象编程。
我还使用 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 的键,一旦它找到你就得到了用户的数据,因为这个键的值是用户对象。 希望我回答了你的问题。