|
|
|
from flask import abort, request, render_template, url_for, jsonify
|
|
|
|
from webApp import *
|
|
|
|
from webApp import webApp
|
|
|
|
import gspread
|
|
|
|
from oauth2client.service_account import ServiceAccountCredentials
|
|
|
|
import json
|
|
|
|
import datetime
|
|
|
|
from config import config
|
|
|
|
import requests
|
|
|
|
|
|
|
|
|
|
|
|
# Авторизация Google API
|
|
|
|
def authorize_google():
|
|
|
|
# google_json = {}
|
|
|
|
# for key in config["GOOGLE"].keys():
|
|
|
|
# google_json[key] = config["GOOGLE"][key]
|
|
|
|
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
|
|
|
|
creds = ServiceAccountCredentials.from_json_keyfile_name("botforclinic-436512-0c117dd103a8.json", scope)
|
|
|
|
# creds = ServiceAccountCredentials.from_json_keyfile_dict(google_json, scope)
|
|
|
|
client = gspread.authorize(creds)
|
|
|
|
return client
|
|
|
|
|
|
|
|
def find_patients(data):
|
|
|
|
"""
|
|
|
|
Поиск пациента в таблице по данным.
|
|
|
|
"""
|
|
|
|
sheet = authorize_google().open("Пациенты клиники").sheet1
|
|
|
|
records = sheet.get_all_records() # Получаем все строки таблицы
|
|
|
|
print(data)
|
|
|
|
for i, record in enumerate(records, start=2): # Нумерация строк Google Таблицы начинается с 2
|
|
|
|
try:
|
|
|
|
print(str(record.get("Telegram ID", "")).strip(), str(record.get("ФИО", "")).strip().lower(), str(record.get("Дата рождения", "")).strip(), str(record.get("Номер телефона", "")).strip())
|
|
|
|
print(str(data.get("user_id", "")).strip(), str(data.get("fio", "")).strip().lower(), str(data.get("dob", "")).strip(), str(data.get("tel", "")).strip())
|
|
|
|
if (
|
|
|
|
str(record.get("Telegram ID", "")).strip() == str(data.get("user_id", "")).strip() and
|
|
|
|
str(record.get("ФИО", "")).strip().lower() == str(data.get("fio", "")).strip().lower() and
|
|
|
|
str(record.get("Дата рождения", "")).strip() == str(data.get("dob", "")).strip() and
|
|
|
|
str(record.get("Номер телефона", "")).strip() == str(data.get("tel", "")).strip()
|
|
|
|
):
|
|
|
|
return i, record # Возвращаем номер строки и запись
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Ошибка при сравнении записи: {e}")
|
|
|
|
continue
|
|
|
|
|
|
|
|
return None, None
|
|
|
|
|
|
|
|
|
|
|
|
@webApp.route('/form_submit', methods=['POST'])
|
|
|
|
def form_submit():
|
|
|
|
"""
|
|
|
|
Обработка данных формы и обновление записи в Google Таблице.
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
data = json.loads(request.data)
|
|
|
|
data['current_time'] = datetime.datetime.now().strftime("%d.%m.%Y, %H:%M")
|
|
|
|
|
|
|
|
# Поиск пациента
|
|
|
|
row_number, patient_row = find_patients(data)
|
|
|
|
if not patient_row:
|
|
|
|
return jsonify({'success': False, 'error': "Пациент не найден"})
|
|
|
|
|
|
|
|
# Проверка кода верификации
|
|
|
|
expected_code = str(patient_row.get("Верификация", "")).strip()
|
|
|
|
received_code = str(data.get("verification_code", "")).strip()
|
|
|
|
if expected_code != received_code:
|
|
|
|
return jsonify({'success': False, 'error': "Код верификации не совпадает"})
|
|
|
|
|
|
|
|
# Обновление записи в таблице
|
|
|
|
sheet = authorize_google().open("Пациенты клиники").sheet1
|
|
|
|
|
|
|
|
# Определяем динамический столбец по заголовкам
|
|
|
|
headers = sheet.row_values(1)
|
|
|
|
verification_col = headers.index("Верификация") + 1 # Столбцы нумеруются с 1
|
|
|
|
sheet.update_cell(row_number, verification_col, "Пройдена")
|
|
|
|
|
|
|
|
return jsonify({'success': True})
|
|
|
|
|
|
|
|
except KeyError as e:
|
|
|
|
print(f"Ключ отсутствует в данных: {e}")
|
|
|
|
return jsonify({'success': False, 'error': f"Некорректные данные: {e}"})
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Ошибка при обработке формы: {e}")
|
|
|
|
return jsonify({'success': False, 'error': str(e)})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@webApp.route('/tel_verification', methods=['POST'])
|
|
|
|
def send_registration_request():
|
|
|
|
raw_data = json.loads(request.data)
|
|
|
|
print("Полученные данные:", raw_data)
|
|
|
|
"""
|
|
|
|
Блок записи в Полимед
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
HEADER = {
|
|
|
|
"Content-Type": "application/json"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Разделение ФИО на части
|
|
|
|
fio = raw_data.get("fio", "")
|
|
|
|
parts = fio.split(" ")
|
|
|
|
if len(parts) < 3:
|
|
|
|
return jsonify({'success': False, "error": "ФИО должно содержать 3 слова"})
|
|
|
|
|
|
|
|
first_name = parts[1]
|
|
|
|
middle_name = " ".join(parts[2:])
|
|
|
|
last_name = parts[0]
|
|
|
|
|
|
|
|
# Обработка номера телефона
|
|
|
|
raw_phone = raw_data.get("tel", "")
|
|
|
|
formatted_phone = ''.join(filter(str.isdigit, raw_phone))
|
|
|
|
if formatted_phone.startswith("7"):
|
|
|
|
formatted_phone = formatted_phone
|
|
|
|
|
|
|
|
# Обработка даты рождения
|
|
|
|
dob = raw_data.get("dob", "")
|
|
|
|
if not dob:
|
|
|
|
return jsonify({'success': False, "error": "Дата рождения отсутствует"})
|
|
|
|
birth_year = dob.split("-")[0] # Предполагается формат "YYYY-MM-DD"
|
|
|
|
|
|
|
|
# Данные для отправки в сервер Полимед
|
|
|
|
data = {
|
|
|
|
"telegram_id": raw_data.get("user_id"),
|
|
|
|
"first_name": first_name,
|
|
|
|
"second_name": middle_name,
|
|
|
|
"last_name": last_name,
|
|
|
|
"mobile_phone": formatted_phone,
|
|
|
|
"birthday": birth_year
|
|
|
|
}
|
|
|
|
|
|
|
|
print("Отправляемые данные на сервер:", data)
|
|
|
|
response = requests.post("http://46.146.229.242:1980/AppFindPac", headers=HEADER, json=data)
|
|
|
|
|
|
|
|
if response.status_code == 200:
|
|
|
|
result = response.json()
|
|
|
|
print("Результат JSON:", result)
|
|
|
|
if result.get('ok'):
|
|
|
|
return jsonify({'success': False, "error": "Пользователь уже существует"})
|
|
|
|
else:
|
|
|
|
print(f"Ошибка при отправке данных. Статус-код: {response.status_code}")
|
|
|
|
return jsonify({'success': False, "error": "Ошибка отправки данных в Полимед"})
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Ошибка обработки данных для Полимед: {e}")
|
|
|
|
return jsonify({'success': False, "error": "Ошибка обработки данных для Полимед"})
|
|
|
|
|
|
|
|
"""
|
|
|
|
Блок верификации через SMS
|
|
|
|
"""
|
|
|
|
try:
|
|
|
|
url = "https://sms.ru/code/call"
|
|
|
|
api_key = "2ED72E61-76C8-5637-3587-2792D47B698C"
|
|
|
|
|
|
|
|
# Отправка запроса на вызов с кодом верификации
|
|
|
|
response = requests.post(url, data={"phone": formatted_phone, "api_id": api_key})
|
|
|
|
json_data = response.json()
|
|
|
|
|
|
|
|
verification_code = None
|
|
|
|
current_time = datetime.datetime.now().strftime("%d.%m.%Y, %H:%M")
|
|
|
|
|
|
|
|
# Авторизация и доступ к таблице
|
|
|
|
sheet = authorize_google().open("Пациенты клиники").sheet1
|
|
|
|
|
|
|
|
# Проверка успешного получения кода
|
|
|
|
if json_data and json_data["status"] == "OK":
|
|
|
|
verification_code = json_data.get("code")
|
|
|
|
|
|
|
|
# Поиск пациента
|
|
|
|
row_number, patient_row = find_patients(raw_data)
|
|
|
|
print(row_number, patient_row)
|
|
|
|
if patient_row:
|
|
|
|
# Обновление записи в таблице
|
|
|
|
sheet = authorize_google().open("Пациенты клиники").sheet1
|
|
|
|
|
|
|
|
# Определяем динамический столбец по заголовкам
|
|
|
|
headers = sheet.row_values(1)
|
|
|
|
verification_col = headers.index("Верификация") + 1 # Столбцы нумеруются с 1
|
|
|
|
sheet.update_cell(row_number, verification_col, verification_code)
|
|
|
|
|
|
|
|
else:
|
|
|
|
# Записываем данные и код верификации в таблицу
|
|
|
|
sheet.append_row([
|
|
|
|
fio,
|
|
|
|
raw_phone,
|
|
|
|
dob,
|
|
|
|
raw_data.get("user_id"), # Telegram ID пользователя
|
|
|
|
current_time, # Время отправки данных
|
|
|
|
verification_code # Код верификации
|
|
|
|
])
|
|
|
|
print(f"Код верификации, отправленный пользователю: {verification_code}")
|
|
|
|
|
|
|
|
return jsonify({'success': True})
|
|
|
|
else:
|
|
|
|
print("Звонок не может быть выполнен.")
|
|
|
|
print("Текст ошибки:", json_data.get("status_text"))
|
|
|
|
return jsonify({'success': False, "error": "Ошибка вызова через SMS.ru"})
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
print(f"Ошибка при обработке SMS верификации: {e}")
|
|
|
|
return jsonify({'success': False, "error": "Ошибка при обработке SMS верификации"})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@webApp.route('/')
|
|
|
|
def main_page_2_0():
|
|
|
|
return render_template('2.0/main_page.pug', user_id=request.args.get('user_id', None))
|