From 6233aa2dd0a644c6af245697bae50dc104e2374c Mon Sep 17 00:00:00 2001 From: Xander Date: Thu, 22 Aug 2024 15:16:07 +0300 Subject: [PATCH] first commit --- .gitignore | 46 ++++++++ README.md | 0 main.py | 274 +++++++++++++++++++++++++++++++++++++++++++++++ models.py | 27 +++++ requirements.txt | 7 ++ 5 files changed, 354 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 main.py create mode 100644 models.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d30f0f --- /dev/null +++ b/.gitignore @@ -0,0 +1,46 @@ +# Игнорируем директорию с пользовательскими настройками IDE +.idea/ +.vscode/ + +# Игнорируем файлы логов +*.log + +# Игнорируем кэш и временные файлы +*.tmp +*.swp +*.bak + +# Игнорируем файлы окружения Python +*.pyc +__pycache__/ + +# Игнорируем конфигурации ОС +.DS_Store +Thumbs.db + +# Игнорируем директорию с зависимостями (например, для Node.js) +node_modules/ + +# Игнорируем файлы виртуального окружения Python +.venv/ +.env/ + +# Игнорируем скомпилированные файлы +*.out +*.class +*.o + +# Игнорируем артефакты сборки +/dist/ +/build/ +/target/ + +# Игнорируем файлы базы данных +*.sqlite +*.db + +# Исключаем файл конфигурации среды, например, переменные окружения +.env +ww +pymb.py +test.py \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/main.py b/main.py new file mode 100644 index 0000000..00d63fd --- /dev/null +++ b/main.py @@ -0,0 +1,274 @@ +import requests +from datetime import datetime, timedelta +from models import * +import re +import time +import uuid +from dotenv import load_dotenv +import os +load_dotenv() + +KCRM =os.getenv('KEYCRM_API') + +CLIENT_ID = os.getenv('CLIENT_ID') +USERNAME = os.getenv('USERNAME') +PASSWORD = os.getenv('PASSWORD') +CLIENT_SECRET = os.getenv('CLIENT_SECRET') + +def datass(): + # Получение текущей даты + current_date = datetime.now() + + # Форматирование даты в формат YYYY-MM-DD + formatted_date = current_date.strftime('%Y-%m-%d') + + # print(formatted_date) + return formatted_date + +def datass_pymb(): + # Получение текущей даты + current_date = datetime.now() + + # Форматирование даты в формат YYYY-MM-DD + formatted_date = current_date.strftime('%d.%m.%Y') + + # print(formatted_date) + return formatted_date + +def oplata(order_ids): + # Получение всех записей + # orders = Transaction.select() + order = Transaction.get_or_none(Transaction.id == order_ids) + # for order in orders: + if order: + numbers = re.findall(r'\d+', order.description) + if numbers: # Проверяем, что список не пуст + first_number = numbers[0] # Получаем первое значение из списка + print(first_number, order.amount, order.uuid) + # formatted_datetime = datetime.strptime(order.created_at, "%Y-%m-%dT%H:%M:%S.%fZ").strftime("%Y-%m-%d %H:%M:%S") + + # print(first_number, order.amount, formatted_datetime, order.description) + headers = { + 'accept': 'application/json', + 'Authorization': f'Bearer {KCRM}', + } + # response = requests.get(f'https://openapi.keycrm.app/v1/order/17', headers=headers) + json_data = { + 'payment_method_id': 3, + 'payment_method': 'Банковский перевод', + 'amount': order.amount, + 'status': 'paid', + 'description': order.description, + 'payment_date': order.created_at, + } + + response = requests.post(f'https://openapi.keycrm.app/v1/order/{first_number}/payment', headers=headers, json=json_data) + + # response = requests.put('https://openapi.keycrm.app/v1/order/17/payment/1161', headers=headers, json=json_data) + print(response.json()) + else: + print(f"Order with ID {order_id} not found.") + + + + + +def trans(): + headers = { + 'accept': 'application/json', + 'Authorization': f'Bearer {KCRM}', + + } + + params = { + 'limit': '30', + 'page': '1', + 'include': 'payment_method', + 'filter[created_between]': f'{datass()} 00:00:00, {datass()} 23:59:59', + # 'filter[created_between]': f'2024-08-20 00:00:00, 2024-08-20 23:59:59', + + } + + response = requests.get('https://openapi.keycrm.app/v1/payments/external-transactions', params=params, headers=headers) + + aaa = response.json()['data'] + # print(aaa) + for aa in aaa: + ids = aa['id'] + payments_data = aa['payments_data'] + amount = aa['amount'] + description =aa['description'] + uuid = aa ['uuid'] + created_at = aa ['transaction_date'] + timestamp = datetime.strptime(created_at, "%Y-%m-%dT%H:%M:%S.%fZ") # Преобразование строки в datetime + new_timestamp = timestamp + timedelta(hours=3) # Добавление 3 часов + gateway_id = aa ['gateway_id'] + # print(f'{ids} {uuid} {amount} {description}') + # Проверка существования записи с таким id + if not Transaction.select().where(Transaction.id == ids).exists(): + # Запись данных в таблицу, если id не существует + new_transaction = Transaction.create(id=ids, uuid=uuid, amount=amount, description=description, created_at = new_timestamp,gateway_id=gateway_id) + # print(f'Запись добавлена: {new_transaction.id} {new_transaction.uuid} {new_transaction.amount} {new_transaction.description}') + numbers = re.findall(r'\d+', description) + if gateway_id == 1: + # Выводим все численные значения + if numbers: # Проверяем, что список не пуст + first_number = numbers[0] # Получаем первое значение из списка + print(first_number) + headers = { + 'accept': 'application/json', + 'Authorization': f'Bearer {KCRM}', + + } + + response = requests.get(f'https://openapi.keycrm.app/v1/order/{first_number}', headers=headers) + resp = response.json() + + if 'message' in resp: + print('NOT ORDERS') + else: + # Дальше идет обработка данных заказа + + print(resp) + oplata(ids) + else: + pass + else: + print(f'Запись с id {ids} уже существует, пропускаем.') + db.close() + +def pymb(): + token_url = "https://auth.fuib.com/auth/realms/VegaNet/protocol/openid-connect/token" + + # Параметры запроса + data = { + 'grant_type': 'password', + 'client_id': CLIENT_ID, + 'username': USERNAME, + 'password': PASSWORD, + 'client_secret': CLIENT_SECRET + } + + # Заголовки запроса + headers = { + 'Content-Type': 'application/x-www-form-urlencoded' + } + + # Выполнение POST-запроса + response = requests.post(token_url, data=data, headers=headers) + # print(response.json()) + # Проверка статуса ответа + if response.status_code == 200: + # Получение токена из ответа + token_info = response.json() + access_token = token_info.get('access_token') + + # print(f"Access Token: {access_token}") + session_id = token_info.get('session_state') + # print(f"Access Token: {session_id}") + + else: + print(f"Failed to get token. Status code: {response.status_code}, Response: {response.text}") + + request_guid = str(uuid.uuid4()) # Генерация уникального RequiestGUID + user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36" + fingerprint_id = user_agent # Используем UserAgent в качестве FingerprintId + + #Запрос на получение транзакций + api_url = "https://service.fuib.com:4103/war_veganet_api/document/period-transactions" + + headers = { + 'Content-Type': 'application/json', + 'Authorization': f'Bearer {access_token}', + 'X-App-Channel': 'pure-api', + 'X-Flow-ID': f'{request_guid}:{session_id}:{fingerprint_id}' + } + + data = { + "accountId": 191214708, + # "documentType": ["UNKNOWN"], # Типы документов (обязательный) + # "dateFrom": "21.08.2024 00:00:00", + "dateFrom": f"{datass_pymb()} 00:00:00", + "dateTo": f"{datass_pymb()} 23:59:00" + } + + # # Выполнение POST-запроса + response = requests.post(api_url, json=data, headers=headers) + + # Проверка статуса ответа + if response.status_code == 200: + # Успешный ответ + response_data = response.json()['transactions'] # Ответ в формате JSON + # print(f"Filtered Account Data: {response_data}") + for datas in response_data: + flag = datas['dcFlag'] + amount = datas['amount'] + narrative = datas['narrative'] + documentDate = datas['documentDate'] + documentNumber = datas['documentNumber'] + transactionId = datas['transactionId'] + + document_date = datetime.strptime(documentDate, "%d.%m.%Y %H:%M:%S") + + # Convert to the desired format (Y-m-d H:i:s) + formatted_date = document_date.strftime("%Y-%m-%d %H:%M:%S") + + + if not Transaction.select().where(Transaction.id == transactionId).exists(): + # Запись данных в таблицу, если id не существует + new_transaction = Transaction.create(id=transactionId, uuid=documentNumber, amount=amount, description=narrative, created_at = formatted_date,gateway_id=flag) + numbers = re.findall(r'\d+', narrative) + if numbers: # Проверяем, что список не пуст + first_number = numbers[0] # Получаем первое значение из списка + print(first_number) + headers = { + 'accept': 'application/json', + 'Authorization': f'Bearer {KCRM}', + + } + + response = requests.get(f'https://openapi.keycrm.app/v1/order/{first_number}', headers=headers) + resp = response.json() + + if 'message' in resp: + print('NOT ORDERS') + else: + # Дальше идет обработка данных заказа + + print(resp) + oplata(transactionId) + else: + print(f'Запись с id {transactionId} уже существует, пропускаем.') + + + + + else: + # Ошибка + print(f"Failed to get filtered account data. Status code: {response.status_code}, Response: {response.text}") + + db.close() + + + + +def mains(): + + while True: + try: + trans() + pymb() + except Exception as e: + # print(e.with_traceback()) + print(e) + print("PAUSE") + time.sleep(600) + + +if __name__ == "__main__": + mains() + + + + + diff --git a/models.py b/models.py new file mode 100644 index 0000000..36fe34c --- /dev/null +++ b/models.py @@ -0,0 +1,27 @@ +from peewee import * + +# Соединение с базой данных SQLite (или любой другой поддерживаемой базой данных) +db = SqliteDatabase('my_database.db') + +# Определение модели для таблицы +class Transaction(Model): + id = AutoField() + uuid = CharField() + amount = FloatField() + description = CharField() + created_at = CharField() + gateway_id = CharField() + + class Meta: + database = db # Указание базы данных + +# Создание таблицы +db.connect() +db.create_tables([Transaction]) + +# Пример добавления данных в таблицу +# new_transaction = Transaction.create(amount=100.50, description='Payment for services') +# print(new_transaction.id, new_transaction.amount, new_transaction.description) + +# Закрытие соединения с базой данных +# db.close() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a9b0f36 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +certifi==2024.6.2 +charset-normalizer==3.3.2 +idna==3.7 +peewee==3.17.5 +python-dotenv==1.0.1 +requests==2.32.3 +urllib3==2.2.2