#!/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)