Compare commits
	
		
			14 commits
		
	
	
		
			3e6e51a64c
			...
			11825e4825
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 11825e4825 | |||
|  | 0fbdfab1dd | ||
|  | b5a71d5dce | ||
| 5e47ecc9b4 | |||
|  | 8e1ebb2926 | ||
|  | 950141c5cf | ||
|  | 6c03cc266c | ||
| 63c8a882c0 | |||
|  | 115f5cae7e | ||
|  | e43233632d | ||
|  | 7db372f76c | ||
|  | 1001e3887f | ||
|  | b38c14a16f | ||
|  | 8ea5b95573 | 
					 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…
	
	Add table
		Add a link
		
	
		Reference in a new issue