Отправка фото в телеграм. Python
Моя задача - отправить пользователю картинки, которые я успешно спарсил и добавил в папку. Теперь эти фотографии нужно отправить через телеграм-бота. А я не знаю, как их достать из папки. Вот код
import telebot
import requests
from lxml import html
bot = telebot.TeleBot('api')
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
if message.text:
name = message.text
t = requests.get(f'https://wttr.in/{name}?format=4').text
bot.send_message(message.from_user.id, t)
url = f'https://ru.wikipedia.org/wiki/{name}'
page = requests.get(url)
tree = html.fromstring(page.content)
a = [x.attrib['src'] for x in tree.cssselect('img') if 'png' in x.attrib['src'] or 'jpg' in x.attrib['src']]
for pic_link in a[:3]:
with open('test/' + pic_link.split('/')[-1], 'wb') as f:
f.write(requests.get('http:'+pic_link).content)
bot.polling(none_stop=True, interval=0)
Ответы (1 шт):
Автор решения: Oleg
→ Ссылка
- Вынесите парсинг в отдельную функцию - код станет чище и понятнее.
- Для задач, требующих длительного ввода/вывода, используйте
asyncio(т.е. заменитеtelebotна aiogram), либо используйте отдельный поток. В вашем кейсе 4 пользователя смогут полностью заблокировать вам бота (все "воркеры" будут заняты скачиванием). - Делайте проверки от обратного, чтобы не растить лестницу в коде. Хотя конкретно в вашем случае проверка наличия
message.textизбыточна, её можно убрать. - Вот пример асинхронной отправки изображения:
@dp.message_handler()
async def cats(message: Message):
with open('cats.jpg', 'rb') as photo:
await message.reply_photo(photo, caption='Cats are here ?')