Добавил проверку данных через полимед и подтверждение через код верификации

This commit is contained in:
2024-12-25 01:59:06 +05:00
parent 2ec8a806e6
commit 9ffeab6b3a
4 changed files with 267 additions and 44 deletions
+161 -14
View File
@@ -6,6 +6,8 @@ from oauth2client.service_account import ServiceAccountCredentials
import json
import datetime
from config import config
import requests
# Авторизация Google API
def authorize_google():
@@ -18,27 +20,172 @@ def authorize_google():
client = gspread.authorize(creds)
return client
def find_patients(data):
"""
Поиск пациента в таблице по данным.
"""
sheet = authorize_google().open("Пациенты клиники").sheet1
records = sheet.get_all_records() # Получаем все строки таблицы
for i, record in enumerate(records, start=2): # Нумерация строк Google Таблицы начинается с 2
try:
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():
data = json.loads(request.data)
# {'fio': '', 'tel': '', 'email': '', 'passport': '', 'passport_date': '', 'postal_code': '', 'address': '', 'snils': '', 'inn': '', 'dob': ''}
data['current_time'] = datetime.datetime.now().strftime("%d.%m.%Y, %H:%M")
"""
Обработка данных формы и обновление записи в Google Таблице.
"""
try:
data = json.loads(request.data)
data['current_time'] = datetime.datetime.now().strftime("%d.%m.%Y, %H:%M")
# Авторизация и добавление данных в Google Sheets
sheet = authorize_google().open("Пациенты клиники").sheet1
# Поиск пациента
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)})
sheet.append_row([
data['fio'],
data['tel'],
data['dob'],
data['user_id'], # Записываем Telegram ID пользователя
data['current_time'] # Записываем время отправки данных
])
return jsonify({'success':True})
@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")
# Записываем данные и код верификации в таблицу
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('/')