DmitrMakeev commited on
Commit
13dbf68
·
verified ·
1 Parent(s): ffb87b3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +234 -1
app.py CHANGED
@@ -397,7 +397,7 @@ def upload_csv():
397
 
398
 
399
 
400
- # ОБНОВЛЯЕМ CSV JSON-файла
401
  DATABASE = 'data_gc.db'
402
 
403
  # Функция для очистки номера телефона
@@ -470,6 +470,239 @@ def upload_json():
470
 
471
 
472
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
473
 
474
 
475
 
 
397
 
398
 
399
 
400
+ # ОБНОВЛЯЕМ JSON-файла
401
  DATABASE = 'data_gc.db'
402
 
403
  # Функция для очистки номера телефона
 
470
 
471
 
472
 
473
+ # ОБНОВЛЯЕМ Бизон 365
474
+ DATABASE_NAME = 'data_gc.db'
475
+
476
+ def update_or_insert_user(db_name, user_data, mapping_template):
477
+ conn = sqlite3.connect(db_name)
478
+ cursor = conn.cursor()
479
+
480
+ # Получение email пользователя из данных
481
+ email = user_data.get('email')
482
+ if not email:
483
+ logging.error(f"User data missing email: {user_data}")
484
+ return
485
+
486
+ logging.debug(f"Processing user with email: {email}")
487
+
488
+ # Проверка существования пользователя в базе данных по email
489
+ cursor.execute("SELECT web_st, ws_st, b_mess FROM contacts WHERE email = ?", (email,))
490
+ user = cursor.fetchone()
491
+ logging.debug(f"User found: {user}")
492
+
493
+ # Вынесение увеличения значения web_st в отдельный блок
494
+ web_st_value = 1 # Инициализация значения web_st
495
+ if user:
496
+ # Проверка текущего значения web_st и его инкрементация
497
+ current_web_st = user[0] if user[0] is not None and user[0] != "" else 0
498
+ web_st_value = int(current_web_st) + 1
499
+ logging.debug(f"Calculated web_st_value: {web_st_value}")
500
+
501
+ # Обновление значения web_st
502
+ cursor.execute("UPDATE contacts SET web_st = ? WHERE email = ?", (web_st_value, email))
503
+ conn.commit()
504
+ conn.close()
505
+ logging.debug(f"User {email} web_st updated to {web_st_value}")
506
+ else:
507
+ conn.close()
508
+ logging.debug(f"User {email} not found, proceeding with insert")
509
+
510
+ # Открываем соединение снова для остальных операций
511
+ conn = sqlite3.connect(db_name)
512
+ cursor = conn.cursor()
513
+
514
+ # Преобразование данных пользователя на основе шаблона сопоставления
515
+ transformed_data = {}
516
+ for json_key, db_column in mapping_template.items():
517
+ value = user_data.get(json_key, "")
518
+
519
+ if isinstance(value, list):
520
+ # Проверяем тип элементов списка
521
+ if all(isinstance(item, str) for item in value):
522
+ transformed_data[db_column] = "; ".join(value) # Сохраняем сообщения в строку
523
+ else:
524
+ logging.error(f"Expected list of strings for key {json_key}, but got: {value}")
525
+ transformed_data[db_column] = ""
526
+ else:
527
+ transformed_data[db_column] = str(value)
528
+ logging.debug(f"Transformed data: {transformed_data}")
529
+
530
+ # Заполнение обязательных полей значениями по умолчанию
531
+ required_fields = [
532
+ "vk_id", "chat_id", "ws_st", "ws_stop", "web_st", "fin_prog",
533
+ "b_city", "b_fin", "b_ban", "b_ign", "b_baners", "b_butt", "b_mess",
534
+ "shop_st", "curator", "pr1", "pr2", "pr3", "pr4", "pr5", "gc_url",
535
+ "key_pr", "n_con", "canal", "data_on", "data_t", 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'gcpc'
536
+ ]
537
+
538
+ for field in required_fields:
539
+ if field not in transformed_data:
540
+ transformed_data[field] = ""
541
+ logging.debug(f"Transformed data after adding required fields: {transformed_data}")
542
+
543
+ # Обработка номера телефона, если он есть
544
+ if 'phone' in user_data:
545
+ phone = user_data['phone']
546
+ if phone.startswith('+'):
547
+ phone = phone[1:]
548
+ transformed_data['phone'] = phone
549
+ logging.debug(f"Transformed data after phone processing: {transformed_data}")
550
+
551
+ # Добавление значения web_st в данные для вставки
552
+ transformed_data['web_st'] = web_st_value
553
+
554
+ # Обновление данных пользователя в базе данных
555
+ if user:
556
+ # Объединение новых сообщений с существующими
557
+ if 'b_mess' in transformed_data and user[2]:
558
+ transformed_data['b_mess'] = user[2] + "; " + transformed_data['b_mess']
559
+
560
+ update_query = "UPDATE contacts SET "
561
+ update_values = []
562
+ for column, value in transformed_data.items():
563
+ if column != 'ws_st' or not user[1]: # Проверка на наличие существующего ws_st
564
+ update_query += f"{column} = ?, "
565
+ update_values.append(value)
566
+ update_query = update_query.rstrip(", ") + " WHERE email = ?"
567
+ update_values.append(email)
568
+ logging.debug(f"Update query: {update_query} with values: {update_values}")
569
+ cursor.execute(update_query, update_values)
570
+ else:
571
+ columns = ', '.join(transformed_data.keys())
572
+ placeholders = ', '.join('?' for _ in transformed_data)
573
+ insert_query = f"INSERT INTO contacts ({columns}) VALUES ({placeholders})"
574
+ insert_values = list(transformed_data.values())
575
+ logging.debug(f"Insert query: {insert_query} with values: {insert_values}")
576
+ cursor.execute(insert_query, insert_values)
577
+
578
+ # Подтверждение изменений и закрытие соединения
579
+ conn.commit()
580
+ conn.close()
581
+ logging.debug(f"User with email {email} processed successfully")
582
+
583
+
584
+ @app.route('/send_request', methods=['POST'])
585
+ def send_request():
586
+ token = request.form.get('token')
587
+ min_date = request.form.get('minDate')
588
+ type = request.form.get('type')
589
+ url = f'https://online.bizon365.ru/api/v1/webinars/reports/getlist?minDate={min_date}&limit=100&type={type}'
590
+
591
+ response = requests.get(url, headers={'X-Token': token})
592
+
593
+ if response.status_code == 200:
594
+ data = response.json()
595
+ webinar_ids = [item['webinarId'] for item in data['list']]
596
+ return jsonify(webinar_ids)
597
+ else:
598
+ return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code
599
+
600
+
601
+
602
+
603
+ @app.route('/send_get_request', methods=['GET'])
604
+ def send_get_request():
605
+ token = request.args.get('token')
606
+ webinarId = request.args.get('webinarId')
607
+ url = f'https://online.bizon365.ru/api/v1/webinars/reports/get?webinarId={webinarId}'
608
+
609
+ try:
610
+ response = requests.get(url, headers={'X-Token': token})
611
+ response.raise_for_status() # Проверка на ошибки HTTP
612
+ data = response.json()
613
+
614
+ # Убедитесь, что report существует в данных
615
+ if data is None or 'report' not in data:
616
+ return jsonify({'error': 'No report data found'}), 500
617
+
618
+ report = data.get('report', {})
619
+ messages = data.get('messages', {})
620
+
621
+ # Проверка на None перед использованием
622
+ if report is None:
623
+ return jsonify({'error': 'No report data found in the response'}), 500
624
+
625
+ report_json_str = report.get('report', '{}')
626
+ try:
627
+ report_json = json.loads(report_json_str)
628
+ except json.JSONDecodeError:
629
+ report_json = {}
630
+
631
+ messages_json_str = report.get('messages', '{}')
632
+ try:
633
+ messages_json = json.loads(messages_json_str)
634
+ except json.JSONDecodeError:
635
+ messages_json = {}
636
+
637
+ users_meta = report_json.get('usersMeta', {})
638
+
639
+ processed_emails = set()
640
+ for user_id, user_data in users_meta.items():
641
+ user_messages = messages_json.get(user_id, [])
642
+ user_data['messages'] = user_messages
643
+ email = user_data.get('email')
644
+ if email and email not in processed_emails:
645
+ update_or_insert_user(DATABASE_NAME, user_data, mapping_template)
646
+ processed_emails.add(email)
647
+
648
+ return jsonify({'status': 'User data saved successfully'})
649
+
650
+ except requests.exceptions.RequestException as e:
651
+ return jsonify({'error': f'API request failed: {str(e)}'}), 500
652
+
653
+ api_bz = "SkrIONpr3ByeSIuEaBhr1bB8u4aBhSJfH8uEpB2rk7rI_ETrn"
654
+
655
+
656
+ @app.route('/webhookbz', methods=['POST'])
657
+ def webhookbz():
658
+ api_sys_control = request.args.get('api_sys')
659
+ if api_sys_control != api_key_sys:
660
+ return "EUR 22", 200
661
+
662
+ data = request.json
663
+ webinar_id = data.get('webinarId')
664
+
665
+ if not webinar_id:
666
+ return jsonify({'error': 'webinarId is required'}), 400
667
+
668
+ url = f'https://online.bizon365.ru/api/v1/webinars/reports/get?webinarId={webinar_id}'
669
+ response = requests.get(url, headers={'X-Token': api_key_sys})
670
+
671
+ if response.status_code == 200:
672
+ data = response.json()
673
+
674
+ report = data.get('report', {})
675
+ messages = data.get('messages', {})
676
+
677
+ report_json_str = report.get('report', '{}')
678
+ try:
679
+ report_json = json.loads(report_json_str)
680
+ except json.JSONDecodeError:
681
+ report_json = {}
682
+
683
+ messages_json_str = report.get('messages', '{}')
684
+ try:
685
+ messages_json = json.loads(messages_json_str)
686
+ except json.JSONDecodeError:
687
+ messages_json = {}
688
+
689
+ users_meta = report_json.get('usersMeta', {})
690
+
691
+ processed_emails = set()
692
+ for user_id, user_data in users_meta.items():
693
+ user_messages = messages_json.get(user_id, [])
694
+ user_data['messages'] = user_messages
695
+ email = user_data.get('email')
696
+ if email and email not in processed_emails:
697
+ update_or_insert_user(DATABASE_NAME, user_data, mapping_template)
698
+ processed_emails.add(email)
699
+
700
+ return jsonify({'status': 'User data saved successfully'})
701
+ else:
702
+ return jsonify({'error': 'Failed to fetch data from the API'}), response.status_code
703
+
704
+
705
+
706
 
707
 
708