@ -3,37 +3,49 @@
import requests # Для отправки http-запросов
import requests # Для отправки http-запросов
import json
import json
import time
import time
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.")
# Функция для чтения JSON-файла (например, конфига), аргумент - адрес файла в ФС
# Функция для чтения JSON-файла (например, конфига), аргумент - адрес файла в ФС
# Возвращает словарь
# Возвращает словарь
def json_read ( file ) :
def json_read ( file ) :
# Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла
# Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла
#log.info("Reading config file:", file)
with open ( file ) as f :
with open ( file ) as f :
config = json . load ( f )
config = json . load ( f )
return config
return config
# Функция для получения уведомлений пользователя из Misskey
# Функция для получения уведомлений пользователя из Misskey
# Возвращает список словарей
# Возвращает список словарей
# 2do: includeTypes как аргумент
def get_notifications ( url , i , includeTypes = [ " follow " , " mention " , " reply " , " renote " , " quote " , " reaction " , " pollVote " , " receiveFollowRequest " , " followRequestAccepted " , " groupInvited " , " app " ] , markAsRead = True ) :
def get_notifications ( url , i ) :
log . info ( " Getting notifications from " , url )
print ( " Getting notifications from " , url )
# Формируем URL для доступа к конкретной функции API
# Формируем URL для доступа к конкретной функции API
req_url = url + " /api/i/notifications "
req_url = url + " /api/i/notifications "
body = {
body = {
" i " : i ,
" i " : i ,
# Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному
# Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному
#"includeTypes": [
" includeTypes " : includeTypes ,
# "reply",
# "mention"
# ],
# Количество уведомлений, которые вытянем
# Количество уведомлений, которые вытянем
" limit " : 3 ,
" limit " : 3 ,
" unreadOnly " : False ,
" unreadOnly " : False ,
" markAsRead " : markAsRead ,
}
}
# Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше
# Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше
r = requests . post ( req_url , json = body )
r = requests . post ( req_url , json = body )
# Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений
# Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений
if r . status_code == 200 :
if r . status_code == 200 :
# Можешь раскомментить, глянуть, что это за черт
# Можешь раскомментить, глянуть, что это за черт
@ -42,27 +54,32 @@ def get_notifications(url, i):
# Иначе, если не збс, то ругаемся
# Иначе, если не збс, то ругаемся
else :
else :
print ( " Fuck " )
print ( " Fuck " )
# Функция, создающая пост
# Функция, создающая пост
# 2do: посты с картинками, ...
# 2do: посты с картинками, ...
def create_post ( content, url , i , visibility = " public " , channel = " " , fileIds = [ ] ) :
def create_post ( url, i , content = " " , visibility = " public " , channel = " " , fileIds = [ ] , renote = False , renoteId = None ) :
print ( " Post to " , url , " : " , content )
print ( " Post to " , url , " : " , content )
# Аналогично, адрес нужной функции API
# Аналогично, адрес нужной функции API
req_url = url + " /api/notes/create "
req_url = url + " /api/notes/create "
body = {
if renote :
body = {
" renoteId " : renoteId ,
" i " : i
}
else :
body = {
# Н е е б у , что за noExtract*, надо полуркать, но работает и збс пока что
# Н е е б у , что за noExtract*, надо полуркать, но работает и збс пока что
" noExtractMentions " : True ,
" noExtractMentions " : True ,
" noExtractHashtags " : True ,
" noExtractHashtags " : True ,
" noExtractEmojis " : True ,
" noExtractEmojis " : True ,
" visibility " : visibility ,
" visibility " : visibility ,
" text " : content ,
" text " : content ,
" fileIds " : fileIds ,
#"fileIds": fileIds ,
# Если поставлен канал, то пост только локальный для инстанса
# Если поставлен канал, то пост только локальный для инстанса
" localOnly " : channel != " " ,
" localOnly " : channel != " " ,
" i " : i
" i " : i
}
}
if channel != " " :
if channel != " " :
body [ " channelId " ] = channel
body [ " channelId " ] = channel
# Отправляем запрос
# Отправляем запрос
r = requests . post ( req_url , json = body )
r = requests . post ( req_url , json = body )
# Аналогично, проверка на 200, в случае успеха 1
# Аналогично, проверка на 200, в случае успеха 1
@ -71,9 +88,7 @@ def create_post(content, url, i, visibility="public", channel="", fileIds=[]):
else :
else :
print ( " Failed to post: " , r . text )
print ( " Failed to post: " , r . text )
return 1
return 1
# Пока что можешь не пытаться разобраться, я сам отчасти хз, как это работает, лол
# Пока что можешь не пытаться разобраться, я сам отчасти хз, как это работает, лол
def file_upload ( file , url , i , isSensitive = False ) :
def file_upload ( file , url , i , isSensitive = False ) :
print ( " Uploading file to " , url )
print ( " Uploading file to " , url )
req_url = url + " /api/drive/files/create "
req_url = url + " /api/drive/files/create "
@ -100,17 +115,13 @@ def get_file_list(url, i):
req_url = url + " /api/drive/files "
req_url = url + " /api/drive/files "
r = requests . post ( req_url , json = { " i " : i } )
r = requests . post ( req_url , json = { " i " : i } )
print ( r . json ( ) )
print ( r . json ( ) )
### Сюда надо захуярить еще 100500 функций###
### Сюда надо захуярить еще 100500 функций###
# Собсна, содержательная часть программы начинается тут
# Собсна, содержательная часть программы начинается тут
# Читаем конфиг, получаем словарь
# Читаем конфиг, получаем словарь
config = json_read ( ' config.json ' )
config = json_read ( ' config.json ' )
#notif_list = get_notifications(config['url'], config['token'])
create_post ( config [ ' url ' ] , config [ ' token ' ] , renote = True , renoteId = " 8vxi115z0g " )
#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)