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