diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d344ba6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +config.json diff --git a/README.md b/README.md index 122d34f..6ef2bbb 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ -# misskey_bot +# Misskey Bot + +[Ранняя стадия разработки, авось что получится съедобное] +Какой функционал планируется у бота: +1. Бот-группа +2. Бот-ретранслятор с Twitter +3. Автопостер картинок из заданного каталога (готово на 80%) + +## 1 Как заставить бота работать? +1.1 В первую очередь нужно зайти в аккаунт бота на вашем инстансе, после этого перейти в настройки (шестерёнка) - API - создать токен доступа. +Предоствьте боту тот доступ, который будет предостаточен для выполнения ваших потребностей. + +1.2 Правильно заполните конфиг. Это очень важно, иначе бот не будет работать! + + + + +## + + -misskey bot. Python \ No newline at end of file diff --git a/config.json b/config.json new file mode 100644 index 0000000..19e5740 --- /dev/null +++ b/config.json @@ -0,0 +1,6 @@ + { + "name": "[Shitpost] PoridgeClub", + "url" : "https://shitpost.poridge.club", + "token": "ur_token", + "visibility": "public" + } diff --git a/main.py b/main.py new file mode 100644 index 0000000..64a7637 --- /dev/null +++ b/main.py @@ -0,0 +1,116 @@ +#!/usr/bin/python3 + +import requests # Для отправки http-запросов +import json +import time + +# Функция для чтения JSON-файла (например, конфига), аргумент - адрес файла в ФС +# Возвращает словарь +def json_read(file): + # Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла + with open(file) as f: + config = json.load(f) + return config + +# Функция для получения уведомлений пользователя из Misskey +# Возвращает список словарей +# 2do: includeTypes как аргумент +def get_notifications(url, i): + print("Getting notifications from", url) + # Формируем URL для доступа к конкретной функции API + req_url = url + "/api/i/notifications" + + body = { + "i": i, + # Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному + #"includeTypes": [ + # "reply", + # "mention" + # ], + # Количество уведомлений, которые вытянем + "limit": 3, + "unreadOnly": False, + } + # Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше + r = requests.post(req_url, json=body) + + # Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений + if r.status_code == 200: + # Можешь раскомментить, глянуть, что это за черт + #print(r.json()) + return r.json() + # Иначе, если не збс, то ругаемся + else: + print("Fuck") + +# Функция, создающая пост +# 2do: посты с картинками, ... +def create_post(content, url, i, visibility="public", channel="", fileIds=[]): + print("Post to", url, ":", content) + # Аналогично, адрес нужной функции API + req_url = url + "/api/notes/create" + body = { + # Не ебу, что за noExtract*, надо полуркать, но работает и збс пока что + "noExtractMentions": True, + "noExtractHashtags": True, + "noExtractEmojis": True, + "visibility": visibility, + "text": content, + "fileIds": fileIds, + # Если поставлен канал, то пост только локальный для инстанса + "localOnly": channel != "", + "i": i + } + if channel != "": + body["channelId"] = channel + # Отправляем запрос + r = requests.post(req_url, json=body) + # Аналогично, проверка на 200, в случае успеха 1 + if r.status_code == 200: + return 0 + else: + print("Failed to post:", r.text) + return 1 + +# Пока что можешь не пытаться разобраться, я сам отчасти хз, как это работает, лол + +def file_upload(file, url, i, isSensitive=False): + print("Uploading file to", url) + req_url = url + "/api/drive/files/create" + with open(file, "rb") as f: + fileo = f.read() + body = { + "isSensitive": False, + "force": True, + "i":i + } + body = json.dumps(body) + + payload = {'json_payload': body, 'i': i } + + files = {"file": (file, fileo)} + r = requests.post(req_url, data=payload, files=files) + if r.status_code == 200: + return r.json() + else: + print("Upload failed with code", r.status_code) + print(r.text) + +def get_file_list(url, i): + req_url = url + "/api/drive/files" + r = requests.post(req_url, json={"i":i}) + print(r.json()) +### Сюда надо захуярить еще 100500 функций### + +# Собсна, содержательная часть программы начинается тут + +# Читаем конфиг, получаем словарь +config = json_read('config.json') + +#notif_list = get_notifications(config['url'], config['token']) +#print(notif_list) +#file_upload('test.jpg', config['url'], config['token']) +im_info = file_upload('test.jpg', config['url'], config['token']) + +create_post("Nya~", config['url'], config['token'], fileIds=[im_info['id']]) +#print(notif_list) diff --git a/sources.md b/sources.md new file mode 100644 index 0000000..8ee67b9 --- /dev/null +++ b/sources.md @@ -0,0 +1,12 @@ +## API +https://misskey.io/api-doc + +## Примеры ботов +https://github.com/yupix/Mi.py + +https://github.com/TennousuAthena/RSSToMisskey + +https://github.com/theskanthunt42/misskeyInstanceCheckBot + +## Twitter API +https://www.earthdatascience.org/courses/use-data-open-source-python/intro-to-apis/twitter-data-in-python/ \ No newline at end of file diff --git a/test.jpg b/test.jpg new file mode 100755 index 0000000..c5457e9 Binary files /dev/null and b/test.jpg differ