Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -624,13 +624,106 @@ DATABASE_NAME = 'data_gc.db'
|
|
| 624 |
|
| 625 |
|
| 626 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 627 |
|
| 628 |
|
| 629 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 630 |
conn = sqlite3.connect(db_name)
|
| 631 |
cursor = conn.cursor()
|
| 632 |
|
| 633 |
-
# Получение email пользователя из данных
|
| 634 |
email = user_data.get('email')
|
| 635 |
if not email:
|
| 636 |
logging.error(f"User data missing email: {user_data}")
|
|
@@ -638,25 +731,20 @@ def update_or_insert_user(db_name, user_data, mapping_template):
|
|
| 638 |
|
| 639 |
logging.debug(f"Processing user with email: {email}")
|
| 640 |
|
| 641 |
-
# Проверка существования пользователя в базе данных по email
|
| 642 |
cursor.execute("SELECT web_st, b_mess FROM contacts WHERE email = ?", (email,))
|
| 643 |
user = cursor.fetchone()
|
| 644 |
logging.debug(f"User found: {user}")
|
| 645 |
|
| 646 |
-
|
| 647 |
-
|
| 648 |
-
current_messages = "" # Инициализация текущих сообщений
|
| 649 |
if user:
|
| 650 |
-
# Проверка текущего значения web_st и его инкрементация
|
| 651 |
current_web_st = user[0] if user[0] is not None and user[0] != "" else 0
|
| 652 |
web_st_value = int(current_web_st) + 1
|
| 653 |
logging.debug(f"Calculated web_st_value: {web_st_value}")
|
| 654 |
|
| 655 |
-
# Получение текущих сообщений
|
| 656 |
current_messages = user[1] if user[1] is not None else ""
|
| 657 |
logging.debug(f"Current messages: {current_messages}")
|
| 658 |
|
| 659 |
-
# Обновление значения web_st
|
| 660 |
cursor.execute("UPDATE contacts SET web_st = ? WHERE email = ?", (web_st_value, email))
|
| 661 |
conn.commit()
|
| 662 |
conn.close()
|
|
@@ -665,19 +753,16 @@ def update_or_insert_user(db_name, user_data, mapping_template):
|
|
| 665 |
conn.close()
|
| 666 |
logging.debug(f"User {email} not found, proceeding with insert")
|
| 667 |
|
| 668 |
-
# Открываем соединение снова для остальных операций
|
| 669 |
conn = sqlite3.connect(db_name)
|
| 670 |
cursor = conn.cursor()
|
| 671 |
|
| 672 |
-
# Преобразование данных пользователя на основе шаблона сопоставления
|
| 673 |
transformed_data = {}
|
| 674 |
-
for json_key, db_column in
|
| 675 |
value = user_data.get(json_key, "")
|
| 676 |
|
| 677 |
if isinstance(value, list):
|
| 678 |
-
# Проверяем тип элементов списка
|
| 679 |
if all(isinstance(item, str) for item in value):
|
| 680 |
-
transformed_data[db_column] = "; ".join(value)
|
| 681 |
else:
|
| 682 |
logging.error(f"Expected list of strings for key {json_key}, but got: {value}")
|
| 683 |
transformed_data[db_column] = ""
|
|
@@ -685,61 +770,55 @@ def update_or_insert_user(db_name, user_data, mapping_template):
|
|
| 685 |
transformed_data[db_column] = str(value)
|
| 686 |
logging.debug(f"Transformed data: {transformed_data}")
|
| 687 |
|
| 688 |
-
|
| 689 |
-
|
| 690 |
-
|
| 691 |
-
|
| 692 |
-
|
| 693 |
-
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
|
| 697 |
-
|
| 698 |
-
|
| 699 |
-
|
| 700 |
-
|
| 701 |
-
|
| 702 |
-
|
| 703 |
-
|
| 704 |
-
|
| 705 |
-
transformed_data
|
| 706 |
-
|
| 707 |
-
|
| 708 |
-
|
| 709 |
-
|
| 710 |
-
|
| 711 |
-
|
| 712 |
-
|
| 713 |
-
|
| 714 |
-
transformed_data
|
| 715 |
-
|
| 716 |
-
transformed_data
|
| 717 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 718 |
|
| 719 |
-
# Обновление данных пользователя в базе данных
|
| 720 |
-
if user:
|
| 721 |
-
update_query = "UPDATE contacts SET "
|
| 722 |
-
update_values = []
|
| 723 |
-
for column, value in transformed_data.items():
|
| 724 |
-
update_query += f"{column} = ?, "
|
| 725 |
-
update_values.append(value)
|
| 726 |
-
update_query = update_query.rstrip(", ") + " WHERE email = ?"
|
| 727 |
-
update_values.append(email)
|
| 728 |
-
logging.debug(f"Update query: {update_query} with values: {update_values}")
|
| 729 |
-
cursor.execute(update_query, update_values)
|
| 730 |
-
else:
|
| 731 |
-
columns = ', '.join(transformed_data.keys())
|
| 732 |
-
placeholders = ', '.join('?' for _ in transformed_data)
|
| 733 |
-
insert_query = f"INSERT INTO contacts ({columns}) VALUES ({placeholders})"
|
| 734 |
-
insert_values = list(transformed_data.values())
|
| 735 |
-
logging.debug(f"Insert query: {insert_query} with values: {insert_values}")
|
| 736 |
-
cursor.execute(insert_query, insert_values)
|
| 737 |
-
|
| 738 |
-
# Подтверждение изменений и закрытие соединения
|
| 739 |
conn.commit()
|
| 740 |
conn.close()
|
| 741 |
logging.debug(f"User with email {email} processed successfully")
|
| 742 |
|
|
|
|
|
|
|
| 743 |
|
| 744 |
@app.route('/send_request', methods=['POST'])
|
| 745 |
def send_request():
|
|
@@ -757,9 +836,6 @@ def send_request():
|
|
| 757 |
else:
|
| 758 |
return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code
|
| 759 |
|
| 760 |
-
|
| 761 |
-
|
| 762 |
-
|
| 763 |
@app.route('/send_get_request', methods=['GET'])
|
| 764 |
def send_get_request():
|
| 765 |
token = request.args.get('token')
|
|
@@ -768,17 +844,15 @@ def send_get_request():
|
|
| 768 |
|
| 769 |
try:
|
| 770 |
response = requests.get(url, headers={'X-Token': token})
|
| 771 |
-
response.raise_for_status()
|
| 772 |
data = response.json()
|
| 773 |
|
| 774 |
-
# Убедитесь, что report существует в данных
|
| 775 |
if data is None or 'report' not in data:
|
| 776 |
return jsonify({'error': 'No report data found'}), 500
|
| 777 |
|
| 778 |
report = data.get('report', {})
|
| 779 |
messages = data.get('messages', {})
|
| 780 |
|
| 781 |
-
# Проверка на None перед использованием
|
| 782 |
if report is None:
|
| 783 |
return jsonify({'error': 'No report data found in the response'}), 500
|
| 784 |
|
|
@@ -810,9 +884,6 @@ def send_get_request():
|
|
| 810 |
except requests.exceptions.RequestException as e:
|
| 811 |
return jsonify({'error': f'API request failed: {str(e)}'}), 500
|
| 812 |
|
| 813 |
-
|
| 814 |
-
|
| 815 |
-
|
| 816 |
@app.route('/webhookbz', methods=['POST'])
|
| 817 |
def webhookbz():
|
| 818 |
api_sys_control = request.args.get('api_sys')
|
|
@@ -875,6 +946,11 @@ def webhookbz():
|
|
| 875 |
|
| 876 |
|
| 877 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 878 |
|
| 879 |
|
| 880 |
|
|
|
|
| 624 |
|
| 625 |
|
| 626 |
|
| 627 |
+
# URL Google Формы как переменная
|
| 628 |
+
GOOGLE_FORM_URL = (
|
| 629 |
+
"https://docs.google.com/formResponse/d/e/1FAIpQLSc-JbmXvgpgGq6KrkXsYSsfMACVMyIDnNqrHy6jImGeSRcpiQ/formResponse"
|
| 630 |
+
"?usp=pp_url&entry.1556100878={name}&entry.1477412341={email}&entry.1634985541={phone}&entry.1736544219={vk_id}"
|
| 631 |
+
"&entry.62153872={chat_id}&entry.1913752768={ws_st}&entry.1768186232={ws_stop}&entry.1198983592={web_st}"
|
| 632 |
+
"&entry.994770784={fin_prog}&entry.910932310={b_city}&entry.1923801792={b_fin}&entry.2005444720={b_ban}"
|
| 633 |
+
"&entry.741087361={b_ign}&entry.1316159837={b_baners}&entry.355123557={b_butt}&entry.395996312={b_mess}"
|
| 634 |
+
"&entry.646571729={shop_st}&entry.578527800={curator}&entry.1936838964={pr1}&entry.1375537366={pr2}"
|
| 635 |
+
"&entry.1249356084={pr3}&entry.752547226={pr4}&entry.704766458={pr5}&entry.1837661={gc_url}&entry.398837750={key_pr}"
|
| 636 |
+
"&entry.225564240={n_con}&entry.1642320872={canal}&entry.1581826411={data_t}&entry.311131724={utm_source}"
|
| 637 |
+
"&entry.1904279859={utm_medium}&entry.740234546={utm_campaign}&entry.880981295={utm_term}&entry.431306383={utm_content}"
|
| 638 |
+
)
|
| 639 |
+
|
| 640 |
+
# Определяем шаблон для маппинга
|
| 641 |
+
mapping_template_log = {
|
| 642 |
+
'name': 'name',
|
| 643 |
+
'email': 'email',
|
| 644 |
+
'phone': 'phone',
|
| 645 |
+
'vk_id': 'vk_id',
|
| 646 |
+
'chat_id': 'chat_id',
|
| 647 |
+
'ws_st': 'ws_st',
|
| 648 |
+
'ws_stop': 'ws_stop',
|
| 649 |
+
'web_st': 'web_st',
|
| 650 |
+
'fin_prog': 'fin_prog',
|
| 651 |
+
'b_city': 'b_city',
|
| 652 |
+
'b_fin': 'b_fin',
|
| 653 |
+
'b_ban': 'b_ban',
|
| 654 |
+
'b_ign': 'b_ign',
|
| 655 |
+
'b_baners': 'b_baners',
|
| 656 |
+
'b_butt': 'b_butt',
|
| 657 |
+
'b_mess': 'b_mess',
|
| 658 |
+
'shop_st': 'shop_st',
|
| 659 |
+
'curator': 'curator',
|
| 660 |
+
'pr1': 'pr1',
|
| 661 |
+
'pr2': 'pr2',
|
| 662 |
+
'pr3': 'pr3',
|
| 663 |
+
'pr4': 'pr4',
|
| 664 |
+
'pr5': 'pr5',
|
| 665 |
+
'gc_url': 'gc_url',
|
| 666 |
+
'key_pr': 'key_pr',
|
| 667 |
+
'n_con': 'n_con',
|
| 668 |
+
'canal': 'canal',
|
| 669 |
+
'data_t': 'data_t',
|
| 670 |
+
'utm_source': 'utm_source',
|
| 671 |
+
'utm_medium': 'utm_medium',
|
| 672 |
+
'utm_campaign': 'utm_campaign',
|
| 673 |
+
'utm_term': 'utm_term',
|
| 674 |
+
'utm_content': 'utm_content'
|
| 675 |
+
}
|
| 676 |
|
| 677 |
|
| 678 |
+
|
| 679 |
+
def send_data_to_google_form(data):
|
| 680 |
+
# Используем переменную GOOGLE_FORM_URL для формирования ссылки
|
| 681 |
+
google_form_url = GOOGLE_FORM_URL.format(
|
| 682 |
+
name=data.get('name', ''),
|
| 683 |
+
email=data.get('email', ''),
|
| 684 |
+
phone=data.get('phone', ''),
|
| 685 |
+
vk_id=data.get('vk_id', ''),
|
| 686 |
+
chat_id=data.get('chat_id', ''),
|
| 687 |
+
ws_st=data.get('ws_st', ''),
|
| 688 |
+
ws_stop=data.get('ws_stop', ''),
|
| 689 |
+
web_st=data.get('web_st', ''),
|
| 690 |
+
fin_prog=data.get('fin_prog', ''),
|
| 691 |
+
b_city=data.get('b_city', ''),
|
| 692 |
+
b_fin=data.get('b_fin', ''),
|
| 693 |
+
b_ban=data.get('b_ban', ''),
|
| 694 |
+
b_ign=data.get('b_ign', ''),
|
| 695 |
+
b_baners=data.get('b_baners', ''),
|
| 696 |
+
b_butt=data.get('b_butt', ''),
|
| 697 |
+
b_mess=data.get('b_mess', ''),
|
| 698 |
+
shop_st=data.get('shop_st', ''),
|
| 699 |
+
curator=data.get('curator', ''),
|
| 700 |
+
pr1=data.get('pr1', ''),
|
| 701 |
+
pr2=data.get('pr2', ''),
|
| 702 |
+
pr3=data.get('pr3', ''),
|
| 703 |
+
pr4=data.get('pr4', ''),
|
| 704 |
+
pr5=data.get('pr5', ''),
|
| 705 |
+
gc_url=data.get('gc_url', ''),
|
| 706 |
+
key_pr=data.get('key_pr', ''),
|
| 707 |
+
n_con=data.get('n_con', ''),
|
| 708 |
+
canal=data.get('canal', ''),
|
| 709 |
+
data_t=data.get('data_t', ''),
|
| 710 |
+
utm_source=data.get('utm_source', ''),
|
| 711 |
+
utm_medium=data.get('utm_medium', ''),
|
| 712 |
+
utm_campaign=data.get('utm_campaign', ''),
|
| 713 |
+
utm_term=data.get('utm_term', ''),
|
| 714 |
+
utm_content=data.get('utm_content', '')
|
| 715 |
+
)
|
| 716 |
+
|
| 717 |
+
response = requests.post(google_form_url)
|
| 718 |
+
if response.status_code != 200:
|
| 719 |
+
logging.error(f"Failed to send data to Google Form: {response.status_code}, {response.text}")
|
| 720 |
+
else:
|
| 721 |
+
logging.info(f"Data sent to Google Form successfully: {response.status_code}")
|
| 722 |
+
|
| 723 |
+
def update_or_insert_user(db_name, user_data, mapping_template_log):
|
| 724 |
conn = sqlite3.connect(db_name)
|
| 725 |
cursor = conn.cursor()
|
| 726 |
|
|
|
|
| 727 |
email = user_data.get('email')
|
| 728 |
if not email:
|
| 729 |
logging.error(f"User data missing email: {user_data}")
|
|
|
|
| 731 |
|
| 732 |
logging.debug(f"Processing user with email: {email}")
|
| 733 |
|
|
|
|
| 734 |
cursor.execute("SELECT web_st, b_mess FROM contacts WHERE email = ?", (email,))
|
| 735 |
user = cursor.fetchone()
|
| 736 |
logging.debug(f"User found: {user}")
|
| 737 |
|
| 738 |
+
web_st_value = 1
|
| 739 |
+
current_messages = ""
|
|
|
|
| 740 |
if user:
|
|
|
|
| 741 |
current_web_st = user[0] if user[0] is not None and user[0] != "" else 0
|
| 742 |
web_st_value = int(current_web_st) + 1
|
| 743 |
logging.debug(f"Calculated web_st_value: {web_st_value}")
|
| 744 |
|
|
|
|
| 745 |
current_messages = user[1] if user[1] is not None else ""
|
| 746 |
logging.debug(f"Current messages: {current_messages}")
|
| 747 |
|
|
|
|
| 748 |
cursor.execute("UPDATE contacts SET web_st = ? WHERE email = ?", (web_st_value, email))
|
| 749 |
conn.commit()
|
| 750 |
conn.close()
|
|
|
|
| 753 |
conn.close()
|
| 754 |
logging.debug(f"User {email} not found, proceeding with insert")
|
| 755 |
|
|
|
|
| 756 |
conn = sqlite3.connect(db_name)
|
| 757 |
cursor = conn.cursor()
|
| 758 |
|
|
|
|
| 759 |
transformed_data = {}
|
| 760 |
+
for json_key, db_column in mapping_template_log.items():
|
| 761 |
value = user_data.get(json_key, "")
|
| 762 |
|
| 763 |
if isinstance(value, list):
|
|
|
|
| 764 |
if all(isinstance(item, str) for item in value):
|
| 765 |
+
transformed_data[db_column] = "; ".join(value)
|
| 766 |
else:
|
| 767 |
logging.error(f"Expected list of strings for key {json_key}, but got: {value}")
|
| 768 |
transformed_data[db_column] = ""
|
|
|
|
| 770 |
transformed_data[db_column] = str(value)
|
| 771 |
logging.debug(f"Transformed data: {transformed_data}")
|
| 772 |
|
| 773 |
+
insert_query = f"""
|
| 774 |
+
INSERT INTO contacts (name, phone, email, vk_id, chat_id, ws_st, ws_stop, web_st, fin_prog, b_city, b_fin, b_ban, b_ign, b_baners, b_butt, b_mess, shop_st, curator, pr1, pr2, pr3, pr4, pr5, gc_url, key_pr, n_con, canal, data_t, utm_source, utm_medium, utm_campaign, utm_term, utm_content)
|
| 775 |
+
VALUES (:name, :phone, :email, :vk_id, :chat_id, :ws_st, :ws_stop, :web_st, :fin_prog, :b_city, :b_fin, :b_ban, :b_ign, :b_baners, :b_butt, :b_mess, :shop_st, :curator, :pr1, :pr2, :pr3, :pr4, :pr5, :gc_url, :key_pr, :n_con, :canal, :data_t, :utm_source, :utm_medium, :utm_campaign, :utm_term, :utm_content)
|
| 776 |
+
"""
|
| 777 |
+
|
| 778 |
+
insert_values = {
|
| 779 |
+
'name': transformed_data.get('name', ''),
|
| 780 |
+
'phone': transformed_data.get('phone', ''),
|
| 781 |
+
'email': transformed_data.get('email', ''),
|
| 782 |
+
'vk_id': transformed_data.get('vk_id', ''),
|
| 783 |
+
'chat_id': transformed_data.get('chat_id', ''),
|
| 784 |
+
'ws_st': transformed_data.get('ws_st', ''),
|
| 785 |
+
'ws_stop': transformed_data.get('ws_stop', ''),
|
| 786 |
+
'web_st': transformed_data.get('web_st', ''),
|
| 787 |
+
'fin_prog': transformed_data.get('fin_prog', ''),
|
| 788 |
+
'b_city': transformed_data.get('b_city', ''),
|
| 789 |
+
'b_fin': transformed_data.get('b_fin', ''),
|
| 790 |
+
'b_ban': transformed_data.get('b_ban', ''),
|
| 791 |
+
'b_ign': transformed_data.get('b_ign', ''),
|
| 792 |
+
'b_baners': transformed_data.get('b_baners', ''),
|
| 793 |
+
'b_butt': transformed_data.get('b_butt', ''),
|
| 794 |
+
'b_mess': transformed_data.get('b_mess', ''),
|
| 795 |
+
'shop_st': transformed_data.get('shop_st', ''),
|
| 796 |
+
'curator': transformed_data.get('curator', ''),
|
| 797 |
+
'pr1': transformed_data.get('pr1', ''),
|
| 798 |
+
'pr2': transformed_data.get('pr2', ''),
|
| 799 |
+
'pr3': transformed_data.get('pr3', ''),
|
| 800 |
+
'pr4': transformed_data.get('pr4', ''),
|
| 801 |
+
'pr5': transformed_data.get('pr5', ''),
|
| 802 |
+
'gc_url': transformed_data.get('gc_url', ''),
|
| 803 |
+
'key_pr': transformed_data.get('key_pr', ''),
|
| 804 |
+
'n_con': transformed_data.get('n_con', ''),
|
| 805 |
+
'canal': transformed_data.get('canal', ''),
|
| 806 |
+
'data_t': transformed_data.get('data_t', ''),
|
| 807 |
+
'utm_source': transformed_data.get('utm_source', ''),
|
| 808 |
+
'utm_medium': transformed_data.get('utm_medium', ''),
|
| 809 |
+
'utm_campaign': transformed_data.get('utm_campaign', ''),
|
| 810 |
+
'utm_term': transformed_data.get('utm_term', ''),
|
| 811 |
+
'utm_content': transformed_data.get('utm_content', '')
|
| 812 |
+
}
|
| 813 |
+
logging.debug(f"Insert query: {insert_query} with values: {insert_values}")
|
| 814 |
+
cursor.execute(insert_query, insert_values)
|
| 815 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 816 |
conn.commit()
|
| 817 |
conn.close()
|
| 818 |
logging.debug(f"User with email {email} processed successfully")
|
| 819 |
|
| 820 |
+
# Отправляем данные в Google Форму после обновления/вставки
|
| 821 |
+
send_data_to_google_form(transformed_data)
|
| 822 |
|
| 823 |
@app.route('/send_request', methods=['POST'])
|
| 824 |
def send_request():
|
|
|
|
| 836 |
else:
|
| 837 |
return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code
|
| 838 |
|
|
|
|
|
|
|
|
|
|
| 839 |
@app.route('/send_get_request', methods=['GET'])
|
| 840 |
def send_get_request():
|
| 841 |
token = request.args.get('token')
|
|
|
|
| 844 |
|
| 845 |
try:
|
| 846 |
response = requests.get(url, headers={'X-Token': token})
|
| 847 |
+
response.raise_for_status()
|
| 848 |
data = response.json()
|
| 849 |
|
|
|
|
| 850 |
if data is None or 'report' not in data:
|
| 851 |
return jsonify({'error': 'No report data found'}), 500
|
| 852 |
|
| 853 |
report = data.get('report', {})
|
| 854 |
messages = data.get('messages', {})
|
| 855 |
|
|
|
|
| 856 |
if report is None:
|
| 857 |
return jsonify({'error': 'No report data found in the response'}), 500
|
| 858 |
|
|
|
|
| 884 |
except requests.exceptions.RequestException as e:
|
| 885 |
return jsonify({'error': f'API request failed: {str(e)}'}), 500
|
| 886 |
|
|
|
|
|
|
|
|
|
|
| 887 |
@app.route('/webhookbz', methods=['POST'])
|
| 888 |
def webhookbz():
|
| 889 |
api_sys_control = request.args.get('api_sys')
|
|
|
|
| 946 |
|
| 947 |
|
| 948 |
|
| 949 |
+
|
| 950 |
+
|
| 951 |
+
|
| 952 |
+
|
| 953 |
+
|
| 954 |
|
| 955 |
|
| 956 |
|