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

Как исправить ошибку?

Пишу телеграм бота, в основном с помощью чат гпт и всяких видосов, опыта в программировании 0. Смысл такой: пользователь отправляет ссылку на сайт, бот должен отправить пользователю фотографию с этого сайта.

Пробовал 2 ссылки, у первой ошибка:
raise TelegramBadRequest(method=method, message=description)
aiogram.exceptions.TelegramBadRequest: Telegram server says - Bad Request: wrong file identifier/HTTP URL specified
у второй:
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.pexels.com', port=443): Max retries exceeded with url: /ru-ru/ (Caused by SSLError(SSLError(1, '[SSL: INVALID_SESSION_ID] invalid session id (_ssl.c:1000)')))


from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command
from aiogram.types import InputFile
import requests
import os
from bs4 import BeautifulSoup
from config import dp, bot
import asyncio


def get_image_url_from_website(website_url):
    response = requests.get(website_url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.content, 'html.parser')
        # Ищем первый тег <img>
        img_tag = soup.find('img')
        if img_tag and 'src' in img_tag.attrs:
            # Получаем полный URL изображения
            img_url = img_tag['src']
            # Если URL изображения относительный, делаем его абсолютным
            if img_url.startswith('/'):
                img_url = website_url.rstrip('/') + img_url
            return img_url
    return None


def download_image(image_url):
    response = requests.get(image_url)
    if response.status_code == 200:
        with open("image.jpg", "wb") as f:
            f.write(response.content)
        return "image.jpg"
    return None


@dp.message(Command('image'))
async def send_image(message: types.Message):
    # Получаем URL сайта от пользователя
    args = message.text.split(maxsplit=1)
    if len(args) < 2:
        await message.reply("Пожалуйста, предоставьте URL сайта.")
        return

    website_url = args[1].strip()

    # Получаем URL изображения с сайта
    image_url = get_image_url_from_website(website_url)

    if image_url:
        # Загружаем изображение
        image_path = download_image(image_url)
        if image_path:
            # Отправляем изображение пользователю
            await message.answer_photo(photo=image_path)
            # Удаляем временный файл после отправки
            os.remove(image_path)
        else:
            await message.reply("Не удалось загрузить изображение.")
    else:
        await message.reply("Не удалось найти изображение на сайте.")


async def main():
    await dp.start_polling(bot)


if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('Exit')

Буду рад любым советам.
  • Вопрос задан
  • 189 просмотров
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
@ProKraster
используй метод InputFile, и будет тебе счастье

image_path = InputFile(download_image(image_url))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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