niho #1
6 changed files with 155 additions and 2 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
config.json
|
22
README.md
22
README.md
|
@ -1,3 +1,21 @@
|
|||
# misskey_bot
|
||||
# Misskey Bot
|
||||
|
||||
[Ранняя стадия разработки, авось что получится съедобное]
|
||||
Какой функционал планируется у бота:
|
||||
1. Бот-группа
|
||||
2. Бот-ретранслятор с Twitter
|
||||
3. Автопостер картинок из заданного каталога (готово на 80%)
|
||||
|
||||
## 1 Как заставить бота работать?
|
||||
1.1 В первую очередь нужно зайти в аккаунт бота на вашем инстансе, после этого перейти в настройки (шестерёнка) - API - создать токен доступа.
|
||||
Предоствьте боту тот доступ, который будет предостаточен для выполнения ваших потребностей.
|
||||
|
||||
1.2 Правильно заполните конфиг. Это очень важно, иначе бот не будет работать!
|
||||
|
||||
|
||||
|
||||
|
||||
##
|
||||
|
||||
|
||||
|
||||
misskey bot. Python
|
6
config.json
Normal file
6
config.json
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"name": "[Shitpost] PoridgeClub",
|
||||
"url" : "https://shitpost.poridge.club",
|
||||
"token": "ur_token",
|
||||
"visibility": "public"
|
||||
}
|
116
main.py
Normal file
116
main.py
Normal file
|
@ -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)
|
12
sources.md
Normal file
12
sources.md
Normal file
|
@ -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/
|
BIN
test.jpg
Executable file
BIN
test.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 129 KiB |
Loading…
Reference in a new issue