From ba742f7d2129976f0ada1dc8c7968874ff9c407a Mon Sep 17 00:00:00 2001 From: Noretsa Date: Mon, 19 Feb 2024 13:23:20 +0300 Subject: [PATCH] Mostly change programm --- classes/dip.py | 3 + classes/kp.py | 138 +++++++++++ classes/users_dip.py | 1 + classes/users_kp.py | 28 +++ data/5020051404_1@check.mo/img_5.txt | 4 + data/5020051404_1@check.mo/new_template.docx | Bin 0 -> 9430 bytes data/5020051404_1@check.mo/pass.txt | 1 + data/5020051404_1@check.mo/template.docx | Bin 0 -> 9000 bytes data/5020051404_1@check.mo/template_lift.docx | Bin 0 -> 9167 bytes des.py | 26 +- knd_bot.py | 233 +++++++++++------- knd_dip.py | 9 +- knd_dip2.py | 162 ++++++++++++ knd_kp.py | 195 +++++++++++++++ naled.py | 20 +- 15 files changed, 709 insertions(+), 111 deletions(-) create mode 100644 classes/kp.py create mode 100644 classes/users_kp.py create mode 100644 data/5020051404_1@check.mo/img_5.txt create mode 100644 data/5020051404_1@check.mo/new_template.docx create mode 100644 data/5020051404_1@check.mo/pass.txt create mode 100644 data/5020051404_1@check.mo/template.docx create mode 100644 data/5020051404_1@check.mo/template_lift.docx create mode 100644 knd_dip2.py create mode 100644 knd_kp.py diff --git a/classes/dip.py b/classes/dip.py index fdb5800..4850b4d 100644 --- a/classes/dip.py +++ b/classes/dip.py @@ -1,6 +1,8 @@ import os import datetime import time +import json +import pprint from natsort import natsorted @@ -35,6 +37,7 @@ def complete_task(session, headers, task, address): # print(prepared_answers) ans = {"question_chains": prepared_answers} # print(ans) + # print(task['id']) session_t = session session_t.headers.update( { diff --git a/classes/kp.py b/classes/kp.py new file mode 100644 index 0000000..bab1364 --- /dev/null +++ b/classes/kp.py @@ -0,0 +1,138 @@ +import os +import datetime +import time +import json +import pprint +from natsort import natsorted + + +def assign_task(session, headers, task): + # print('assign_task') + address = task['address'] + url = 'https://knd.mosreg.ru//api/v1/executions/'+str(task['id'])+'/assign' + task_assign = session.put(url, headers=headers) + if task_assign.status_code == 200: + print(f'Получили задание по адресу: {address}') + complete_task(session, headers, task, address) + else: + print(f"Не смогли получить задание {address} {task['id']}!") + + +def complete_task(session, headers, task, address): + photos = get_photo(address, headers['uid']) + if len(photos) > 0: + # photos.sort() + photos = natsorted(photos) + else: + print(len(photos)) + """В папке лежит фото графика, которое отправляется из модуля des, поэтому убираем отсюда""" + # if len(photos) == 11 or len(photos) == 13: + # photos.pop() + id_task = task['id'] + quest = get_questions(id_task, session, headers) + # print(quest) + # length_question = get_length_questions(quest) + prepared_answers = [] + if True: + prepared_answers = prepare_answer(quest, photos, session, task, headers) + # print(prepared_answers) + ans = {"question_chains": prepared_answers} + # print(ans) + # print(task['id']) + session_t = session + session_t.headers.update( + { + 'referer': 'https://knd.mosreg.ru/executions'+str(task['id'])+'/solve', + 'x-platform': 'android', + 'accept': '*/*' + } + ) + complete = session_t.post('https://knd.mosreg.ru//api/v1/executions/'+str(task['id'])+'/answers', headers=headers, json=ans) + if complete.status_code == 200: + print(f'Задание по адресу {address} выполнено успешно!\n\n') + else: + print(f'Задание по адресу {address} не выполненно! Статус ошибки {complete.status_code}\n\n') + else: + print(f"\n\n\nНесоответствие количества вопросов и фотографий по адресу {address}!!! \ + Необходимо проверить!!!\n\n\n") + # print(len(quest)) 9 and 13 + + +def get_photo(address, email): + photos = [] + # month = datetime.datetime.now().month + main_path = os.path.join(os.path.abspath('.'), 'data_kp', email) + if not os.path.exists(main_path): + return photos + else: + for images in os.listdir(main_path): + if images.endswith(".jpg") or images.endswith(".jpeg") or images.endswith(".JPG"): + photos.append(main_path + '/' + images) + return photos + + +def get_questions(id_task, session, headers): + url = 'https://knd.mosreg.ru//api/v1/executions/'+str(id_task)+'/questions' + questions = session.get(url, headers=headers) + json_quest = questions.json() + return json_quest['question_chains'] + + +def prepare_answer(quest, photos, session, task, headers): + questions = [] + question_components= [] + question_chains = [] + for main_chain in quest: + for second_chain in main_chain['questions']: + for third_chain in second_chain['question_components']: + question_type = third_chain['type'] + if question_type == 'list': + data = {"id": third_chain['id'], "answer": 888, "start_time": int(time.time())} + time.sleep(2) + data.update({"end_time": int(time.time())}) + question_components.append(data) + elif question_type == "geo": + data = {"id": third_chain['id'], "answer": {"location": task['coord']}, "start_time": int(time.time())} + time.sleep(2) + data.update({"end_time": int(time.time())}) + question_components.append(data) + elif question_type == "gallery": + images = [] + for image in photos: + img = send_image(session, headers, task['id'], image) + images.append(img['id']) + data = {"id": third_chain['id'], "answer": images, + "start_time": int(time.time())} + time.sleep(2) + data.update({"end_time": int(time.time())}) + question_components.append(data) + if len(question_components) > 0: + main_data = { + "id": second_chain['id'], + "question_components": question_components + } + questions.append(main_data) + question_components = [] + if len(questions) > 0: + q_dict = { + "id": main_chain['id'], + "questions": questions + } + question_chains.append(q_dict) + questions = [] + return question_chains + + +def send_image(session, headers, url, photo): + """Отправляем фото на сервер. Сервер должен вернуть id и url.""" + files = { + 'image': (photo[-5:], open(photo, 'rb')), + } + img = session.post('https://knd.mosreg.ru//api/v1/executions/'+str(url)+'/images', headers=headers, files=files) + if img.status_code == 200: + print(f"Фото {photo} успешно отправлено") + return img.json() + else: + print(f"Не удалось загрузить фото на сервер по заданию {url}, статус ошибки {img.status_code}! Повторная попытка!") + second_img = send_image(session, headers, url, photo) + return second_img diff --git a/classes/users_dip.py b/classes/users_dip.py index 6b32e2d..d335db7 100644 --- a/classes/users_dip.py +++ b/classes/users_dip.py @@ -7,6 +7,7 @@ class Users_dip: self.path = os.path.join(os.path.abspath('.'), 'data_dip') def get_users(self): + """Get names from names of folders.""" self.logins = [] main_dir = os.walk(self.path) for d, dirs, files in main_dir: diff --git a/classes/users_kp.py b/classes/users_kp.py new file mode 100644 index 0000000..cf193c4 --- /dev/null +++ b/classes/users_kp.py @@ -0,0 +1,28 @@ +import os + + +class Users_kp: + def __init__(self): + self.data = [] + self.path = os.path.join(os.path.abspath('.'), 'data_kp') + + def get_users(self): + """Get names from names of folders.""" + self.logins = [] + main_dir = os.walk(self.path) + for d, dirs, files in main_dir: + self.logins.append(dirs) + return self.logins[0] + + def get_passwords(self): + if not os.path.exists(self.path): + return "Папка data_led не существует. Создайте папку с необходимыми параметрами и запустите программу снова!" + self.emails = self.get_users() + if len(self.emails) > 0: + for user in self.emails: + with open(os.path.join(self.path, user, 'pass.txt'), 'r') as f: + log_pass = {'email': user, 'password': f.readline().split('\n')[0]} + self.data.append(log_pass) + else: + return "Нет ни одного пользователя! Заполните папку и запустите программу снова!" + return self.data diff --git a/data/5020051404_1@check.mo/img_5.txt b/data/5020051404_1@check.mo/img_5.txt new file mode 100644 index 0000000..0437f7c --- /dev/null +++ b/data/5020051404_1@check.mo/img_5.txt @@ -0,0 +1,4 @@ + + +8(985)574-78-37 + diff --git a/data/5020051404_1@check.mo/new_template.docx b/data/5020051404_1@check.mo/new_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..ecf5c8b70a4efd6f20833c7450aa05caf2ca1dfc GIT binary patch literal 9430 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 Vh!>^=0KmV5`8VK(05+pbTfGIWW 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 literal 0 HcmV?d00001 diff --git a/data/5020051404_1@check.mo/template_lift.docx b/data/5020051404_1@check.mo/template_lift.docx new file mode 100644 index 0000000000000000000000000000000000000000..1cdf66b89e290716083da59e79106becc2377e5f GIT binary patch literal 9167 zcmch7WmFtnw{4@rCAfQny9T!o65QRL#+?9-yA#|A!9svw!QDb|cPBW(9d0M*yZ4;K zeeeBzU88DOSB<%9+uAkPT%{-r1B(p+01yBL?_iYXH`eQQp#XqnH~;_(a#cs%-p<9$ z&c#60)4|MHkJ$rcTbm@P(8Y=o;_fS%L<1wU$W9)V?zUh@nnnIlunuQRtLVku)+G3PNeJ@H>&On zZ~IgK#x#E{?w#33yg7%IQGK}rblPuiyxC476B-|s+6f{<-Xd8BbM6Q@P)o2^x(j_* z7wSA-YvQmjQlR#|E$-33T0E??`k@By7uGb1^eK$*z3@_fmp$Nq7g~N5eo&wg_Y2n1 z12LHUTZ%#8B;J~RfcFi8gaG)7rBe1tBeynK7Qv;V#bezDjeF!wSRAifJmN^3#1BgG zUxRV&(h9c)83Z|K000?M8aSERII)iOc7Ip z)!XnQe2!5BfzH3MuM_aHQUhqb^$=AW&0X$tfM=2RY4xd0vm@7o@a6`iEinJ?jS+ko z);>rtFhHg!CZsgAH&Jx5cW`Dgv3D~2JuyMCqO#qr7{QP}8JCqmtU;nQYw|v;K@LFD z4>di2¥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 literal 0 HcmV?d00001 diff --git a/des.py b/des.py index 521c3eb..3604fc7 100644 --- a/des.py +++ b/des.py @@ -1,13 +1,15 @@ -import requests -import random -import string # import json import datetime -import time import os -from classes.users import Users +import random +import string +import time + +import requests + import classes.desinfection as des -import classes.proverka as prov +# import classes.proverka as prov +from classes.users import Users def get_questions(id_task, session, headers): @@ -119,10 +121,12 @@ def get_task(session, headers): coord = n['coord'] enterances = n['tasks'] for execution in enterances: - address_from_tasks = execution['dimensions'][0].get('entity_value_name') + address_from_tasks = execution['dimensions'][0].get( + 'entity_value_name') name_from_tasks = execution['name'] if name_from_tasks == desinfection: - enterance = execution['dimensions'][2].get('entity_value_name') + enterance = execution['dimensions'][2].get( + 'entity_value_name') if address_from_tasks == 'Клин г, ' + addr.replace("_", "/")[:-4] and enterance[-1] == address[-2]: print('\n') print(name_from_tasks) @@ -134,14 +138,16 @@ def get_task(session, headers): 'coord': coord } if name_from_tasks == desinfection: - des.assign_task(session, headers, task, address) + des.assign_task( + session, headers, task, address) elif name_from_tasks == proverka: pass # prov.assign_task(session, headers, task, address) else: pass else: - print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") + print( + f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") # Если адреса не получили выводим ошибку else: print(addresses) diff --git a/knd_bot.py b/knd_bot.py index c2c3f95..4af4be1 100644 --- a/knd_bot.py +++ b/knd_bot.py @@ -1,137 +1,178 @@ -import requests -import random -import string # import json import datetime -import time import os -from classes.users import Users +import random +import string +import time + +import requests + import classes.desinfection as des import classes.proverka as prov +from classes.users import Users def get_questions(id_task, session, headers): - url = 'https://knd.mosreg.ru//api/v1/executions/'+str(id_task)+'/questions' + url = "https://knd.mosreg.ru//api/v1/executions/" + str(id_task) + "/questions" questions = session.get(url, headers=headers) json_quest = questions.json() - return json_quest['selected_chains'] + return json_quest["selected_chains"] def send_image(session, headers, url, photo): """Отправляем фото на сервер. Сервер должен вернуть id и url.""" files = { - 'image': (photo[-5:], open(photo, 'rb')), + "image": (photo[-5:], open(photo, "rb")), } # print(files) - img = session.post('https://knd.mosreg.ru//api/v1/executions/'+str(url)+'/images', headers=headers, files=files) + img = session.post( + "https://knd.mosreg.ru//api/v1/executions/" + str(url) + "/images", + headers=headers, + files=files, + ) if img.status_code == 200: print(f"Фото {photo} успешно отправлено") return img.json() else: - print(f"Не удалось загрузить фото на сервер по заданию {url}, статус ошибки {img.status_code}! Повторная попытка!") + print( + f"Не удалось загрузить фото на сервер по заданию {url}, статус ошибки {img.status_code}! Повторная попытка!" + ) second_img = send_image(session, headers, url, photo) return second_img def complete_task(session, headers, task, address): - photos = get_photo(address, headers['uid']) + photos = get_photo(address, headers["uid"]) if len(photos) > 0: photos.sort() - print(task['id']) - id_task = task['id'] + print(task["id"]) + id_task = task["id"] questions = get_questions(id_task, session, headers) data = [] for answers in questions: - answer_chain = { - 'id': answers['id'], - 'questions': [] # answers['questions'] - } - if answer_chain['id'] == 6146: # Цепочка без ответов + answer_chain = {"id": answers["id"], "questions": []} # answers['questions'] + if answer_chain["id"] == 6146: # Цепочка без ответов continue - for components in answers['questions']: + for components in answers["questions"]: comp = [] - q_c = { - 'id': components['id'], - 'question_components': [] - } - if q_c['id'] == 6560: # Вопрос без ответа + q_c = {"id": components["id"], "question_components": []} + if q_c["id"] == 6560: # Вопрос без ответа continue comp.append(q_c) - answer_chain.update({'questions': comp}) + answer_chain.update({"questions": comp}) data.append(answer_chain) if len(data) == len(photos): for chain in data: - for item in chain['questions']: + for item in chain["questions"]: if len(data) == len(photos): photo_from_photos = photos.pop(0) - img = send_image(session, headers, task['id'], photo_from_photos) # photos.pop(0)) + img = send_image( + session, headers, task["id"], photo_from_photos + ) # photos.pop(0)) # count_send_photo = 0 # while img['id'] is None: # count_send_photo += 1 # print("Попытка № " + str(count_send_photo) + "отправить фото" + str(photo_from_photos)) # img = send_image(session, headers, task['id'], photo_from_photos)#photos.pop(0)) - first = {"id": 18850, "answer": [img['id']], 'answer_status': None, 'start_time': int(time.time())} + first = { + "id": 18850, + "answer": [img["id"]], + "answer_status": None, + "start_time": int(time.time()), + } time.sleep(2) - first.update({'end_time': int(time.time())}) - second = {"id": 18851, "answer": {"location": task['coord']}, 'answer_status': None, 'start_time': int(time.time())} + first.update({"end_time": int(time.time())}) + second = { + "id": 18851, + "answer": {"location": task["coord"]}, + "answer_status": None, + "start_time": int(time.time()), + } time.sleep(2) - second.update({'end_time': int(time.time())}) - item['question_components'].append(first) - item['question_components'].append(second) + second.update({"end_time": int(time.time())}) + item["question_components"].append(first) + item["question_components"].append(second) else: - #img = send_image(session, headers, task['id'], photos.pop(0)) + # img = send_image(session, headers, task['id'], photos.pop(0)) photo_from_photos = photos.pop(0) - img = send_image(session, headers, task['id'], photo_from_photos)#photos.pop(0)) + img = send_image( + session, headers, task["id"], photo_from_photos + ) # photos.pop(0)) # count_send_photo = 0 # while img['id'] is None: # count_send_photo += 1 # print("Попытка № " + str(count_send_photo) + " отправить фото" + str(photo_from_photos)) # img = send_image(session, headers, task['id'], photo_from_photos)#photos.pop(0)) - first = {"id": 18856, "answer": 77, 'answer_status': None, 'start_time': int(time.time())} + first = { + "id": 18856, + "answer": 77, + "answer_status": None, + "start_time": int(time.time()), + } time.sleep(2) - first.update({'end_time': int(time.time())}) - second = {"id": 18857, "answer": [img['id']], 'answer_status': None, 'start_time': int(time.time())} + first.update({"end_time": int(time.time())}) + second = { + "id": 18857, + "answer": [img["id"]], + "answer_status": None, + "start_time": int(time.time()), + } time.sleep(2) - second.update({'end_time': int(time.time())}) - item['question_components'].append(first) - item['question_components'].append(second) + second.update({"end_time": int(time.time())}) + item["question_components"].append(first) + item["question_components"].append(second) ans = {"question_chains": data} # print(ans) session_t = session session_t.headers.update( { - 'referer': 'https://knd.mosreg.ru/executions'+str(task['id'])+'/solve', - 'x-platform': 'wb', - 'accept': '*/*' - } + "referer": "https://knd.mosreg.ru/executions" + str(task["id"]) + + "/solve", + "x-platform": "wb", + "accept": "*/*", + } + ) + complete = session_t.post( + "https://knd.mosreg.ru//api/v1/executions/" + str(task["id"]) + "/answers", + headers=headers, + json=ans, ) - complete = session_t.post('https://knd.mosreg.ru//api/v1/executions/'+str(task['id'])+'/answers', headers=headers, json=ans) if complete.status_code == 200: - print(f'Задание по адресу {address} выполнено успешно!') + print(f"Задание по адресу {address} выполнено успешно!") else: - print(f'Задание по адресу {address} не выполненно! Статус ошибки {complete.status_code}') + print( + f"Задание по адресу {address} не выполненно! Статус ошибки {complete.status_code}" + ) else: - print(f"Несоответствие количества вопросов и количества фотографий по адресу: {address}") + print( + f"Несоответствие количества вопросов и количества фотографий по адресу: {address}" + ) + + # send_execution(task,session, headers) def get_photo(address, email): photos = [] month = datetime.datetime.now().month - main_path = os.path.join(os.path.abspath('.'), 'data', email, str(month), address) + main_path = os.path.join(os.path.abspath("."), "data", email, str(month), address) if not os.path.exists(main_path): return photos else: for images in os.listdir(main_path): - if images.endswith(".jpg") or images.endswith(".jpeg") or images.endswith(".JPG"): - photos.append(main_path + '/' + images) + if ( + images.endswith(".jpg") + or images.endswith(".jpeg") + or images.endswith(".JPG") + ): + photos.append(main_path + "/" + images) return photos def get_addresses(email): addresses = [] month = datetime.datetime.now().month - main_path = os.path.join(os.path.abspath('.'), 'data') + main_path = os.path.join(os.path.abspath("."), "data") path = os.walk(os.path.join(main_path, email, str(month))) if not os.path.exists(os.path.join(main_path, email, str(month))): return f"Не найдена папка с месяцем у пользователя {email}! Проверьте структуру каталога!" @@ -163,18 +204,19 @@ def get_task(session, headers): 2 адрес 3 подъезд 4 id_задания""" - desinfection = 'Дезинфекция подъездов (МОП)' - proverka = 'Систематическая проверка подъездов МКД' + desinfection = "Дезинфекция подъездов (МОП)" + proverka = "Систематическая проверка подъездов МКД" # Получаем адреса - addresses = get_addresses(headers['uid']) + addresses = get_addresses(headers["uid"]) # Если адреса получили if isinstance(addresses, list): session_t = session session_t.headers.update( - {'referer': 'https://knd.mosreg.ru/executions', - 'x-platform': 'android', - 'accept': '*/*' - } + { + "referer": "https://knd.mosreg.ru/executions", + "x-platform": "android", + "accept": "*/*", + } ) for address in addresses: # change '-' for '/' @@ -184,36 +226,48 @@ def get_task(session, headers): search = addr.replace("_", "/")[:-4] # print(search) # search = "" - data = {'search': search} - tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', - headers=headers, - data=data - ) + data = {"search": search} + tasks = session_t.post( + "https://knd.mosreg.ru//api/v1/executions", headers=headers, data=data + ) json_tasks = tasks.json() get_t = False # Если есть доступное задание с таким адресом - exec_assigned = json_tasks['executions_assigned'] # Уже полученные задания - exec_available = json_tasks['executions_available'] # Еще не принятые задания + exec_assigned = json_tasks["executions_assigned"] # Уже полученные задания + exec_available = json_tasks[ + "executions_available" + ] # Еще не принятые задания # print(address) if len(exec_available) > 0: for n in exec_available: - coord = n['coord'] - enterances = n['tasks'] + coord = n["coord"] + enterances = n["tasks"] for execution in enterances: - address_from_tasks = execution['dimensions'][0].get('entity_value_name') - name_from_tasks = execution['name'] + address_from_tasks = execution["dimensions"][0].get( + "entity_value_name" + ) + name_from_tasks = execution["name"] if name_from_tasks == proverka: - enterance = execution['dimensions'][2].get('entity_value_name') - if address_from_tasks == 'Клин г, '+ addr.replace("_", "/")[:-4] and \ - enterance[-1] == address[-2]: - print('\n') + enterance = execution["dimensions"][2].get( + "entity_value_name" + ) + if ( + address_from_tasks + == "Клин г, " + addr.replace("_", "/")[:-4] + and enterance[-1] == address[-2] + ): + print("\n") print(name_from_tasks) - print('\n') + print("\n") task = { - 'id': execution['execution_id'], - 'address': execution['dimensions'][0].get('entity_value_name'), - 'enterance': execution['dimensions'][2].get('entity_value_name'), - 'coord': coord + "id": execution["execution_id"], + "address": execution["dimensions"][0].get( + "entity_value_name" + ), + "enterance": execution["dimensions"][2].get( + "entity_value_name" + ), + "coord": coord, } if name_from_tasks == desinfection: pass @@ -223,7 +277,9 @@ def get_task(session, headers): else: pass else: - print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") + print( + f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}" + ) # Если адреса не получили выводим ошибку else: print(addresses) @@ -233,18 +289,15 @@ def main(): users = Users() logins = users.get_passwords() if isinstance(logins, list): - url = 'https://knd.mosreg.ru//api/v1/auth/sign_in' + url = "https://knd.mosreg.ru//api/v1/auth/sign_in" for user in logins: session = requests.Session() - login = { - 'email': user['email'], - 'password': user['password'] - } + login = {"email": user["email"], "password": user["password"]} response = session.post(url, data=login) headers = { - 'client': response.headers.get('client'), - 'Access-token': response.headers.get('Access-token'), - 'uid': response.headers.get('uid'), + "client": response.headers.get("client"), + "Access-token": response.headers.get("Access-token"), + "uid": response.headers.get("uid"), } if response.status_code == 200: get_task(session, headers) @@ -263,4 +316,4 @@ if __name__ == "__main__": def random_string(stringLength): letters = string.ascii_letters digits = string.digits - return ''.join(random.choice(letters+digits) for i in range(stringLength)) + return "".join(random.choice(letters + digits) for i in range(stringLength)) diff --git a/knd_dip.py b/knd_dip.py index 3c9de0c..7bdf0fa 100644 --- a/knd_dip.py +++ b/knd_dip.py @@ -46,6 +46,7 @@ def get_task(session, headers): proverka = 'Систематическая проверка подъездов МКД' naled = 'Проверка образования наледи на кровле' dip = 'Осмотр ДИП/ФОП' + s = 'ГЖИ. Системная проверка МКД ' # Получаем адреса addresses = get_addresses(headers['uid']) # Если адреса получили @@ -79,7 +80,7 @@ def get_task(session, headers): # Уже полученные задания print(json_tasks) exec_assigned = json_tasks['executions_assigned'] - # print(exec_assigned) + print(exec_assigned) # Еще не принятые задания exec_available = json_tasks['executions_available'] # print(exec_available) @@ -93,7 +94,8 @@ def get_task(session, headers): address_from_tasks = execution['dimensions'][1].get('entity_value_name') print(address_from_tasks) name_from_tasks = execution['name'] - if name_from_tasks == dip: + # if name_from_tasks == dip: + if name_from_tasks == s: # enterance = execution['dimensions'][2].get('entity_value_name') if address_from_tasks == 'г. Клин, ' + addr.replace("_", "/"): print('\n') @@ -114,6 +116,9 @@ def get_task(session, headers): pass # led.assign_task(session, headers, task, address) elif name_from_tasks == dip: + # osmotr_dip.assign_task(session, headers, task, address) + pass + elif name_from_tasks == s: osmotr_dip.assign_task(session, headers, task, address) else: pass diff --git a/knd_dip2.py b/knd_dip2.py new file mode 100644 index 0000000..26eab8f --- /dev/null +++ b/knd_dip2.py @@ -0,0 +1,162 @@ +import requests +import random +import string +# import json +import datetime +import time +import os +from classes.users import Users +from classes.users_led import Users_led +from classes.users_dip import Users_dip +import classes.desinfection as des +import classes.proverka as prov +import classes.led as led +import classes.dip as osmotr_dip + + +def get_addresses(email): + addresses = [] + # month = datetime.datetime.now().month + main_path = os.path.join(os.path.abspath('.'), 'data_dip') + path = os.walk(os.path.join(main_path, email)) + # if not os.path.exists(os.path.join(main_path, email, str(month))): + # return f"Не найдена папка с месяцем у пользователя {email}! Проверьте \ + # структуру каталога!" + # print(path) + for d, dirs, files in path: + addresses.append(dirs) + if len(addresses[0]) > 0: + return addresses[0] + else: + return f"Ни одного адреса для пользователя {email} не найдено! \ + Добавьте фото и запустите программу снова!" + + +def get_task(session, headers): + """Получаем все доступные задания. Если в переменную search добавить адрес, + то будет искать этот адрес. Он попадет в + json_tasks['executions_available'], + так что надо понять откуда берем задания. Отсюда можно возвращать + все параметры задания: + 1 координаты + 2 адрес + 3 подъезд + 4 id_задания""" + desinfection = 'Дезинфекция подъездов (МОП)' + proverka = 'Систематическая проверка подъездов МКД' + naled = 'Проверка образования наледи на кровле' + dip = 'Осмотр ДИП/ФОП' + s = 'ГЖИ. Системная проверка МКД' + # Получаем адреса + addresses = get_addresses(headers['uid']) + # Если адреса получили + # if isinstance(addresses, list): + session_t = session + session_t.headers.update( + {'referer': 'https://knd.mosreg.ru/executions', + 'x-platform': 'android', + 'accept': '*/*' + } + ) + for address in addresses: + # change '-' for '/' + # need split enterance from address + addr = address.replace("Чаиковского", "Чайковского") + addr = address.replace("Маиданово", "Майданово") + addr = address.replace("Молодежныи", "Молодежный") + addr = addr.replace("Ломоносовскии", "Ломоносовский") + search = addr.replace("_", "/") + # print(search) + data = {'search': search} + tasks = session_t.post('https://knd.mosreg.ru//api/v1/actor/executions', + headers=headers + # data=data + ) + json_tasks = tasks.json() + # print(json_tasks) + # get_t = False + # Если есть доступное задание с таким адресом + # + # Уже полученные задания + # print(json_tasks) + exec_assigned = json_tasks['executions_assigned'] + # print(exec_assigned) + # Еще не принятые задания + exec_available = json_tasks['executions_available'] + # print(exec_available) + # print(address) + if len(exec_assigned) > 0: + # print(len(exec_assigned)) + for n in exec_assigned: + coord = n['coord'] + enterances = n['tasks'] + for execution in enterances: + address_from_tasks = execution['dimensions'][1].get('entity_value_name') + # print(address_from_tasks) + name_from_tasks = execution['name'] + # if name_from_tasks == dip: + # if name_from_tasks == s: + # # enterance = execution['dimensions'][2].get('entity_value_name') + # if address_from_tasks == 'г. Клин, ' + addr.replace("_", "/"): + # print('\n') + # print(name_from_tasks) + # print('\n') + task = { + 'id': execution['execution_id'], + 'address': execution['dimensions'][1].get('entity_value_name'), + 'coord': coord + } + # if name_from_tasks == desinfection: + # # des.assign_task(session, headers, task, address) + # pass + # elif name_from_tasks == proverka: + # pass + # # prov.assign_task(session, headers, task, address) + # elif name_from_tasks == naled: + # pass + # # led.assign_task(session, headers, task, address) + # elif name_from_tasks == dip: + osmotr_dip.assign_task(session, headers, task, address) + # pass + # # elif name_from_tasks == s: + # # osmotr_dip.assign_task(session, headers, task, address) + # else: + # pass + # else: + # print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") + # Если адреса не получили выводим ошибку + # else: + # print(addresses) + + +def main(): + users = Users_dip() + logins = users.get_passwords() + if isinstance(logins, list): + url = 'https://knd.mosreg.ru//api/v1/auth/sign_in' + for user in logins: + session = requests.Session() + login = { + 'email': user['email'], + 'password': user['password'] + } + response = session.post(url, data=login) + headers = { + 'client': response.headers.get('client'), + 'Access-token': response.headers.get('Access-token'), + 'uid': response.headers.get('uid'), + } + if response.status_code == 200: + print(f"Пользователь {user['email']} успешно авторизовался!") + # print(response.headers) + get_task(session, headers) + else: + print(f"Отказ в авторизации для пользователя {user['email']}!") + time.sleep(1) + else: + print(users.get_passwords()) + + +if __name__ == "__main__": + main() + k = input("Press ENTER for exit") diff --git a/knd_kp.py b/knd_kp.py new file mode 100644 index 0000000..ef143de --- /dev/null +++ b/knd_kp.py @@ -0,0 +1,195 @@ +import requests +import random +import string +# import json +import datetime +import time +import os +# from classes.users import Users +# from classes.users_led import Users_led +# from classes.users_dip import Users_dip +from classes.users_kp import Users_kp +import classes.kp as kp +# import classes.desinfection as des +# import classes.proverka as prov +# import classes.led as led +# import classes.dip as osmotr_dip + + +def get_addresses(email): + addresses = [] + # month = datetime.datetime.now().month + main_path = os.path.join(os.path.abspath('.'), 'data_dip') + path = os.walk(os.path.join(main_path, email)) + # if not os.path.exists(os.path.join(main_path, email, str(month))): + # return f"Не найдена папка с месяцем у пользователя {email}! Проверьте \ + # структуру каталога!" + # print(path) + for d, dirs, files in path: + addresses.append(dirs) + if len(addresses[0]) > 0: + return addresses[0] + else: + return f"Ни одного адреса для пользователя {email} не найдено! \ + Добавьте фото и запустите программу снова!" + + +def get_task(session, headers): + """Получаем все доступные задания. Если в переменную search добавить адрес, + то будет искать этот адрес. Он попадет в + json_tasks['executions_available'], + так что надо понять откуда берем задания. Отсюда можно возвращать + все параметры задания: + 1 координаты + 2 адрес + 3 подъезд + 4 id_задания""" + # desinfection = 'Дезинфекция подъездов (МОП)' + # proverka = 'Систематическая проверка подъездов МКД' + # naled = 'Проверка образования наледи на кровле' + # dip = 'Осмотр ДИП/ФОП' + # s = 'ГЖИ. Системная проверка МКД ' + session_t = session + session_t.headers.update( + {'referer': 'https://knd.mosreg.ru/executions', + 'x-platform': 'android', + 'accept': '*/*' + } + ) + tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', + headers=headers + ) + json_tasks = tasks.json() + # print(json_tasks) + + exec_assigned = json_tasks['executions_assigned'] + + if len(exec_assigned) > 0: + for execution in exec_assigned: + coord = execution['coord'] + tasks = execution['tasks'] + for task in tasks: + task_name = task['name'] + print(task_name) + access_task = { + 'id': task['execution_id'], + 'address': task['dimensions'][1].get('entity_value_name'), + 'coord': coord + } + kp.assign_task(session, headers, access_task) + else: + print(f"Нет доступных заданий для пользователя {headers['uid']}!") + + # Получаем адреса + # addresses = get_addresses(headers['uid']) + # # Если адреса получили + # if isinstance(addresses, list): + # session_t = session + # session_t.headers.update( + # {'referer': 'https://knd.mosreg.ru/executions', + # 'x-platform': 'android', + # 'accept': '*/*' + # } + # ) + # for address in addresses: + # # change '-' for '/' + # # need split enterance from address + # addr = address.replace("Чаиковского", "Чайковского") + # addr = address.replace("Маиданово", "Майданово") + # addr = address.replace("Молодежныи", "Молодежный") + # addr = addr.replace("Ломоносовскии", "Ломоносовский") + # search = addr.replace("_", "/") + # # print(search) + # data = {'search': search} + # tasks = session_t.post('https://knd.mosreg.ru//api/v1/actor/executions', + # headers=headers, + # data=data + # ) + # json_tasks = tasks.json() + # # print(json_tasks) + # # get_t = False + # # Если есть доступное задание с таким адресом + # # + # # Уже полученные задания + # print(json_tasks) + # exec_assigned = json_tasks['executions_assigned'] + # print(exec_assigned) + # # Еще не принятые задания + # exec_available = json_tasks['executions_available'] + # # print(exec_available) + # # print(address) + # if len(exec_assigned) > 0: + # # print(len(exec_assigned)) + # for n in exec_assigned: + # coord = n['coord'] + # enterances = n['tasks'] + # for execution in enterances: + # address_from_tasks = execution['dimensions'][1].get('entity_value_name') + # print(address_from_tasks) + # name_from_tasks = execution['name'] + # # if name_from_tasks == dip: + # if name_from_tasks == s: + # # enterance = execution['dimensions'][2].get('entity_value_name') + # if address_from_tasks == 'г. Клин, ' + addr.replace("_", "/"): + # print('\n') + # print(name_from_tasks) + # print('\n') + # task = { + # 'id': execution['execution_id'], + # 'address': execution['dimensions'][1].get('entity_value_name'), + # 'coord': coord + # } + # if name_from_tasks == desinfection: + # # des.assign_task(session, headers, task, address) + # pass + # elif name_from_tasks == proverka: + # pass + # # prov.assign_task(session, headers, task, address) + # elif name_from_tasks == naled: + # pass + # # led.assign_task(session, headers, task, address) + # elif name_from_tasks == dip: + # # osmotr_dip.assign_task(session, headers, task, address) + # pass + # elif name_from_tasks == s: + # osmotr_dip.assign_task(session, headers, task, address) + # else: + # pass + # else: + # print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") + # # Если адреса не получили выводим ошибку + # else: + # print(addresses) + + +def main(): + users = Users_kp() + logins = users.get_passwords() + if isinstance(logins, list): + url = 'https://knd.mosreg.ru//api/v1/auth/sign_in' + for user in logins: + session = requests.Session() + login = { + 'email': user['email'], + 'password': user['password'] + } + response = session.post(url, data=login) + headers = { + 'client': response.headers.get('client'), + 'Access-token': response.headers.get('Access-token'), + 'uid': response.headers.get('uid'), + } + if response.status_code == 200: + print(f"Пользователь {user['email']} успешно авторизовался!") + # print(response.headers) + get_task(session, headers) + else: + print(f"Отказ в авторизации для пользователя {user['email']}!") + time.sleep(1) + else: + print(users.get_passwords()) + + +if __name__ == "__main__": + main() + k = input("Press ENTER for exit") diff --git a/naled.py b/naled.py index 3fff887..60ddbca 100644 --- a/naled.py +++ b/naled.py @@ -1,15 +1,17 @@ -import requests -import random -import string +# import random +# import string # import json -import datetime -import time +# import datetime +# import time import os -from classes.users import Users + +import requests + +# import classes.desinfection as des +# import classes.led as led +# import classes.proverka as prov +# from classes.users import Users from classes.users_led import Users_led -import classes.desinfection as des -import classes.proverka as prov -import classes.led as led def get_addresses(email):