Compare commits
	
		
			No commits in common. "11825e48259a049751e2ee8607a47fd9da259a58" and "3e6e51a64cdefbb2f2971b7f061fef5fd89ad3ec" have entirely different histories.
		
	
	
		
			11825e4825
			...
			3e6e51a64c
		
	
		
					 6 changed files with 2 additions and 155 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +0,0 @@ | ||||||
| config.json |  | ||||||
							
								
								
									
										22
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								README.md
									
										
									
									
									
								
							|  | @ -1,21 +1,3 @@ | ||||||
| # Misskey Bot | # misskey_bot | ||||||
| 
 |  | ||||||
| [Ранняя стадия разработки, авось что получится съедобное] |  | ||||||
| Какой функционал планируется у бота: |  | ||||||
| 1. Бот-группа  |  | ||||||
| 2. Бот-ретранслятор с Twitter |  | ||||||
| 3. Автопостер картинок из заданного каталога (готово на 80%) |  | ||||||
| 
 |  | ||||||
| ## 1 Как заставить бота работать? |  | ||||||
| 1.1 В первую очередь нужно зайти в аккаунт бота на вашем инстансе, после этого перейти в настройки (шестерёнка) - API - создать токен доступа. |  | ||||||
| Предоствьте боту тот доступ, который будет предостаточен для выполнения ваших потребностей.  |  | ||||||
| 
 |  | ||||||
| 1.2 Правильно заполните конфиг. Это очень важно, иначе бот не будет работать! |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ##   |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|  | misskey bot. Python | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
|   { |  | ||||||
|     "name": "[Shitpost] PoridgeClub", |  | ||||||
|     "url" : "https://shitpost.poridge.club", |  | ||||||
|     "token": "ur_token", |  | ||||||
|     "visibility": "public" |  | ||||||
|   } |  | ||||||
							
								
								
									
										116
									
								
								main.py
									
										
									
									
									
								
							
							
						
						
									
										116
									
								
								main.py
									
										
									
									
									
								
							|  | @ -1,116 +0,0 @@ | ||||||
| #!/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
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								sources.md
									
										
									
									
									
								
							|  | @ -1,12 +0,0 @@ | ||||||
| ## 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
									
										
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								test.jpg
									
										
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| Before Width: | Height: | Size: 129 KiB | 
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue