Для работы и автоматизации телеграмм канала, мне потребовался бот, который будет принимать фотографии, и выставлять их в канал, и как дополнение добавлял нужный мне текст (при необходимости можно переписать, чтобы он прикреплял отправленные в него сообщения). Целей много, может вы аноним, который скрывает свои следы, а может вы хотите предоставить доступ к выставлению фотографий в канале своим подписчикам.
Импорт необходимых модулей
Приступим, для написания бота нам потребуется python, модуль библиотеки python-telegram-bot - telegram, и модуль time.
import time
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
Кратко пройдемся по импортируем классам и функциям.
Application - основной класс, для взаимодействия с Telegram API. Он обрабатывает действия пользователя при работе с ботом.
Handler - функции, которые отвечают на сообщения, и события при работе с ботом.
CommandHandler - обрабатывает команды, такие как
/start
.MessageHandler - обрабатывает сообщения определенных типов, в нашем случае - изображение.
filters - модуль, который используется для создания условий на входящие сообщения.
CallbackContex - объект, который передается в функции-обработчики. Содержит информацию, о контексте вызова обработчика.
Константы и глобальные переменные
# Ваш токен бота
BOT_TOKEN = 'YOUR_TELEGRAM_BOT_TOKEN'
CHANNEL_ID = '@your_channel' # Ссылка на ваш канал
DEFAULT_CAPTION = "Это текст, который будет добавляться к каждому посту в канал."
BOT_TOKEN - токен вашего бота. Его мы получаем при создании бота в BotFather.
CHANNEL_ID - ссылка на ваш канал, если он публичный пишется с @, но если ваш канал приватный, то из ссылки канала вам надо взять значения, которое начинается с -, к примеру #-00000000, то вам необходимо взять -00000000, и добавить 100. CHANNEL_ID = '-10000000000'.
DEFAULT_CAPTION - это заранее заданный текст, который будет добавляться к каждому изображению, отправляемому в канал. Вы можете изменить этот текст на любой другой по вашему усмотрению.
Так же необязательно, но я добавлю проверку времени последней отправки пользователем.
# Словарь для хранения времени последней отправки фото пользователем
user_last_photo_time = {}
# Ограничение по времени (12 часов в секундах)
TIME_LIMIT = 12 * 60 * 60 # 12 часов = 43200 секунд
user_last_photo_ time - словарь, который хранит когда последний раз пользователь отправлял изображение в бота.
TIME_LIMIT - ограничение отправки сообщений пользователем, я поставил 12 часов, но можно поставить любое время
Функция проверки временного ограничения
def can_send_photo(user_id):
current_time = time.time()
last_time = user_last_photo_time.get(user_id, 0)
if current_time - last_time >= TIME_LIMIT:
return True
return False
can_send_photo(user_id): эта функция проверяет, прошло ли достаточно времени (12 часов) с момента последней отправки фото пользователем.
time.time() - возвращает текущее время в секундах.
user_last_photo_time.get(user_id, 0) - получает последнюю временную метку, когда пользователь отправил фото. Если данных нет (пользователь отправляет фото впервые), возвращает значение 0.
-
current_time - last_time >= TIME_LIMIT: проверяет, прошло ли 12 часов с последней отправки фото.
Если условие выполняется, возвращает True, иначе - False.
Обработка изображений
async def handle_image(update: Update, context: CallbackContext):
user_id = update.message.from_user.id
handle_image - эта функция обрабатывает изображения, которые присылают пользователи.
update.message.from_user.id - извлекает user_id пользователя, который отправил изображение.
if can_send_photo(user_id):
photo = update.message.photo[-1]
caption = DEFAULT_CAPTION
can_send_photo(user_id) - проверяет, может ли пользователь отправить фото (учитывая временное ограничение).
photo = update.message.photo[-1] - если было отправлено несколько фото от одного человека, отправлять в канал только первое.
caption = DEFAULT_CAPTION - берёт заранее заданный текст, который будет отправлен вместе с изображением.
await context.bot.send_photo(
chat_id=CHANNEL_ID,
photo=photo.file_id,
caption=caption
)
context.bot.send.photo - отправляет фото в указанный канал.
chat_id=CHANNEL_ID - идентификатор канала, куда будет отправлено изображение.
photo=photo.file_id - файл изображения, который будет отправлен.
caption=caption - текст, который будет прикреплён к изображению.
user_last_photo_time[user_id] = time.time()
await update.message.reply_text("Изображение с текстом отправлено в канал!")
user_last_photo_time[user_id] = time.time() - обновляет временную метку отправки изображения пользователем.
await update.message.reply_text("") - ответ пользователю, о том что его сообщение принято.
else:
remaining_time = TIME_LIMIT - (time.time() - user_last_photo_time[user_id])
hours, remainder = divmod(remaining_time, 3600)
minutes, _ = divmod(remainder, 60)
await update.message.reply_text(f"Вы сможете отправить фото через {int(hours)} часов и {int(minutes)} минут.")
Если пользователь пытается отправить фото до истечения 12 часов, бот рассчитывает, сколько времени осталось до следующей возможности отправить изображение, и уведомляет об этом.
Обработка команды /start
async def start(update: Update, context: CallbackContext):
await update.message.reply_text("Отправьте мне изображение, и я размещу его в канале вместе с текстом, но не чаще, чем раз в 12 часов.")
start - это обработчик команды /start. Когда пользователь вводит эту команду, бот отправляет ему сообщение с инструкциями, как отправить изображение.
Основная функция - запуск бота
def main():
application = Application.builder().token(BOT_TOKEN).build()
application.add_handler(CommandHandler("start", start))
application.add_handler(MessageHandler(filters.PHOTO, handle_image))
application.run_polling()
main() - главная функция, которая запускает бота.
Application.builder().token(BOT_TOKEN).build() - создает экземпляр бота с вашим токеном.
application.add_handler(CommandHandler("start", start)) - добавляет обработчик команды /start.
application.add_handler(MessageHandler(filters.PHOTO, handle_image)) - добавляет обработчик изображений.
application.run_polling() - запускает бота в режима постоянного опроса сервера Telegram для получения обновлений.
Готовый код Telegram бота
import time
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackContext
# Ваш токен бота
BOT_TOKEN = 'BOT_TOKEN'
CHANNEL_ID = '-100999999' # Приватный канал
# Словарь для хранения времени последней отправки фото пользователем
user_last_photo_time = {}
# Ограничение по времени (12 часов в секундах)
TIME_LIMIT = 12 * 60 * 60 # 12 часов = 43200 секунд
# Текст, который будет добавляться к посту
DEFAULT_CAPTION = "Добавьте свой текст"
# Функция для проверки ограничения
def can_send_photo(user_id):
current_time = time.time()
last_time = user_last_photo_time.get(user_id, 0)
if current_time - last_time >= TIME_LIMIT:
return True
return False
# Функция для обработки изображений
async def handle_image(update: Update, context: CallbackContext):
user_id = update.message.from_user.id
# Проверка на временное ограничение (12 часов)
if can_send_photo(user_id):
# Разрешаем отправку фото
photo = update.message.photo[-1]
# Используем заранее заданный текст как подпись
caption = DEFAULT_CAPTION
# Отправляем фото в канал с подписью
await context.bot.send_photo(
chat_id=CHANNEL_ID,
photo=photo.file_id,
caption=caption
)
# Обновляем время последней отправки фото
user_last_photo_time[user_id] = time.time()
# Подтверждение пользователю
await update.message.reply_text("Изображение отправлено в канал!")
else:
# Если не прошло 12 часов, отклоняем запрос
remaining_time = TIME_LIMIT - (time.time() - user_last_photo_time[user_id])
hours, remainder = divmod(remaining_time, 3600)
minutes, _ = divmod(remainder, 60)
await update.message.reply_text(f"Вы сможете отправить фото через {int(hours)} часов и {int(minutes)} минут.")
# Функция для старта
async def start(update: Update, context: CallbackContext):
await update.message.reply_text("Отправьте мне изображение, и я размещу его в канале, но не чаще, чем раз в 12 часов.")
def main():
# Создаем экземпляр Application и передаем ему токен бота
application = Application.builder().token(BOT_TOKEN).build()
# Обработчик команды /start
application.add_handler(CommandHandler("start", start))
# Обработчик изображений
application.add_handler(MessageHandler(filters.PHOTO, handle_image))
# Запускаем бота
application.run_polling()
if __name__ == '__main__':
main()
Подведем итоги, этот пост я писал несколько дней, а бота несколько часов, и надеюсь, что я подробно расписал весь процесс создания для читателей, если у вас остались вопросы, прошу в комментарии к посту.
Комментарии (3)
Ctacyan
03.10.2024 23:07+1Как такого бота создать . Только чтобы он принимал фото документов их разворачивал в горизонтальный вид, осветвлял, и обрезал до краев документа и результат пересылал в заданную папку
MyNameIsAlex33 Автор
03.10.2024 23:07Добрый день, для создания такого ТГ-бота потребуется несколько иной подход. Документ будет так же приниматься как в коде, развернуть в горизонтальный вид легко, но с осветлением могут быть проблемы, потому что все документы будут отправляться в разной цветовой температуре, и я не могу придумать, как сделать на выходе одинаковый цвет. Обрезку до краев так же можно сделать, а результат будет отправляться на облако, либо же на компьютер, где будет работать бот. Если вам интересен код, то мне потребуется некоторое время на его создание.
alexejisma
Вместо
user_last_photo_time
можно использоватьbot.user_data
, см. https://github.com/python-telegram-bot/python-telegram-bot/wiki/Storing-bot%2C-user-and-chat-related-data. Это словарь, который python-telegram-bot создает для каждого пользователя и предоставляет к нему доступ.