@ -6,6 +6,8 @@ from oauth2client.service_account import ServiceAccountCredentials
import json
import json
import datetime
import datetime
from config import config
from config import config
import requests
# Авторизация Google API
# Авторизация Google API
def authorize_google ( ) :
def authorize_google ( ) :
@ -18,27 +20,172 @@ def authorize_google():
client = gspread . authorize ( creds )
client = gspread . authorize ( creds )
return client
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 ' ] )
@webApp . route ( ' /form_submit ' , methods = [ ' POST ' ] )
def form_submit ( ) :
def form_submit ( ) :
"""
Обработка данных формы и обновление записи в Google Таблице .
"""
try :
data = json . loads ( request . data )
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 " )
data [ ' current_time ' ] = datetime . datetime . now ( ) . strftime ( " %d . % m. % Y, % H: % M " )
# Авторизация и добавление данных в Google Sheets
# Поиск пациента
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
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 " )
# Записываем данные и код верификации в таблицу
sheet . append_row ( [
sheet . append_row ( [
data [ ' fio ' ] ,
fio ,
data [ ' tel ' ] ,
raw_phone ,
data [ ' dob ' ] ,
dob ,
data [ ' user_id ' ] , # Записываем Telegram ID пользователя
raw_data . get ( " user_id " ) , # Telegram ID пользователя
data [ ' current_time ' ] # Записываем время отправки данных
current_time , # Время отправки данных
verification_code # Код верификации
] )
] )
print ( f " Код верификации, отправленный пользователю: { verification_code } " )
return jsonify ( { ' success ' : True } )
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 ( ' / ' )
@webApp . route ( ' / ' )