2021-11-23 01:38:21 +03:00
#!/usr/bin/python3
2021-11-26 00:10:31 +03:00
import requests # Для отправки http-запросов
import json
2021-11-24 00:38:25 +03:00
import time
2022-01-25 15:50:00 +03:00
import argparse
import logging as log
p = argparse . ArgumentParser ( )
p . add_argument ( ' --verbose ' , ' -v ' , action = ' count ' , default = 0 )
args = p . parse_args ( )
if args . verbose :
log . basicConfig ( format = " %(levelname)s : %(message)s " , level = log . DEBUG )
log . info ( " Verbose output. " )
else :
log . basicConfig ( format = " %(levelname)s : %(message)s " )
#log.info("This should be verbose.")
#log.warning("This is a warning.")
#log.error("This is an error.")
2021-11-23 01:38:21 +03:00
2021-11-26 00:10:31 +03:00
# Функция для чтения JSON-файла (например, конфига), аргумент - адрес файла в ФС
# Возвращает словарь
2021-11-23 01:38:21 +03:00
def json_read ( file ) :
2021-11-26 00:10:31 +03:00
# Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла
2022-01-25 15:50:00 +03:00
#log.info("Reading config file:", file)
2021-11-24 00:38:25 +03:00
with open ( file ) as f :
config = json . load ( f )
return config
2021-11-23 01:38:21 +03:00
2021-11-26 00:10:31 +03:00
# Функция для получения уведомлений пользователя из Misskey
# Возвращает список словарей
2022-01-25 15:50:00 +03:00
def get_notifications ( url , i , includeTypes = [ " follow " , " mention " , " reply " , " renote " , " quote " , " reaction " , " pollVote " , " receiveFollowRequest " , " followRequestAccepted " , " groupInvited " , " app " ] , markAsRead = True ) :
log . info ( " Getting notifications from " , url )
2021-11-26 00:10:31 +03:00
# Формируем URL для доступа к конкретной функции API
2021-11-24 00:38:25 +03:00
req_url = url + " /api/i/notifications "
body = {
" i " : i ,
2021-11-26 00:10:31 +03:00
# Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному
2022-01-25 15:50:00 +03:00
" includeTypes " : includeTypes ,
2021-11-26 00:10:31 +03:00
# Количество уведомлений, которые вытянем
2021-11-24 00:38:25 +03:00
" limit " : 3 ,
2021-11-26 00:10:31 +03:00
" unreadOnly " : False ,
2022-01-25 15:50:00 +03:00
" markAsRead " : markAsRead ,
2021-11-24 00:38:25 +03:00
}
2021-11-26 00:10:31 +03:00
# Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше
2021-11-24 00:38:25 +03:00
r = requests . post ( req_url , json = body )
2021-11-26 00:10:31 +03:00
# Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений
2021-11-24 00:38:25 +03:00
if r . status_code == 200 :
2021-11-26 00:10:31 +03:00
# Можешь раскомментить, глянуть, что это за черт
#print(r.json())
return r . json ( )
# Иначе, если не збс, то ругаемся
2021-11-24 00:38:25 +03:00
else :
print ( " Fuck " )
2021-11-26 00:10:31 +03:00
# Функция, создающая пост
# 2do: посты с картинками, ...
2022-01-25 15:50:00 +03:00
def create_post ( url , i , content = " " , visibility = " public " , channel = " " , fileIds = [ ] , renote = False , renoteId = None ) :
2021-11-24 00:38:25 +03:00
print ( " Post to " , url , " : " , content )
2021-11-26 00:10:31 +03:00
# Аналогично, адрес нужной функции API
2021-11-24 00:38:25 +03:00
req_url = url + " /api/notes/create "
2022-01-25 15:50:00 +03:00
if renote :
body = {
" renoteId " : renoteId ,
" i " : i
}
else :
body = {
2021-11-26 00:10:31 +03:00
# Н е е б у , что за noExtract*, надо полуркать, но работает и збс пока что
2021-11-24 00:38:25 +03:00
" noExtractMentions " : True ,
" noExtractHashtags " : True ,
" noExtractEmojis " : True ,
" visibility " : visibility ,
" text " : content ,
2022-01-25 15:50:00 +03:00
#"fileIds": fileIds,
2021-11-26 00:10:31 +03:00
# Если поставлен канал, то пост только локальный для инстанса
2021-11-24 00:38:25 +03:00
" localOnly " : channel != " " ,
" i " : i
2022-01-25 15:50:00 +03:00
}
if channel != " " :
body [ " channelId " ] = channel
2021-11-26 00:10:31 +03:00
# Отправляем запрос
2021-11-24 00:38:25 +03:00
r = requests . post ( req_url , json = body )
2021-11-26 00:10:31 +03:00
# Аналогично, проверка на 200, в случае успеха 1
2021-11-24 00:38:25 +03:00
if r . status_code == 200 :
return 0
else :
2021-11-27 01:54:29 +03:00
print ( " Failed to post: " , r . text )
2021-11-24 00:38:25 +03:00
return 1
2021-11-27 01:54:29 +03:00
# Пока что можешь не пытаться разобраться, я сам отчасти хз, как это работает, лол
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 ( ) )
2022-01-25 15:50:00 +03:00
2021-11-26 00:10:31 +03:00
### Сюда надо захуярить еще 100500 функций###
2022-01-25 15:50:00 +03:00
2021-11-26 00:10:31 +03:00
# Собсна, содержательная часть программы начинается тут
# Читаем конфиг, получаем словарь
2021-11-24 00:38:25 +03:00
config = json_read ( ' config.json ' )
2021-11-23 01:38:21 +03:00
2022-01-25 15:50:00 +03:00
create_post ( config [ ' url ' ] , config [ ' token ' ] , renote = True , renoteId = " 8vxi115z0g " )