Как боту вставлять изображение через url в telegra.ph?

Мне необходимо, чтобы бот брал url адрес картинки, например из дискорда, и вставлял его в статью telegra.ph и оно преобразило url в картинку. Если это делать вручную, то нужно вставить ссылку и нажать Enter, только тогда изображение станет изображением, а не ссылкой.

Но если просто вставить ссылку, то она останется текстом. Так и бот вставляет url, но ссылка не становится изображением.

API или модулей, подходящих, лично я не нашёл, может слепой. Помогите найти решение.

Пример рабочего кода, но с проблемой:

from telegraph_api import Telegraph
import asyncio
import random

random_1 = random.randint(99999, 99999999999)
random_2 = random.randint(99999, 99999999999)

async def main():
    telegraph = Telegraph()
    # Новый аккаунт
    await telegraph.create_account(random_2, author_name=random_1)
    # Статья
    new_page = await telegraph.create_page(
        random_1,
        "https://media.discordapp.net/attachments/1013153256215691344/1013153595480342658/FZ9Pp5LaUAAkNHa_.jpg"
    )

    # Результат
    print(new_page.url)


asyncio.run(main())

Ответы (2 шт):

Автор решения: Danil Apsadikov

Чтобы прикрепить картинку ее сначала нужно скачать по URL, а затем загрузить фаил картинки с помощью API. Это можно сделать следующим образом:

def telegraph_file_upload(path_to_file):
    '''
    Sends a file to telegra.ph storage and returns its url
    Works ONLY with 'gif', 'jpeg', 'jpg', 'png', 'mp4' 
    
    Parameters
    ---------------
    path_to_file -> str, path to a local file
    
    Return
    ---------------
    telegraph_url -> str, url of the file uploaded

    >>>telegraph_file_upload('test_image.jpg')
    https://telegra.ph/file/16016bafcf4eca0ce3e2b.jpg    
    >>>telegraph_file_upload('untitled.txt')
    error, txt-file can not be processed
    '''
    file_types = {'gif': 'image/gif', 'jpeg': 'image/jpeg', 'jpg': 'image/jpg', 'png': 'image/png', 'mp4': 'video/mp4'}
    file_ext = path_to_file.split('.')[-1]
    
    if file_ext in file_types:
        file_type = file_types[file_ext]
    else:
        return f'error, {file_ext}-file can not be proccessed' 
      
    with open(path_to_file, 'rb') as f:
        url = 'https://telegra.ph/upload'
        response = requests.post(url, files={'file': ('file', f, file_type)}, timeout=1)
    
    telegraph_url = json.loads(response.content)
    telegraph_url = telegraph_url[0]['src']
    telegraph_url = f'https://telegra.ph{telegraph_url}'
    
    return telegraph_url

Функция вернет ссылку на картинку, которая была загружена в telegraph. Ее надо будет использовать при создании записи

Источник: https://stackoverflow.com/a/70307283/11695435

UPD:

Можно не загружать фаил в telegraph, а просто указать ссылку на картинку в инетренете, telegraph сам скачает картинку и прикрепит ее к сообщению.

Источник: https://core.telegram.org/bots/api#sendphoto

→ Ссылка
Автор решения: mrBars1k

Решил это так:


from telegraph import Telegraph, upload
import random

random_article = random.randint(99999, 99999999999)
random_author = random.randint(99999, 99999999999)


telegraph = Telegraph()
telegraph.create_account(random_article, author_name=random_author)

def post(title, content):
    response = telegraph.create_page(random_article, html_content = content)
    return 'https://telegra.ph/{}'.format(response['path'])


postlink = post('random_article', '<img src="https://media.discordapp.net/attachments/1013153256215691344/1013153595480342658/FZ9Pp5LaUAAkNHa_.jpg">')

print(postlink)
→ Ссылка