From dc517c455503297e2154423b915db8303e26c139 Mon Sep 17 00:00:00 2001 From: nihonium Date: Tue, 25 Jan 2022 15:50:00 +0300 Subject: [PATCH 1/6] Nya --- main.py | 61 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 25 deletions(-) mode change 100644 => 100755 main.py diff --git a/main.py b/main.py old mode 100644 new mode 100755 index 64a7637..93c897b --- a/main.py +++ b/main.py @@ -3,37 +3,49 @@ import requests # Для отправки http-запросов import json 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-файла (например, конфига), аргумент - адрес файла в ФС # Возвращает словарь def json_read(file): # Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла + #log.info("Reading config file:", 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) +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) # Формируем URL для доступа к конкретной функции API req_url = url + "/api/i/notifications" - body = { "i": i, # Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному - #"includeTypes": [ - # "reply", - # "mention" - # ], + "includeTypes": includeTypes, # Количество уведомлений, которые вытянем "limit": 3, "unreadOnly": False, + "markAsRead": markAsRead, } # Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше r = requests.post(req_url, json=body) - # Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений if r.status_code == 200: # Можешь раскомментить, глянуть, что это за черт @@ -42,27 +54,32 @@ def get_notifications(url, i): # Иначе, если не збс, то ругаемся else: print("Fuck") - # Функция, создающая пост # 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) # Аналогично, адрес нужной функции API req_url = url + "/api/notes/create" - body = { + if renote: + body = { + "renoteId": renoteId, + "i": i + } + else: + body = { # Не ебу, что за noExtract*, надо полуркать, но работает и збс пока что "noExtractMentions": True, "noExtractHashtags": True, "noExtractEmojis": True, "visibility": visibility, "text": content, - "fileIds": fileIds, + #"fileIds": fileIds, # Если поставлен канал, то пост только локальный для инстанса "localOnly": channel != "", "i": i - } - if channel != "": - body["channelId"] = channel + } + if channel != "": + body["channelId"] = channel # Отправляем запрос r = requests.post(req_url, json=body) # Аналогично, проверка на 200, в случае успеха 1 @@ -71,9 +88,7 @@ def create_post(content, url, i, visibility="public", channel="", fileIds=[]): 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" @@ -100,17 +115,13 @@ 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) +create_post(config['url'], config['token'], renote=True, renoteId="8vxi115z0g") -- 2.40.0 From 27c2296db3d9dab322287f0f66bf6136e64638e7 Mon Sep 17 00:00:00 2001 From: nihonium Date: Tue, 25 Jan 2022 17:33:04 +0300 Subject: [PATCH 2/6] =?UTF-8?q?=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 59 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 46 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 93c897b..5b442c9 100755 --- a/main.py +++ b/main.py @@ -5,6 +5,7 @@ import json import time import argparse import logging as log +import pprint p = argparse.ArgumentParser() p.add_argument('--verbose', '-v', action='count', default=0) @@ -24,15 +25,17 @@ else: # Возвращает словарь def json_read(file): # Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла - #log.info("Reading config file:", file) + log.info("Reading config file: %s", file) with open(file) as f: config = json.load(f) return config +config = json_read('config.json') + # Функция для получения уведомлений пользователя из Misskey # Возвращает список словарей -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) +def get_notifications(url, i, includeTypes=["follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "receiveFollowRequest", "followRequestAccepted", "groupInvited","app"], markAsRead=True, unreadOnly=True, following=True, limit=5): + log.info("Getting notifications from %s", url) # Формируем URL для доступа к конкретной функции API req_url = url + "/api/i/notifications" body = { @@ -43,21 +46,23 @@ def get_notifications(url, i, includeTypes=["follow", "mention", "reply", "renot "limit": 3, "unreadOnly": False, "markAsRead": markAsRead, + "unreadOnly": unreadOnly, + "following": following, + "limit": limit, } # Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше r = requests.post(req_url, json=body) # Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений if r.status_code == 200: # Можешь раскомментить, глянуть, что это за черт - #print(r.json()) return r.json() # Иначе, если не збс, то ругаемся else: - print("Fuck") + log.error("Fuck you, leatherman") # Функция, создающая пост # 2do: посты с картинками, ... -def create_post(url, i, content="", visibility="public", channel="", fileIds=[], renote=False, renoteId=None): - print("Post to", url, ":", content) +def create_note(url=config['url'], i=config['token'], content="", visibility="public", channel="", fileIds=[], renote=False, renoteId=None): + log.info("Creating note to %s", url) # Аналогично, адрес нужной функции API req_url = url + "/api/notes/create" if renote: @@ -76,7 +81,7 @@ def create_post(url, i, content="", visibility="public", channel="", fileIds=[], #"fileIds": fileIds, # Если поставлен канал, то пост только локальный для инстанса "localOnly": channel != "", - "i": i + "i": i, } if channel != "": body["channelId"] = channel @@ -86,8 +91,9 @@ def create_post(url, i, content="", visibility="public", channel="", fileIds=[], if r.status_code == 200: return 0 else: - print("Failed to post:", r.text) + log.error("Failed to post: %s", r.text) return 1 + # Пока что можешь не пытаться разобраться, я сам отчасти хз, как это работает, лол def file_upload(file, url, i, isSensitive=False): print("Uploading file to", url) @@ -117,11 +123,38 @@ def get_file_list(url, i): print(r.json()) ### Сюда надо захуярить еще 100500 функций### - - +def follow_user(userId, url=config['url'], i=config['token']): + req_url = url + "/api/following/create" + r = requests.post(req_url, json={"i":i, "userId": userId}) + #print(r.json()) + if r.status_code == 200: + return r.json() + else: + print("Upload failed with code", r.status_code) + print(r.text) # Собсна, содержательная часть программы начинается тут # Читаем конфиг, получаем словарь -config = json_read('config.json') -create_post(config['url'], config['token'], renote=True, renoteId="8vxi115z0g") + +#create_note(config['url'], config['token'], renote=True, renoteId="8vxo3hpsdm") + +while True: + notif_list = get_notifications(config['url'], config['token'], includeTypes=["mention"], markAsRead=False, unreadOnly=True, limit=2, following=True) + follow_notif_list = get_notifications(config['url'], config['token'], includeTypes=["follow"], markAsRead=False, unreadOnly=True, limit=2, following=False) + #pprint.pprint(notif_list) + pprint.pprint(follow_notif_list) + notes_to_repost=list() + users_to_follow=list() + for i in range(len(notif_list)): + #pprint.pprint(notif_list[i]['note']['id']) + notes_to_repost.append(notif_list[i]['note']['id']) + for i in range(len(follow_notif_list)): + #pprint.pprint(notif_list[i]['note']['id']) + users_to_follow.append(follow_notif_list[i]['user']['id']) + print(users_to_follow) + #for i in range(len(notes_to_repost)): + # create_note(renote=True, renoteId=notes_to_repost.pop()) + for i in range(len(users_to_follow)): + follow_user(users_to_follow.pop()) + time.sleep(2) -- 2.40.0 From 298ea853b726170756c54f69f5e0121132e89470 Mon Sep 17 00:00:00 2001 From: nihonium Date: Thu, 27 Jan 2022 19:27:46 +0300 Subject: [PATCH 3/6] Global rewrite, shit cleaning --- bot.py | 24 +++++++++ main.py | 160 -------------------------------------------------------- msk.py | 72 +++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 160 deletions(-) create mode 100755 bot.py delete mode 100755 main.py create mode 100644 msk.py diff --git a/bot.py b/bot.py new file mode 100755 index 0000000..a395a30 --- /dev/null +++ b/bot.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 +import logging as log +import requests +import json +import msk + +def json_read(file): + print("Reading config file: {}".format(file)) + with open(file) as f: + config = json.load(f) + return config + +config = json_read('config.json') + +if config['verbosity'].upper() == 'DEBUG': + log.basicConfig(format="%(levelname)s: %(message)s", level=log.DEBUG) + log.info("Verbose output") + +msk = msk.Misskey(i=config['token'], url=config['url']) + + +fid = msk.drive_files_create("yaoshi-jun-Toosaka-Rin-Fate-(series)-Anime-3306019.jpeg", isSensitive=True)['id'] +msk.notes_create(text="Wannya see my picture?", cw="Nya?", fileIds=[fid]) + diff --git a/main.py b/main.py deleted file mode 100755 index 5b442c9..0000000 --- a/main.py +++ /dev/null @@ -1,160 +0,0 @@ -#!/usr/bin/python3 - -import requests # Для отправки http-запросов -import json -import time -import argparse -import logging as log -import pprint - -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-файла (например, конфига), аргумент - адрес файла в ФС -# Возвращает словарь -def json_read(file): - # Создается локальное окружение (или как эта хуйня зовется), где присутствует дескриптор для нашего файла - log.info("Reading config file: %s", file) - with open(file) as f: - config = json.load(f) - return config - -config = json_read('config.json') - -# Функция для получения уведомлений пользователя из Misskey -# Возвращает список словарей -def get_notifications(url, i, includeTypes=["follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "receiveFollowRequest", "followRequestAccepted", "groupInvited","app"], markAsRead=True, unreadOnly=True, following=True, limit=5): - log.info("Getting notifications from %s", url) - # Формируем URL для доступа к конкретной функции API - req_url = url + "/api/i/notifications" - body = { - "i": i, - # Можно включить лишь определенные уведомления, всю эту залупу следует вынести также в аргументы функции, чтоб реагировать на конкретные события, типа подписки или упоминания, по-разному - "includeTypes": includeTypes, - # Количество уведомлений, которые вытянем - "limit": 3, - "unreadOnly": False, - "markAsRead": markAsRead, - "unreadOnly": unreadOnly, - "following": following, - "limit": limit, - } - # Отправляем запрос, в тело запроса суем словарь-JSON, которые объявили выше - r = requests.post(req_url, json=body) - # Если все прошло збс, код HTTP 200, то отдаем получанный список уведомлений - if r.status_code == 200: - # Можешь раскомментить, глянуть, что это за черт - return r.json() - # Иначе, если не збс, то ругаемся - else: - log.error("Fuck you, leatherman") -# Функция, создающая пост -# 2do: посты с картинками, ... -def create_note(url=config['url'], i=config['token'], content="", visibility="public", channel="", fileIds=[], renote=False, renoteId=None): - log.info("Creating note to %s", url) - # Аналогично, адрес нужной функции API - req_url = url + "/api/notes/create" - if renote: - body = { - "renoteId": renoteId, - "i": i - } - else: - 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: - log.error("Failed to post: %s", 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 функций### -def follow_user(userId, url=config['url'], i=config['token']): - req_url = url + "/api/following/create" - r = requests.post(req_url, json={"i":i, "userId": userId}) - #print(r.json()) - if r.status_code == 200: - return r.json() - else: - print("Upload failed with code", r.status_code) - print(r.text) -# Собсна, содержательная часть программы начинается тут - -# Читаем конфиг, получаем словарь - - -#create_note(config['url'], config['token'], renote=True, renoteId="8vxo3hpsdm") - -while True: - notif_list = get_notifications(config['url'], config['token'], includeTypes=["mention"], markAsRead=False, unreadOnly=True, limit=2, following=True) - follow_notif_list = get_notifications(config['url'], config['token'], includeTypes=["follow"], markAsRead=False, unreadOnly=True, limit=2, following=False) - #pprint.pprint(notif_list) - pprint.pprint(follow_notif_list) - notes_to_repost=list() - users_to_follow=list() - for i in range(len(notif_list)): - #pprint.pprint(notif_list[i]['note']['id']) - notes_to_repost.append(notif_list[i]['note']['id']) - for i in range(len(follow_notif_list)): - #pprint.pprint(notif_list[i]['note']['id']) - users_to_follow.append(follow_notif_list[i]['user']['id']) - print(users_to_follow) - #for i in range(len(notes_to_repost)): - # create_note(renote=True, renoteId=notes_to_repost.pop()) - for i in range(len(users_to_follow)): - follow_user(users_to_follow.pop()) - time.sleep(2) diff --git a/msk.py b/msk.py new file mode 100644 index 0000000..83caf0e --- /dev/null +++ b/msk.py @@ -0,0 +1,72 @@ +import requests +import logging as log + +class Misskey: + ''' + Class for interaction with Misskey instance + Currently, this class ignores most of the Misskey specific shit like channels =3 + ''' + + def __init__(self, url: str, i: str): + self.url = url + self.i = i + + def notes_create(self, text=None, visibility = "public", cw = None, fileIds = list(), replyId = None, renoteId = None): + req_url = self.url + "/api/notes/create" + + if renoteId: + body = { + "renoteId": renoteId, + } + else: + body = { + "text": text, + "visibility": visibility, + } + for item in [(cw, "cw"), (fileIds,"fileIds"), (replyId,"replyId")]: + if item[0]: + body[item[1]] = item[0] + + body['i'] = self.i + + log.info("Trying to post note to {}".format(self.url)) + r = requests.post(req_url, json=body) + print(body) + if r.status_code == 200: + log.info("Successfully posted") + else: + log.error("Posting failed with {} error!".format(r.status_code)) + + return r.json() + + def following_create(self, userId: str): + req_url = self.url + "/api/following/create" + r = requests.post(req_url, json={"i":self.i, "userId": userId}) + if r.status_code == 200: + res = r.json() + log.info("Successfully followed user {}@{}[{}]".format(res['username'],res['host'] ,userId)) + else: + log.error("Failed to follow user [{}] with {} error!".format(userId, r.status_code)) + + return r.json() + + def drive_files_create(self, file, isSensitive=False): + req_url = self.url + "/api/drive/files/create" + + with open(file, "rb") as f: + files = {"file": (file, f)} + body = { + "isSensitive": isSensitive, + "i":self.i + } + payload = {'json_payload': body, 'i': self.i } + + r = requests.post(req_url, data=payload, files=files) + + if r.status_code == 200: + res = r.json() + log.info("Successfully uploaded file {}[{}]".format(res['name'], res['id'])) + else: + log.error("Failed to upload file {} with {} error!".format(file, r.status_code)) + + return r.json() -- 2.40.0 From 8730dcd7f1b9ab758df902d56fc0c580940ac202 Mon Sep 17 00:00:00 2001 From: nihonium Date: Thu, 27 Jan 2022 22:35:15 +0300 Subject: [PATCH 4/6] websockets --- bot.py | 43 +++++++++++++++++++++++++++++++++++++++++-- config.json.example | 8 ++++---- msk.py | 3 ++- 3 files changed, 47 insertions(+), 7 deletions(-) diff --git a/bot.py b/bot.py index a395a30..6e017a0 100755 --- a/bot.py +++ b/bot.py @@ -3,6 +3,8 @@ import logging as log import requests import json import msk +import websockets +import asyncio, aiohttp def json_read(file): print("Reading config file: {}".format(file)) @@ -12,6 +14,12 @@ def json_read(file): config = json_read('config.json') +#try: +# config = json_read('config.json') +#except FileNotFoundError: +# print("Config file not found. Maybe we should launch setup.py?") + + if config['verbosity'].upper() == 'DEBUG': log.basicConfig(format="%(levelname)s: %(message)s", level=log.DEBUG) log.info("Verbose output") @@ -19,6 +27,37 @@ if config['verbosity'].upper() == 'DEBUG': msk = msk.Misskey(i=config['token'], url=config['url']) -fid = msk.drive_files_create("yaoshi-jun-Toosaka-Rin-Fate-(series)-Anime-3306019.jpeg", isSensitive=True)['id'] -msk.notes_create(text="Wannya see my picture?", cw="Nya?", fileIds=[fid]) +#fid = msk.drive_files_create("yaoshi-jun-Toosaka-Rin-Fate-(series)-Anime-3306019.jpeg", isSensitive=True)['id'] +#msk.notes_create(text="Wannya see my picture?", cw="Nya?", fileIds=[fid]) +async def main(): + async with websockets.connect(msk.ws_url) as ws: + print('Connecting') + p = { + 'type': 'connect', + 'body': { + 'channel': 'homeTimeline', + 'id': 'Nya1' + } + } + await ws.send(json.dumps(p)) + p = { + 'type': 'connect', + 'body': { + 'channel': 'main', + 'id': 'Nya2' + } + } + await ws.send(json.dumps(p)) + + print('Listening') + while True: + data = await ws.recv() + j = json.loads(data) + print(j) + +while True: + try: + asyncio.get_event_loop().run_until_complete(main()) + except KeyboardInterrupt: + break diff --git a/config.json.example b/config.json.example index a47ce1e..c207b1d 100644 --- a/config.json.example +++ b/config.json.example @@ -1,7 +1,7 @@ { - "nyan.nekoea.red": { "name": "nyan.nekoea.red", - "url" : "https://nyan.nekoea.red", - "token": "nyanyanyanyanyanyanya", - }, + "url" : "nyan.nekoea.red", + "token": "*****", + "verbosity": "debug" } + diff --git a/msk.py b/msk.py index 83caf0e..d7de9f7 100644 --- a/msk.py +++ b/msk.py @@ -8,8 +8,9 @@ class Misskey: ''' def __init__(self, url: str, i: str): - self.url = url + self.url = f"https://{url}" self.i = i + self.ws_url=f"wss://{url}/streaming&i={i}" def notes_create(self, text=None, visibility = "public", cw = None, fileIds = list(), replyId = None, renoteId = None): req_url = self.url + "/api/notes/create" -- 2.40.0 From 31cb538e1ad5d346c964186953d68dab64e675dd Mon Sep 17 00:00:00 2001 From: nihonium Date: Fri, 28 Jan 2022 15:53:52 +0300 Subject: [PATCH 5/6] Finyally working websocket version --- bot.py | 34 +++++++++++++++++----------------- msk.py | 2 +- sources.md | 9 --------- 3 files changed, 18 insertions(+), 27 deletions(-) delete mode 100644 sources.md diff --git a/bot.py b/bot.py index 6e017a0..1228976 100755 --- a/bot.py +++ b/bot.py @@ -12,8 +12,10 @@ def json_read(file): config = json.load(f) return config +# Temp config = json_read('config.json') + #try: # config = json_read('config.json') #except FileNotFoundError: @@ -26,38 +28,36 @@ if config['verbosity'].upper() == 'DEBUG': msk = msk.Misskey(i=config['token'], url=config['url']) - -#fid = msk.drive_files_create("yaoshi-jun-Toosaka-Rin-Fate-(series)-Anime-3306019.jpeg", isSensitive=True)['id'] -#msk.notes_create(text="Wannya see my picture?", cw="Nya?", fileIds=[fid]) async def main(): + log.info("Connecting to {}".format(msk.url)) async with websockets.connect(msk.ws_url) as ws: - print('Connecting') + log.info('Sucessfully connected to {}'.format(msk.url)) + log.info('Attemping to watch timeline') p = { 'type': 'connect', 'body': { - 'channel': 'homeTimeline', - 'id': 'Nya1' - } - } - await ws.send(json.dumps(p)) - p = { - 'type': 'connect', - 'body': { - 'channel': 'main', - 'id': 'Nya2' + 'channel': 'main' } } await ws.send(json.dumps(p)) - print('Listening') + log.info('Listening to timeline') while True: data = await ws.recv() j = json.loads(data) + if j['type'] == 'channel': + if j['body']['type'] == 'followed': + print("Follow!") + msk.following_create(j['body']['body']['id']) + if j['body']['type'] == 'mention': + if not j['body']['body']['replyId']: + msk.notes_create(renoteId=j['body']['body']['id']) print(j) - while True: try: - asyncio.get_event_loop().run_until_complete(main()) + loop = asyncio.new_event_loop() + #asyncio.set_event_loop(loop) + loop.run_until_complete(main()) except KeyboardInterrupt: break diff --git a/msk.py b/msk.py index d7de9f7..02aef4e 100644 --- a/msk.py +++ b/msk.py @@ -10,7 +10,7 @@ class Misskey: def __init__(self, url: str, i: str): self.url = f"https://{url}" self.i = i - self.ws_url=f"wss://{url}/streaming&i={i}" + self.ws_url=f"wss://{url}/streaming?i={i}" def notes_create(self, text=None, visibility = "public", cw = None, fileIds = list(), replyId = None, renoteId = None): req_url = self.url + "/api/notes/create" diff --git a/sources.md b/sources.md deleted file mode 100644 index f648ea6..0000000 --- a/sources.md +++ /dev/null @@ -1,9 +0,0 @@ -## API -https://misskey.io/api-doc - -## Примеры ботов -https://github.com/yupix/Mi.py - -https://github.com/TennousuAthena/RSSToMisskey - -https://github.com/theskanthunt42/misskeyInstanceCheckBot -- 2.40.0 From 063972ac9a22a30f852474f6c358f409cc534fc0 Mon Sep 17 00:00:00 2001 From: nihonium Date: Sun, 14 Aug 2022 22:33:50 +0300 Subject: [PATCH 6/6] main fix --- bot.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bot.py b/bot.py index 1228976..379fa7a 100755 --- a/bot.py +++ b/bot.py @@ -55,9 +55,7 @@ async def main(): print(j) while True: try: - loop = asyncio.new_event_loop() - #asyncio.set_event_loop(loop) - loop.run_until_complete(main()) + asyncio.run(main()) except KeyboardInterrupt: break -- 2.40.0