knd_klinteplo/knd_bot.py

293 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import requests
import random
import string
import json
import datetime
import time
import os
from classes.users import Users
# anwer_text = '{"question_chains":[{"id":6145,"questions":[{"id":6559,"question_components":[{"id":18850,"answer":[80634165],"answer_status":null,"end_time":1591866979,"start_time":1591866978},{"id":18851,"answer":{"location":[56.439337,36.557897]},"answer_status":null,"start_time":1591866873,"end_time":1591867165},{"id":18852,"answer":"1","answer_status":null,"start_time":1591867063,"end_time":1591867063}]}]},{"id":6147,"questions":[{"id":6561,"question_components":[{"id":18856,"answer":77,"answer_status":null,"end_time":1591867067,"start_time":1591867067},{"id":18857,"answer":[80639138],"answer_status":null,"end_time":1591867186,"start_time":1591867185}]}]},{"id":6147,"questions":[{"id":6561,"question_components":[{"id":18856,"answer":77,"answer_status":null,"end_time":1591867200,"start_time":1591867200},{"id":18857,"answer":[80639640],"answer_status":null,"end_time":1591867206,"start_time":1591867205}]}]},{"id":6147,"questions":[{"id":6561,"question_components":[{"id":18856,"answer":77,"answer_status":null,"end_time":1591867211,"start_time":1591867211},{"id":18857,"answer":[80640010],"answer_status":null,"end_time":1591867220,"start_time":1591867219}]}]},{"id":6147,"questions":[{"id":6561,"question_components":[{"id":18856,"answer":77,"answer_status":null,"end_time":1591867223,"start_time":1591867223},{"id":18857,"answer":[80640333],"answer_status":null,"end_time":1591867233,"start_time":1591867232}]}]}]}'
# anwer_text = '{"question_chains":[{"id":6145,"questions":[{"id":6559,"question_components":[]}]},{"id":6147,"questions":[{"id":6561,"question_components":[]}]},{"id":6147,"questions":[{"id":6561,"question_components":[]}]},{"id":6147,"questions":[{"id":6561,"question_components":[]}]},{"id":6147,"questions":[{"id":6561,"question_components":[]}]}]}'
# question_text = ''
#def get_enterance_and_coord(session, headers, execution_id):
# photo_id = send_image(session, headers, execution_id)
# pass
def send_execution(task, session, headers):
# answers_for_data = [{"id":6145,"questions":[{"id":6559,"question_components":[{"id":18850,"answer":[80634165],"answer_status":null,"end_time":1591866979,"start_time":1591866978},{"id":18851,"answer":{"location":[56.439337,36.557897]},"answer_status":null,"start_time":1591866873,"end_time":1591867165}]}]}]
# print(task)
# print(time.ctime(1592235230))
string1 = '{"id":6145,"questions":[{"id":6559,"question_components":[{"id":18850,"answer":[80634165],"answer_status":null,"end_time":1591866979,"start_time":1591866978},{"id":18851,"answer":{"location":[56.439337,36.557897]},"answer_status":null,"start_time":1591866873,"end_time":1591867165},{"id":18852,"answer":"1","answer_status":null,"start_time":1591867063,"end_time":1591867063}]}]}'
# get_questions(task.get('id'), session, headers)
print(json.dumps(json.loads(string1), indent=4))
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 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)
return img.json()
# print(img.headers)
# print(img.text)
# print(img.status_code)
def complete_task(session, headers, task, address):
photos = get_photo(address, headers['uid'])
if len(photos) > 0:
photos.sort()
questions = get_questions(task['id'], session, headers)
data = []
for answers in questions:
answer_chain = {
'id': answers['id'],
'questions': []#answers['questions']
}
if answer_chain['id'] == 6146: # Цепочка без ответов
continue
for components in answers['questions']:
comp = []
q_c = {
'id': components['id'],
'question_components': []
}
if q_c['id'] == 6560: # Вопрос без ответа
continue
comp.append(q_c)
answer_chain.update({'questions': comp})
data.append(answer_chain)
if len(data) == len(photos):
print('1')
for chain in data:
for item in chain['questions']:
if len(data) == len(photos):
img = send_image(session, headers, task['id'], photos.pop(0))
first = {"id": 18850, "answer": [img['id']], 'start_time': int(time.time())}
time.sleep(2)
first.update({'end_time': int(time.time())})
second = {"id": 18851, "answer": {"location": task['coord']}}
item['question_components'].append(first)
item['question_components'].append(second)
else:
img = send_image(session, headers, task['id'], photos.pop(0))
first = {"id": 18856, "answer": 77}
second = {"id": 18857, "answer": [img['id']]}
item['question_components'].append(first)
item['question_components'].append(second)
print(data)
else:
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)
if not os.path.exists(main_path):
return photos
else:
for images in os.listdir(main_path):
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')
path = os.walk(os.path.join(main_path, email, str(month)))
for d, dirs, files in path:
addresses.append(dirs)
if len(addresses[0]) > 0:
return addresses[0]
else:
return f"Ни одного адреса для пользователя {email} не найдено! Добавьте фото и запустите программу снова!"
def assign_task(session, headers, task, address):
complete_task(session, headers, task, address)
# DON'T START PROGRAM!!!!
#task = session.put('https://knd.mofsreg.ru//api/v1/executions/'+str(task['id'])+'/assign', headers=headers)
#if task.status_code == 200:
# pass
#else:
# print(f"Не смогли получить задание {task['id']}!")
def get_task(session, headers):
"""Получаем все доступные задания. Если в переменную search добавить адрес,
то будет искать этот адрес. Он попадет в
json_tasks['executions_available'],
так что надо понять откуда берем задания. Отсюда можно возвращать
все параметры задания:
1 координаты
2 адрес
3 подъезд
4 id_задания"""
# Получаем адреса
addresses = get_addresses(headers['uid'])
# Если адреса получили
if isinstance(addresses, list):
session_t = session
session_t.headers.update(
{'referer': 'https://knd.mosreg.ru/executions',
'x-platform': 'wb',
'accept': '*/*'
}
)
for address in addresses:
# need split enterance from address
search = 'Майданово п, Радищева ул, 73'#address[:-4]
print(search)
data = {'search': search}
tasks = session_t.post('https://knd.mosreg.ru//api/v1/executions',
headers=headers,
data=data
)
json_tasks = tasks.json()
# Если есть доступное задание с таким адресом
if len(json_tasks['executions_available']) > 0:
for n in json_tasks['executions_available']:
coord = n['coord']
enterances = n['tasks']
for execution in enterances:
task = {
'id': execution['execution_id'],
'address': execution['dimensions'][0].get('entity_value_name'),
'enterance': execution['dimensions'][2].get('entity_value_name'),
'coord': coord
}
# Принимаем задание
if task['enterance'] == address[-2]:
assign_task(session, headers, task, address)
else:
print(f"Нет доступных заданий для по адресу: {address}!")
# Если нет задания с таким адресом
else:
print(f"Нет доступных заданий для пользователя {headers['uid']} по адресу: {address}")
# Если адреса не получили выводим ошибку
else:
print(addresses)
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:
task = {
'id': 23607882,
'address': 'Решетниково рп, ОПМС-1 проезд, 13',
'enterance': 6,
'coord': [56.442503, 36.5596493]
}
address = 'Решетниково рп, ОПМС-1 проезд, 13, 6п'
assign_task(session, headers, task, address)
break
# get_task(session, headers)
else:
print(f"Отказ в авторизации для пользователя {user['email']}!")
time.sleep(1)
else:
print(users.get_passwords())
if __name__ == "__main__":
main()
# headers = response.headers
# print(item[0]['tasks'])
# print(len(item[3]['tasks']))
# print(item[3]['coord'])
# count = 0
# for item in json_exec.get('executions_assigned'):
# print(item['tasks'])
# if count < 1:
# # for n in item['tasks']:
# # print(n['dimensions'])
# count = count + 1
# for task in item.get('tasks'):
# pass
# send_image(session, headers, "some")
# get_coord(str1)
# get_answers(session, headers)
# get_questions(session, headers)
# print(executions.text)
def random_string(stringLength):
letters = string.ascii_letters
digits = string.digits
return ''.join(random.choice(letters+digits) for i in range(stringLength))
# def get_coord(address):
# url = 'https://geocode-maps.yandex.ru/1.x/?format=json&apikey=591be3ec-2816-40ee-b575-08e687d27b37&geocode='+address
# coord = requests.get(url)
# print(coord.text)
# def get_task(session, task_id, headers):
# task = session.get('https://knd.mosreg.ru//api/v1/executions/', headers=headers)
# json_task = task.json()
# print(json_task)
# def get_answers(session, headers):
# answers = session.post('https://knd.mosreg.ru//api/v1/executions/22515485/answers', headers=headers)
# json_answers = answers.json()
# for ans in json_answers.get('question_chains'):
# print(ans)
# # print(json_answers)
# def get_questions(session, headers):
# question = session.get('https://knd.mosreg.ru//api/v1/executions/22515485/questions', headers=headers)
# json_question = question.json()
# for s in json_question['selected_chains']:
# for n in s['questions']:
# print(n['question_components'])