diff --git a/classes/desinfection.py b/classes/desinfection.py index 874012e..610eb91 100644 --- a/classes/desinfection.py +++ b/classes/desinfection.py @@ -36,7 +36,7 @@ def complete_task(session, headers, task, address): session_t.headers.update( { 'referer': 'https://knd.mosreg.ru/executions'+str(task['id'])+'/solve', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) diff --git a/classes/led.py b/classes/led.py new file mode 100644 index 0000000..b4f492b --- /dev/null +++ b/classes/led.py @@ -0,0 +1,130 @@ +import os +import datetime +import time +from natsort import natsorted + + +def assign_task(session, headers, task, address): + # print('assign_task') + 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) + """В папке лежит фото графика, которое отправляется из модуля 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) + 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_led', email, 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) + 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['selected_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": 77, "answer_status": None, "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']}, "answer_status": None, \ + "start_time": int(time.time())} + time.sleep(2) + data.update({"end_time": int(time.time())}) + question_components.append(data) + elif question_type == "gallery": + img = send_image(session, headers, task['id'], photos.pop(0))#photos.pop(0)) + data = {"id": third_chain['id'], "answer": [img['id']], "answer_status": None, \ + "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/proverka.py b/classes/proverka.py index dc995e0..3bdd94a 100644 --- a/classes/proverka.py +++ b/classes/proverka.py @@ -35,7 +35,7 @@ def complete_task(session, headers, task, address): session_t.headers.update( { 'referer': 'https://knd.mosreg.ru/executions'+str(task['id'])+'/solve', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) diff --git a/classes/users_led.py b/classes/users_led.py new file mode 100644 index 0000000..54d6070 --- /dev/null +++ b/classes/users_led.py @@ -0,0 +1,27 @@ +import os + + +class Users_led: + def __init__(self): + self.data = [] + self.path = os.path.join(os.path.abspath('.'), 'data_led') + + def get_users(self): + 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_17@check.mo/img_5.txt b/data/5020051404_17@check.mo/img_5.txt new file mode 100644 index 0000000..05d335a --- /dev/null +++ b/data/5020051404_17@check.mo/img_5.txt @@ -0,0 +1,3 @@ +Чернов Александр Алексеевич +мастер РЭУ +8(910)484-22-20 \ No newline at end of file diff --git a/data/5020051404_17@check.mo/new_template.docx b/data/5020051404_17@check.mo/new_template.docx new file mode 100644 index 0000000..b9c27ba Binary files /dev/null and b/data/5020051404_17@check.mo/new_template.docx differ diff --git a/data/5020051404_17@check.mo/pass.txt b/data/5020051404_17@check.mo/pass.txt new file mode 100644 index 0000000..df86387 --- /dev/null +++ b/data/5020051404_17@check.mo/pass.txt @@ -0,0 +1 @@ +kn7687 \ No newline at end of file diff --git a/data/5020051404_17@check.mo/template.docx b/data/5020051404_17@check.mo/template.docx new file mode 100644 index 0000000..a3fe76f Binary files /dev/null and b/data/5020051404_17@check.mo/template.docx differ diff --git a/data/5020051404_17@check.mo/template_lift.docx b/data/5020051404_17@check.mo/template_lift.docx new file mode 100644 index 0000000..534c15a Binary files /dev/null and b/data/5020051404_17@check.mo/template_lift.docx differ diff --git a/data/domreshetnikovo@gmail.com/img_5.txt b/data/domreshetnikovo@gmail.com/img_5.txt new file mode 100644 index 0000000..00069bf --- /dev/null +++ b/data/domreshetnikovo@gmail.com/img_5.txt @@ -0,0 +1,3 @@ +Калякина Людмила Николаевна +начальник РЭУ +8(985)574-78-30 \ No newline at end of file diff --git a/data/domreshetnikovo@gmail.com/new_template.docx b/data/domreshetnikovo@gmail.com/new_template.docx new file mode 100644 index 0000000..772689e Binary files /dev/null and b/data/domreshetnikovo@gmail.com/new_template.docx differ diff --git a/data/domreshetnikovo@gmail.com/pass.txt b/data/domreshetnikovo@gmail.com/pass.txt new file mode 100644 index 0000000..458b6fb --- /dev/null +++ b/data/domreshetnikovo@gmail.com/pass.txt @@ -0,0 +1 @@ +kn2001 diff --git a/data/domreshetnikovo@gmail.com/template.docx b/data/domreshetnikovo@gmail.com/template.docx new file mode 100644 index 0000000..f97f824 Binary files /dev/null and b/data/domreshetnikovo@gmail.com/template.docx differ diff --git a/data/domreshetnikovo@gmail.com/template_lift.docx b/data/domreshetnikovo@gmail.com/template_lift.docx new file mode 100644 index 0000000..02b561a Binary files /dev/null and b/data/domreshetnikovo@gmail.com/template_lift.docx differ diff --git a/data/saunkina2020@mail.ru/pass.txt b/data/saunkina2020@mail.ru/pass.txt new file mode 100644 index 0000000..9786c4f --- /dev/null +++ b/data/saunkina2020@mail.ru/pass.txt @@ -0,0 +1 @@ +kn4221 \ No newline at end of file diff --git a/des.py b/des.py index 5360369..521c3eb 100644 --- a/des.py +++ b/des.py @@ -87,7 +87,7 @@ def get_task(session, headers): session_t = session session_t.headers.update( {'referer': 'https://knd.mosreg.ru/executions', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) @@ -99,7 +99,7 @@ def get_task(session, headers): search = addr.replace("_", "/")[:-4] # print(search) data = {'search': search} - tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', + tasks = session_t.post('https://knd.mosreg.ru//api/v1/actor/executions', headers=headers, data=data ) @@ -109,8 +109,10 @@ def get_task(session, headers): # # Уже полученные задания exec_assigned = json_tasks['executions_assigned'] + print(exec_assigned) # Еще не принятые задания exec_available = json_tasks['executions_available'] + print(exec_available) # print(address) if len(exec_available) > 0: for n in exec_available: diff --git a/des_assigned.py b/des_assigned.py index b17cfd5..0fc0937 100644 --- a/des_assigned.py +++ b/des_assigned.py @@ -172,7 +172,7 @@ def get_task(session, headers): session_t = session session_t.headers.update( {'referer': 'https://knd.mosreg.ru/executions', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) @@ -184,7 +184,7 @@ def get_task(session, headers): search = addr.replace("_", "/")[:-4] # print(search) data = {'search': search} - tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', + tasks = session_t.post('https://knd.mosreg.ru//api/v1/actor/executions', headers=headers, data=data ) diff --git a/knd_bot.py b/knd_bot.py index feea27d..c2c3f95 100644 --- a/knd_bot.py +++ b/knd_bot.py @@ -172,7 +172,7 @@ def get_task(session, headers): session_t = session session_t.headers.update( {'referer': 'https://knd.mosreg.ru/executions', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) @@ -183,6 +183,7 @@ def get_task(session, headers): addr = address.replace("Маиданово", "Майданово") search = addr.replace("_", "/")[:-4] # print(search) + # search = "" data = {'search': search} tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', headers=headers, diff --git a/knd_bot_assigned.py b/knd_bot_assigned.py index 24bc85a..e376ce9 100644 --- a/knd_bot_assigned.py +++ b/knd_bot_assigned.py @@ -168,11 +168,12 @@ def get_task(session, headers): # Получаем адреса addresses = get_addresses(headers['uid']) # Если адреса получили + # {"filters":[{"value":{"distance":"50000","lat":55.81999969482422,"lon":37.380001068115234},"filter_attribute":10,"id":6,"name":"Локация","type":"distance"}]} if isinstance(addresses, list): session_t = session session_t.headers.update( {'referer': 'https://knd.mosreg.ru/executions', - 'x-platform': 'wb', + 'x-platform': 'android', 'accept': '*/*' } ) @@ -183,8 +184,18 @@ def get_task(session, headers): addr = address.replace("Маиданово", "Майданово") search = addr.replace("_", "/")[:-4] # print(search) + # data = {'search': search, + # 'filters': [{'value':{ + # 'distance': 25000, + # 'lat': 55.81999969482422, + # 'lon': 37.380001068115234 + # }, + # 'filter_attribute': 10, + # 'id': 6, + # 'name': 'Локация', + # 'type': 'distance'}]} data = {'search': search} - tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', + tasks = session_t.post('https://knd.mosreg.ru//api/v1/actor/executions', headers=headers, data=data ) @@ -192,7 +203,9 @@ def get_task(session, headers): get_t = False # Если есть доступное задание с таким адресом 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: for n in exec_assigned: diff --git a/knd_dip.py b/knd_dip.py new file mode 100644 index 0000000..a313c84 --- /dev/null +++ b/knd_dip.py @@ -0,0 +1,60 @@ +import requests +import random +import string +# import json +import datetime +import time +import os +from classes.users import Users +import classes.desinfection as des +import classes.proverka as prov + + +def get_task(session, headers): + session_t = session + session_t.headers.update( + {'referer': 'https://knd.mosreg.ru/executions', + 'x-platform': 'wb', + 'accept': '*/*' + } + ) + # data = {'actualities': [0,2,10]} + # data = {'search': 234} + data = {"issue_type_filters":[{"id":314,"name":"Благоустройство - снэпшот","filters":[]}]} + tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions', + headers=headers, + data=data + ) + json_tasks = tasks.json() + print(json_tasks) + + +def main(): + users = Users() + 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: + 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 new file mode 100644 index 0000000..94893ca --- /dev/null +++ b/naled.py @@ -0,0 +1,145 @@ +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 +import classes.desinfection as des +import classes.proverka as prov +import classes.led as led + + +def get_addresses(email): + addresses = [] + # month = datetime.datetime.now().month + main_path = os.path.join(os.path.abspath('.'), 'data_led') + 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 = 'Проверка образования наледи на кровле' + # Получаем адреса + 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("Маиданово", "Майданово") + 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() + # get_t = False + # Если есть доступное задание с таким адресом + # + # Уже полученные задания + 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: + for n in exec_assigned: + coord = n['coord'] + enterances = n['tasks'] + for execution in enterances: + address_from_tasks = execution['dimensions'][0].get('entity_value_name') + # print(address_from_tasks) + name_from_tasks = execution['name'] + if name_from_tasks == naled: + 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'][0].get('entity_value_name'), + 'enterance': execution['dimensions'][2].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: + led.assign_task(session, headers, task, address) + else: + pass + else: + print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}") + # Если адреса не получили выводим ошибку + else: + print(addresses) + + +def main(): + users = Users_led() + 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: + 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")