import time import requests import json import os from dotenv import load_dotenv from datetime import datetime from telegram_bot import order_epicenter_error from models import db, EpicenterOrder, Product, EpicenterOrderProduct load_dotenv() LOGIN = os.getenv("LOGIN") PASSWORD = os.getenv("EPIC_PASSWORD") def get_auth_token(login: str, password: str) -> str: headers = { "authority": "core-api.epicentrm.cloud", "accept": "application/json", "accept-language": "ru", "content-type": "application/json", "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Linux"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", } json_data = { "login": login, "password": password, } response = requests.post( "https://core-api.epicentrm.cloud/v1/users/login", headers=headers, json=json_data, ) auth_token = response.json()["token"]["auth"] return auth_token def is_new_order(order_id: str, auth_token: str) -> bool: headers = { "authority": "core-api.epicentrm.cloud", "accept": "application/json", "accept-language": "en-US,en;q=0.9,ru;q=0.8,ru-RU;q=0.7", "authorization": f"Bearer {auth_token}", "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", } response = requests.get( f"https://core-api.epicentrm.cloud/v2/oms/orders/{order_id}", headers=headers, ) data = json.loads(response.text) if ( data["statusCode"] == "new" and data["statusCode"] != "canceled" and data["statusCode"] != "sent" ) and data["statusCode"] != "confirmed": return True return False def activate_order(order_id: str, auth_token: str): first_headers = { "authority": "core-api.epicentrm.cloud", "accept": "*/*", "accept-language": "en-US,en;q=0.9,ru;q=0.8,ru-RU;q=0.7", "access-control-request-headers": "authorization,content-type", "access-control-request-method": "POST", "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", } requests.options( f"https://core-api.epicentrm.cloud/v2/oms/orders/{order_id}/change-status/to/confirmed_by_merchant", headers=first_headers, ) second_headers = { "authority": "core-api.epicentrm.cloud", "accept": "*/*", "accept-language": "en-US,en;q=0.9,ru;q=0.8,ru-RU;q=0.7", "authorization": f"Bearer {auth_token}", # 'content-length': '0', "content-type": "application/json", "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", } requests.post( f"https://core-api.epicentrm.cloud/v2/oms/orders/{order_id}" f"/change-status/to/confirmed_by_merchant", headers=second_headers, ) def get_delivery_info( shipment_settlementId: str, shipment_officeId: str, auth_token: str ): headers = { "authority": "core-api.epicentrm.cloud", "accept": "application/json", "accept-language": "ru", "authorization": f"Bearer " f"{auth_token}", "if-none-match": 'W/"196-wqlAXM70iFf1sVnvW/hGnongIL0"', "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", } response = requests.get( f"https://core-api.epicentrm.cloud/v2/deliveries/nova_poshta/settlements/{shipment_settlementId}" f"/offices/{shipment_officeId}", headers=headers, ) shipment_data = json.loads(response.text) return shipment_data["title"] def get_first_page_order_ids(auth_token: str): headers = { "authority": "core-api.epicentrm.cloud", "accept": "application/json", "accept-language": "ru", "authorization": f"Bearer {auth_token}", "if-none-match": 'W/"6e25-Lp/88DlhwX6wEIzxPDq/6WiYQf8"', "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Linux"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", } params = { "offset": "0", "limit": "10", } response = requests.get( "https://core-api.epicentrm.cloud/v2/oms/orders", params=params, headers=headers ) data = json.loads(response.text) order_ids = [order["id"] for order in data["items"]] return order_ids def get_order_info(order_id: str, auth_token: str): headers = { "authority": "core-api.epicentrm.cloud", "accept": "application/json", "accept-language": "en-US,en;q=0.9,ru;q=0.8,ru-RU;q=0.7", "authorization": f"Bearer {auth_token}", "if-none-match": 'W/"4ced-XZFKegDeJ8gOKv2D+e5bORHnOoM"', "origin": "https://admin.epicentrm.com.ua", "referer": "https://admin.epicentrm.com.ua/", "sec-ch-ua": '"Not A(Brand";v="99", "Google Chrome";v="121", "Chromium";v="121"', "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": '"Windows"', "sec-fetch-dest": "empty", "sec-fetch-mode": "cors", "sec-fetch-site": "cross-site", "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", } response = requests.get( f"https://core-api.epicentrm.cloud/v2/oms/orders/{order_id}", headers=headers, ) order = json.loads(response.text) products = [] if is_new_order(order_id, auth_token): activate_order(order_id, auth_token) time.sleep(10) return get_order_info(order_id, auth_token) else: # get product info for item in range(len(order["items"])): title = order["items"][item]["title"] sku = order["items"][item]["sku"] product_price = order["items"][item]["price"] quantity = order["items"][item]["quantity"] products.append( { "name": title, "sku": sku, "price": product_price, "quantity": quantity, } ) # User info first_name = order["address"]["firstName"] last_name = order["address"]["lastName"] patronymic = order["address"]["patronymic"] email = order["address"]["email"] phone_number = order["address"]["phone"] # Delivery info delivery_info = get_delivery_info( order["address"]["shipment"]["settlementId"], order["address"]["shipment"]["officeId"], auth_token, ) delivery_ref = order["address"]["shipment"]["officeId"] settlement = order["settlement"]["title"] # Order info order_number = order["number"] order_status = order["statusCode"] created_at = order["createdAt"] subtotal = order["subtotal"] order_data = { "first_name": first_name, "last_name": last_name, "patronymic": patronymic, "email": email, "phone_number": phone_number, "delivery_info": delivery_info, "delivery_ref": delivery_ref, "settlement": settlement, "order_number": order_number, "order_id": order_id, "products": products, "order_status": order_status, "created_at": created_at, "subtotal": subtotal, } return order_data def insert_order_info(order_info): with db.atomic(): # Insert EpicenterOrder epicenter_model = EpicenterOrder.create( order_number=order_info["order_number"], order_id=order_info["order_id"], order_status=order_info["order_status"], order_creation_date=datetime.strptime( order_info["created_at"], "%Y-%m-%dT%H:%M:%S%z" ).strftime("%Y-%m-%d %H:%M:%S"), full_name=( f"{order_info['first_name']} {order_info['last_name']} " f"{order_info['patronymic'] if order_info['patronymic'] else ''}" ), email=order_info["email"], phone_number=order_info["phone_number"], delivery_address=", ".join(order_info["delivery_info"].split(",")[1:]), delivery_post_number=f"Склад {order_info['delivery_info'].split(',')[0]}".replace( "№", "#" ).rstrip(), delivery_ref=order_info["delivery_ref"], settlement=order_info["settlement"], amount=order_info["subtotal"], ) # Insert or update products and associate them with the order product_records = [] for product_data in order_info["products"]: sku = product_data["sku"] existing_product = Product.select().where(Product.sku == sku).first() if existing_product: # Update existing product existing_product.price = product_data["price"] existing_product.save() else: # Create new product existing_product = Product.create( name=product_data["name"], sku=sku, price=product_data["price"] ) product_records.append(existing_product) # Associate product with the order and specify quantity EpicenterOrderProduct.create( epicenter_order=epicenter_model, product=existing_product, quantity=product_data["quantity"], ) def write_orders(auth_token: str): # get order_ids from first 10 orders order_ids = get_first_page_order_ids(auth_token) for order_id in order_ids: print(order_id) existing_order = ( EpicenterOrder.select().where(EpicenterOrder.order_id == order_id).first() ) if existing_order: continue order_info = get_order_info(order_id=order_id, auth_token=auth_token) insert_order_info(order_info=order_info) db.close() # request.get()url Alex send order_number print("DONE") def run_all(): try: while True: auth_token = get_auth_token(LOGIN, PASSWORD) write_orders(auth_token=auth_token) time.sleep(1800) except Exception as e: # print(e.with_traceback()) exception_text = f"🆘An error in epicenter orders script. Please change something!🆘\n Exception: {e}" order_epicenter_error(exception_text) if __name__ == "__main__": run_all()