Vsakosti
February 6

Быстрая регистрация и публикация на Mastodon'овых серверах + Автопост

Суть: Регистрируемся и быстро публикуемся на Mastodon'овых серверах.

То, что описано ниже, подходит больше для личного пользования, а не для распространяемого инструмента (приложения), так как исполнено довольно "грязновато".

1. Берём Mastodon.py (https://github.com/halcy/Mastodon.py).

2. Создаём приложение: "Настройки" -> "Разработчикам" -> "Новое приложение":

3. Заполняем данные приложения: Название, устанавливаем разрешения (read+write). Сохраняем изменения.

4. Создаём файл (APP_clientcred.secret) с таким содержанием:

КЛЮЧ_КЛИЕНТА // Берём из соотв.поля приложения
СЕКРЕТ // Берём из соотв.поля приложения
ССЫЛКА_НА_МАСТОДОН (напр. https://mastodon.social)
НАЗВАНИЕ_ПРИЛОЖЕНИЯ

5. В адресную строку браузера вписываем:

https://ССЫЛКА_НА_МАСТОДОН/oauth/authorize?client_id=КЛЮЧ_КЛИЕНТА&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=read+write&force_ogin=False&state=None

где "КЛЮЧ_КЛИЕНТА" — это тот ключ из "APP_clientcred.secret".

После этого нужно будет дать доступ приложению к нужным данным.

6. Необходим первый логин, для этого в Python файле пишем:

m = Mastodon(client_id="APP_clientcred.secret")
m.log_in(
    username='ВАША_ПОЧТА',
    code = "КОД_КОТОРЫЙ_ВЫ_ПОЛУЧИЛИ_В_ПРЕДЫДУЩЕМ_ПУНКТЕ",
    scopes = ['read', 'write'],
    to_file = 'APP_usercred.secret'
)

7. Запускаем Python файл, после чего у вас должен появиться "APP_usercred.secret".

8. Код выше можно закомментировать. Для дальнейшего использования достаточно написать:

m = Mastodon(access_token="APP_usercred.secret")

9. Чтобы опубликовать пост, пишем следующее:

m.status_post("Мой пост")

10. В итоге: Регистрируемся на сайте, создаём приложение, составляем из ключа клиента и секрета (+ ссылки на сайт и названия приложения) файл, используем ссылку с ключом клиента для получения кода для дачи доступа приложению и этим ключом входим. Это можно автоматизировать и зарегистрироваться на куче "инстансов" разом.


Пришёл к этому решению, так как публикация только на одной площадке — дело не очень доставляющее, а на других регистрация аккаунта с другой площадки невозможна (хотя вроде т.н. "федиверс"), а раскидываться постами хочется.

Можно легко написать bash-скрипт, который берёт условный текстовый файл и изображение (при его наличии) и отправляет Python файлам, отвечающим за постование на различных площадках. Они обрабатывают и постят где надо.

Что-то типа:

#!/bin/bash

postfilename="$1"
shift

python3 ./en_mastodon_social.py "$postfilename" "$@"
python3 ./en_mastodon_world.py "$postfilename" "$@"
python3 ./en_masto.py "$postfilename" "$@"

en_mastodon_social.py:

m = Mastodon(access_token="APP_mastodon_social_usercred.secret")

def read_text_from_file(ffile_path):
    with open(ffile_path, 'r', encoding='utf-8') as file:
        text = file.read().strip()
    return text

def upload_media_files(fmastodon, fimage_paths):
    media_ids = []
    for path in fimage_paths:
        media = fmastodon.media_post(media_file=path)
        media_ids.append(media['id'])
    return media_ids
    
text_file_path = sys.argv[1]
post_text = read_text_from_file(text_file_path)
image_paths = sys.argv[2:]

if post_text:
    media_ids = []

if image_paths: # Если есть фото -- прикрепить
    media_ids = upload_media_files(m, image_paths)

m.status_post(post_text, media_ids=media_ids)
print("+")

Итоговая команда для запуска:

avtopost.sh ./posts/0001.txt '~/Pictures/kot.png' '~/Pictures/kot_pomenjshe.png'

Которая отправит на несколько мастодонов пост с содержимым из текстового файла "0001.txt" и картинками котиков.