Telegraph API: автоматизированное создание заметок

от автора

Сервису telegra.ph уже много лет, но информации о том как пользоваться его api почему-то не много, тем временем, крупные телеграм-каналы потихоньку приступили к промышленному освоению. Инструмент вполне себе неплохая альтернатива созданию веб-страниц, к тому же появилась удобная библиотека, которая позволяет автоматизировать процесс.

С чего всё началось:

Случайно обратил внимание на кнопку «Посмотреть», которая появилась на некоторых телеграмм-каналах («Раньше всех, ну почти», и «RT на русском»)

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

Array of Node или главная загвоздка Telegraph API и её разрешение

В целом, ничего сложного в Telegraph API нет, основная проблема была в том, что передавать содержание страницы нужно в виде Array of Node, up to 64 KB. Т.е. просто написать «Hello world» не получится (нужно писать [«Hello world»]), а передать какую-то разметку, так совсем не просто, например «Hello world»:

[   {   "tag": "b",   "children": ["Hello world"]   } ]

Однако решение есть, это библиотека Telegraph, впрочем, постараюсь рассказать как работать и без неё. Приступаем.

Создание аккаунта и получение токена

Все работает через запросы к https://api.telegra.ph/ после чего указывается метод и, если надо, путь. Делать это можно как угодно: curl из командной строки, или requests.get() в питоне, или где хотите ещё. Я приведу пример работы в python.

Чтобы создать новый аккаунт нужно выполнить просто запрос к https://api.telegra.ph/ с указанием метода createAccount:

import requests #создаем параметры для создания профиля data={     'short_name':'', # ОБЯЗАТЕЛЬНЫЙ ПАРАМЕТР, имя учетной записи, помогает пользователям с несколькими учетными записями запомнить, какая сейчас используются. Отображается пользователю над кнопкой «Изменить / Опубликовать» на Telegra.ph, другие пользователи не видят это имя.     'author_name':'', # Не обязательно. Указывает автора в заголовке странцы     'author_url':'' # Не обязательно. Ссылка открывается, когда пользователи нажимают на имя автора под заголовком. Это может быть любая ссылка, не обязательно на профиль или канал Telegram. } #отправляем запрос ответ понадобится, запишем в переменную: result=requests.get("https://api.telegra.ph/createAccount?", params=data)

Из bash будет так:

curl https://api.telegra.ph/createAccount?short_name=Sandbox&author_name=Anonymous

С библиотекой telegraph: нужно её установить (pip install telegraph), а дальше всё просто:

import requests from telegraph import Telegraph  telegraph = Telegraph()  result=telegraph.create_account(short_name='1337')

В ответ приходит json с токеном и прочим. Токен надо сохранять, я сохраню полученные данные в файл graph_bot.json

with open('graph_bot.json', 'w', encoding='utf-8') as f:     json.dump(graph_bot, f, ensure_ascii=False, indent=4) # сохраняю в файл graph_bot

Вывод result.json()

{     "ok":true,     "result":     {         "short_name":"", #тут будет имя         "author_name":"",         "author_url":"",         "access_token":"", #тут токен         "auth_url":""     } }

Что интересно, метода удаления профайла и страниц не обнаружил. Имена аккаунтов не уникальные, можно насоздавать сколько угодно профилей с одинаковым именем, разница будет только в токенах.

Создание страницы (createPage)

Получаем токен из сохраненного json и передаём запрос на создание страницы:

with open('graph_bot.json') as f:     graph_bot = json.load(f) #создание страницы data={     'access_token':graph_bot["access_token"],     'title':'article_head', # Заголовок, обязательный параметр     'author_name':graph_bot["author_name"], # это поле можно не заполнять     'content': content_json,# Текст (массив Node), обязательный параметр     'return_content':'false' # если стоит true в ответе придет и то, что размещено, если false, то поле не вернется } page=requests.get("https://api.telegra.ph/createPage?", params=data)

Если всё пройдет хорошо, в ответ придет примерно такой результат:

{     'ok': True,      'result':      {         'path': 'article-head-11-04-2',          'url': 'https://telegra.ph/article-head-11-04-2',          'title': 'article_head',          'description': '',          'author_name': 'Bot',          'views': 0,          'can_edit': True     } }

Если в отправляемых данных есть ошибка, возвращается сообщение о ней:

{     'ok': False,      'error': 'CONTENT_FORMAT_INVALID' # передан не array of node }

Как уже сказал выше, главная проблема тут, это правильный формат передаваемого текста, рабочий парсер html to node реализован в библиотеке telegraph. Тут всё просто, можно сохранить весь HTML в строковую переменную и спокойно её передать в виде соответствующего поля:

from telegraph import Telegraph  telegraph = Telegraph("access_token") # передаём токен доступ к страницам аккаунта response = telegraph.create_page(     'Hey', # заголовок страницы     html_content='<p>Hello, world!</p>' # ставим параметр html_content, добавляем текст страницы )  print('https://telegra.ph/{}'.format(response['path'])) # распечатываем адрес страницы

Получаем страницу: https://telegra.ph/Hey-11-04-22

В библиотеке довольно внушительный список запрещенных тэгов, но для минимальной верстки telegra.ph хватает

Изменение страницы (editPage)

Чтобы изменить страницу надо знать её адрес, он идет после ph/ для страницы https://telegra.ph/Hey-11-04-22 параметр path будет «Hey-11-04-22». И конечно, токен доступа. Отправляем запрос с указанием метода и параметрами к https://api.telegra.ph/editPage

data={     'path':'Hey-11-04-22', #путь к странице он содержится в url после https://telegra.ph/     'access_token':'your_token',  # токен     'title':'article_head', #заголовок, обязательный параметр, если не меняется, всё равно надо прописывать     'author_name':None,       'content': content_json,  #содержание страницы должен быть  Array of Node     'return_content':'false'  } #редактирование страницы requests.get("https://api.telegra.ph/editPage?", params=data)

Опять же тут проблема в формате данных, которые должны быть Array of Node. Воспользуемся готовым решением:

from telegraph import Telegraph  telegraph = Telegraph('access_token') # чтобы получить доступ к вашим страницам  telegraph.edit_page(     path="", # обязательный параметр     title="", # обязательный параметр     html_content="",  #измененное содержание страницы, тут можно передать хоть строку с тегами, хоть руками написать что надо     author_name="", # можно пропустить     author_url="", # можно пропустить     return_content=False     )

В случае ошибки приходит сообщение {‘ok’: False, ‘error’: ‘описание ошибки’}. Если всё хорошо, статус ‘ok’ будет True.

Что ещё можно:

В целом, для создания и редактирования страниц достаточно, думаю принцип работы понятен. Также можно:

  • посмотреть и изменить информацию об аккаунте,

  • отозвать токен,

  • посмотреть свои страницы и

  • количество просмотров на них (делаем аналитику).

Например информация о профиле:

data={     'access_token': "access_token",     'fields':'["short_name","page_count"]'     } account_info=requests.get("https://api.telegra.ph/getAccountInfo?", params=data) print(account_info.json())

Все можно почитать в документации:


ссылка на оригинал статьи https://habr.com/ru/articles/587430/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *