Задать вопрос
AHikaru
@AHikaru

Телебот.Как выполнить в основном файле .py команды из другого .py файла?

Есть три файла main.py, commands.py, weather.py.
Когда я импортирую из commands.py все в main.py, то команды из commands.py работают, но не работает content_types= из main.py.(по отдельности все файлы работают, также все будет работать, если я из commands.py просто скопирую все @bot.message_handler в main.py и поставлю их перед content_types= , но хотелось бы разобраться в этом вопросе)
weather.py это бот, которого я делал по обучалке, и пока совершенно нет идей как его сюда впихнуть, тем более, что не получается с commands.py.

main.py

import telebot
import sys
from requests import get
from config import TOKEN
from commands import *
bot = telebot.TeleBot(TOKEN);

a = ["привет","здарова","ку"]
b = ["пока", "давай", "ухожу", "вали"]

@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() in a:
        bot.send_message(message.chat.id, 'Привет, создатель')
    elif message.text.lower() =='ghbdtn':
         bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
    elif message.text.lower() in b:
        bot.send_message(message.chat.id, 'Прощай, создатель ')
        
bot.infinity_polling(


commands.py

import telebot
import sys
from requests import get
from config import TOKEN

bot = telebot.TeleBot(TOKEN);

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Бот запущен!\nИ так, вот что может быть буду уметь:')
    bot.send_message(message.chat.id, 'Выводить расписание\nГоворить какая сейчас погода\nИ ещё какую-нить херню, которую в меня запишут...')

@bot.message_handler(commands=['help'])
def help_message(message):
    bot.send_message(message.chat.id, 'Вот список доступных команд:')
    bot.send_message(message.chat.id, '/start - запуск бота\n/help - вывод информации о командах\n/version - вывод информации о текущей версии и её возможностях\n/test1 - первый тест\n/test2 - второй тест ')

@bot.message_handler(commands=['version'])
def version_message(message):
    bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
    bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

@bot.message_handler(commands=['test1'])
def test_first(message):
  bot.send_message(message.chat.id, 'ТЕСТ1')
  bot.send_photo(message.chat.id, get('https://ie.wampi.ru/2021/12/12/kitten0.jpg').content)

@bot.message_handler(commands=['test2'])
def test_second(message):
  bot.send_message(message.chat.id, 'ТЕСТ2')
  bot.send_photo(message.chat.id, photo=open('demo-media\pics\kitten1.jpg', 'rb'))


Вот тест, когда все работает
test.py

import telebot
import sys
from requests import get
from config import TOKEN
bot = telebot.TeleBot(TOKEN);

a = ["привет","здарова","ку"]
b = ["пока", "давай", "ухожу", "вали"]

@bot.message_handler(commands=['start'])
def start_message(message):
    bot.send_message(message.chat.id, 'Бот запущен!\nИ так, вот что может быть буду уметь:')
    bot.send_message(message.chat.id, 'Выводить расписание\nГоворить какая сейчас погода\nИ ещё какую-нить херню, которую в меня запишут...')

@bot.message_handler(commands=['help'])
def help_message(message):
    bot.send_message(message.chat.id, 'Вот список доступных команд:')
    bot.send_message(message.chat.id, '/start - запуск бота\n/help - вывод информации о командах\n/version - вывод информации о текущей версии и её возможностях\n/test1 - первый тест\n/test2 - второй тест ')

@bot.message_handler(commands=['version'])
def version_message(message):
    bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
    bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

@bot.message_handler(commands=['test1'])
def test_first(message):
  bot.send_message(message.chat.id, 'ТЕСТ1')
  bot.send_photo(message.chat.id, get('https://ie.wampi.ru/2021/12/12/kitten0.jpg').content)

@bot.message_handler(commands=['test2'])
def test_second(message):
  bot.send_message(message.chat.id, 'ТЕСТ2')
  bot.send_photo(message.chat.id, photo=open('demo-media\pics\kitten1.jpg', 'rb'))

@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() in a:
        bot.send_message(message.chat.id, 'Привет, создатель')
    elif message.text.lower() =='ghbdtn':
         bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
    elif message.text.lower() in b:
        bot.send_message(message.chat.id, 'Прощай, создатель ')
        
bot.infinity_polling()


На счет weather.py

from pyowm import OWM
from pyowm.utils import config
from pyowm.utils import timestamps
from pyowm.utils.config import get_default_config
import telebot
import math

owm = OWM('5f1d018a2166335030c30ccae2a7a25f')
mgr = owm.weather_manager()

config_dict = get_default_config()
config_dict['language'] = 'ru' 


bot = telebot.TeleBot("5056685003:AAHXVOqOODh8w8oIZpKUGxN0DWN2Kxlxr9Y", parse_mode=None) # You can set parse_mode by default. HTML or MARKDOWN

@bot.message_handler(content_types=['text'])
def send_echo(message):
	observation = mgr.weather_at_place( message.text )
	w = observation.weather
	temp = w.temperature('celsius')['temp']
	wind = w.wind()['speed']

	answer = "В городе " + message.text +" сейчас " + w.detailed_status + "\n"
	answer += "Температура сейчас в районе " + str(round(temp)) + " градусов по Цельсию" + "\n\n"
	answer += "Скорость ветра " + str(wind) + " м/с " + "\n\n"
	bot.send_message(message.chat.id, answer)


Будет ли работать если я просто из main.py обращусь к
@bot.message_handler(content_types=['text'])
def send_echo(message):
	observation = mgr.weather_at_place( message.text )
	w = observation.weather
	temp = w.temperature('celsius')['temp']
	wind = w.wind()['speed']

и выведу сообщение-ответ?
  • Вопрос задан
  • 549 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Твоя проблема в том, что ты в каждом файле определил объект bot, и в итоге каждый файл подписывается на своего бота... но работает только бот из main.py, так как он определяется ПОСЛЕДНИМ и переписывает имя bot на себя. Так что bot.infinity_polling() в итоге запускает только бота из main.py, а остальные боты остаются незапущенными.
Можно схитрить и заставить все файлы использовать один объект бота. Например, переписав вспомогательные файлы таким образом:
# commands.py
def register_commands(bot):
  # функция register_commands должна присутствовать в каждом файле,
  # и содержать вложенные объявления обработчиков событий.
  # bot - объект бота, на котором регаются обработчики. 
  # таким же способом можно пробросить другие глобальные объекты программы.
  # очень важно, чтобы функция вызывалась РОВНО один раз в программе!
  # дальше пошли обработчики...
  @bot.message_handler(commands=['version'])
  def version_message(message):
      bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
      bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

Тогда в main.py будет что-то вроде...
import commands
import weather

bot = telebot.TeleBot(.................)

# заставляем модули объявить и зарегистрировать свои обработчики
commands.register_commands(bot)
weather.register_commands(bot)

# дальше идут местные обработчики
@bot.message_handler(content_types=['text'])
def send_text(message):
    if message.text.lower() in a:
        bot.send_message(message.chat.id, 'Привет, создатель')
    elif message.text.lower() =='ghbdtn':
         bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
    elif message.text.lower() in b:
        bot.send_message(message.chat.id, 'Прощай, создатель ')

# ну и запускаем бота
bot.infinity_polling()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы