Как боту вставлять изображение через 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 шт):
Чтобы прикрепить картинку ее сначала нужно скачать по 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 сам скачает картинку и прикрепит ее к сообщению.
Решил это так:
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)