@BERSERK221

Как добавить отправку фото через тг бота в канал?

Есть такой код
bot = TeleBot(token=token)
posts = {}
action = ''
new_post = []

def sleep_poster(date_post, message):
while True:
if date_post < datetime.now():
print('Отправили сообщение!')
if message[3] is None:
bot.send_message(message[0], message[1], reply_markup=message[2], parse_mode='Markdown')
else:
with open(message[3], 'rb') as f:
bot.send_photo(message[0], f, caption=message[1], reply_markup=message[2])
return
else:
sleep(60)

@bot.message_handler(commands=['start'])
def start_command(message):
user = message.chat.id
if user == adm_id:
rp = types.ReplyKeyboardMarkup(True)
rp.row('Новый пост')
bot.send_message(user, 'Привет, используй кнопки для работы с ботом.', reply_markup=rp)

@bot.message_handler(content_types=['text', 'photo'])
def text(message):
global action, new_post
user = message.chat.id
if message.text == 'Новый пост':
if user == adm_id:
bot.send_message(user, 'Введите текст для сообщения. Используй для *жирного текста*, _курсива_')
action = 'text'
new_post = []

elif action == 'text':
new_post.append(message.text)
action = 'buttons'
bot.send_message(user, 'Теперь введите кнопки по шаблону "Имя кнопки; ссылка.ru, '
'Имя второй кнопки; example.com" (без ковычек). Ряды разделяются Enter`ом.')

elif action == 'buttons':
keyboard = types.InlineKeyboardMarkup()
for i in message.text.split('\n'):
buttons = i.split(',')
buttons = [j.split(';') for j in buttons]

args = [types.InlineKeyboardButton(j[0].strip(), j[1].strip()) for j in buttons]
keyboard.row(*args)
bot.send_message(user, 'Кнопки будут выглядеть вот так:', reply_markup=keyboard)
bot.send_message(user, 'Теперь введите дату в виде часы - минуты - день - месяц (необязательно) - '
'год (необязательно), или введите now, чтобы выпустить сейчас:')
new_post.append(keyboard)
action = 'data'

elif action == 'data':
t = message.text.split('-')
if len(t) == 5:
t = [int(i) for i in t]
date = datetime(minute=t[1], hour=t[0], day=t[2], month=t[3], year=t[4])
elif len(t) == 4:
t = [int(i) for i in t]
date = datetime(minute=t[1], hour=t[0], day=t[2], month=t[3], year=datetime.now().year)
elif len(t) == 3:
t = [int(i) for i in t]
date = datetime(minute=t[1], hour=t[0], day=t[2], month=datetime.now().month, year=datetime.now().year)
else:
date = 'Now!'
new_post.append(date)
inkb = types.InlineKeyboardMarkup()
inkb.row(types.InlineKeyboardButton('Создать', callback_data='create'))
inkb.row(types.InlineKeyboardButton('Нет!', callback_data='delete'))
bot.send_message(user, 'Подтвердите создание отложенной записи:\n\n'
f'Текст: {new_post[0]}\n'
f'Дата: {str(new_post[2])}', reply_markup=inkb, parse_mode='Markdown')

@bot.callback_query_handler(func=lambda call: True)
def answer(call):
global new_post, action
us = call.message.chat.id

if call.data == 'create':
identity = datetime.now().microsecond
if type(new_post[2]) == str:
bot.send_message(channel, new_post[0], reply_markup=new_post[1], parse_mode='Markdown')
return

inkb = types.InlineKeyboardMarkup()
bot.send_message(us, 'Сообщение создано!', reply_markup=inkb)

posts[identity] = Thread(target=sleep_poster, args=[new_post[2], [channel, new_post[0], new_post[1]]])
posts[identity].run()

elif call.data == 'delete':
new_post = []
action = ''
bot.send_message(us, 'Создание отменено.')

def main():
while True:
try:
bot.polling()
except Exception as e:
print(e)

Thr = Thread(target=main)
Thr.start()

Нужно в него добавить функцию отправки так же и фото в канал. Чтобы к фото был прикреплен текст а к тексту клавиатура.
Хелп.
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ответы на вопрос 2
RimMirK
@RimMirK
Вроде человек. Вроде учусь. Вроде пайтону
CHANNEL_ID = 1234567890
bot.send_photo(CHANNEL_ID, open("Path/to.photo", 'rb'), caption='описание к фотке, если надо')
# или
CHANNEL_USERNAME = "@MyChannel"
bot.send_photo(CHANNEL_USERNAME, open("Path/to.photo", 'rb'), caption='описание к фотке, если надо')
Ответ написан
Комментировать
@Medovochka
Попробуй это:

from telebot import TeleBot, types
from datetime import datetime
from threading import Thread
from time import sleep

bot = TeleBot(token=token)
posts = {}
action = ''
new_post = []

def sleep_poster(date_post, message):
    while True:
        if date_post < datetime.now():
            print('Отправили сообщение!')
            if message[3] is None:
                bot.send_message(message[0], message[1], reply_markup=message[2], parse_mode='Markdown')
            else:
                with open(message[3], 'rb') as f:
                    bot.send_photo(message[0], f, caption=message[1], reply_markup=message[2])
            return
        else:
            sleep(60)

@bot.message_handler(commands=['start'])
def start_command(message):
    user = message.chat.id
    if user == adm_id:
        rp = types.ReplyKeyboardMarkup(True)
        rp.row('Новый пост')
        bot.send_message(user, 'Привет, используй кнопки для работы с ботом.', reply_markup=rp)

@bot.message_handler(content_types=['text', 'photo'])
def text(message):
    global action, new_post
    user = message.chat.id
    if message.text == 'Новый пост':
        if user == adm_id:
            bot.send_message(user, 'Введите текст для сообщения. Используй для *жирного текста*, _курсива_')
            action = 'text'
            new_post = []

    elif action == 'text':
        new_post.append(message.text)
        action = 'buttons'
        bot.send_message(user, 'Теперь введите кнопки по шаблону "Имя кнопки; ссылка.ru, '
                               'Имя второй кнопки; example.com" (без ковычек). Ряды разделяются Enter`ом.')

    elif action == 'buttons':
        keyboard = types.InlineKeyboardMarkup()
        for i in message.text.split('\n'):
            buttons = i.split(',')
            buttons = [j.split(';') for j in buttons]

            args = [types.InlineKeyboardButton(j[0].strip(), j[1].strip()) for j in buttons]
            keyboard.row(*args)
        bot.send_message(user, 'Кнопки будут выглядеть вот так:', reply_markup=keyboard)
        bot.send_message(user, 'Теперь введите дату в виде часы - минуты - день - месяц (необязательно) - '
                               'год (необязательно), или введите now, чтобы выпустить сейчас:')
        new_post.append(keyboard)
        action = 'data'

    elif action == 'data':
        t = message.text.split('-')
        if len(t) == 5:
            t = [int(i) for i in t]
            date = datetime(minute=t[1], hour=t[0], day=t[2], month=t[3], year=t[4])
        elif len(t) == 4:
            t = [int(i) for i in t]
            date = datetime(minute=t[1], hour=t[0], day=t[2], month=t[3], year=datetime.now().year)
        elif len(t) == 3:
            t = [int(i) for i in t]
            date = datetime(minute=t[1], hour=t[0], day=t[2], month=datetime.now().month, year=datetime.now().year)
        else:
            date = 'Now!'
        new_post.append(date)
        inkb = types.InlineKeyboardMarkup()
        inkb.row(types.InlineKeyboardButton('Создать', callback_data='create'))
        inkb.row(types.InlineKeyboardButton('Нет!', callback_data='delete'))
        bot.send_message(user, 'Подтвердите создание отложенной записи:\n\n'
                               f'Текст: {new_post[0]}\n'
                               f'Дата: {str(new_post[2])}', reply_markup=inkb, parse_mode='Markdown')

@bot.callback_query_handler(func=lambda call: True)
def answer(call):
    global new_post, action
    us = call.message.chat.id

    if call.data == 'create':
        identity = datetime.now().microsecond
        if type(new_post[2]) == str:
            bot.send_message(channel, new_post[0], reply_markup=new_post[1], parse_mode='Markdown')
            return

        inkb = types.InlineKeyboardMarkup()
        bot.send_message(us, 'Сообщение создано!', reply_markup=inkb)

        posts[identity] = Thread(target=sleep_poster, args=[new_post[2], [channel, new_post[0], new_post[1], new_post[3]]])
        posts[identity].run()

    elif call.data == 'delete':
        new_post = []
        action = ''
        bot.send_message(us, 'Создание отменено.')

def main():
    while True:
        try:
            bot.polling()
        except Exception as e:
            print(e)

Thr = Thread(target=main)
Thr.start()
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы