From c157cc9371ee6e3c4ef0157f14227ae57e87d5a2 Mon Sep 17 00:00:00 2001 From: sickprodigy Date: Thu, 7 Mar 2024 19:25:05 -0500 Subject: [PATCH] The loop method for depositHistory endpoint. Using pandas to write to excel sheet. Had issues at first, bt realized had the wrong key set. This pulls all deposit history looping through each id listed in a column on an excel sheet. So pull id's to a column, Have this grab that column of data and pull all data. Had to manually set each column because USDC/USDT pairs. Probably could automate it better. using /filledOrders End point. Transform data in excel to column python the rest using that endpoint. Only thing only shows 90 days of data. Gotta figure out how to pull more or maybe not possible... --- ...-coins-to-depositHistory-write-to-excel.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 binance-read-coins-to-depositHistory-write-to-excel.py diff --git a/binance-read-coins-to-depositHistory-write-to-excel.py b/binance-read-coins-to-depositHistory-write-to-excel.py new file mode 100644 index 0000000..d4cd814 --- /dev/null +++ b/binance-read-coins-to-depositHistory-write-to-excel.py @@ -0,0 +1,84 @@ +import urllib.parse +import hashlib +import hmac +import base64 +import requests +import time +import pandas as pd +import io +from dotenv import load_dotenv +import os + +# Load environment variables +load_dotenv() + +api_url = "https://api.binance.us" # don't use wrong link scalar values error + +# create a file named '.env' with the below keys like so: BINANCE_API_KEY="mysuperlongbinancekey" +api_key = os.environ.get("BINANCE_API_KEY") +secret_key = os.environ.get("BINANCE_SECRET_KEY") + +def get_binanceus_signature(data, secret): + postdata = urllib.parse.urlencode(data) + message = postdata.encode() + byte_key = bytes(secret, 'UTF-8') + mac = hmac.new(byte_key, message, hashlib.sha256).hexdigest() + return mac + +# Attach auth headers and return results from POST request +def binanceus_request_key(uri_path, data, api_key, api_sec): + headers = {} + headers['X-MBX-APIKEY'] = api_key + signature = get_binanceus_signature(data, api_sec) + params={ + **data, + "signature": signature, + } + req = requests.get((api_url + uri_path), headers=headers, params=params) + return req.text + +def binanceus_request(uri_path): + req = requests.get(api_url + uri_path) + return req.text + +# uri_path = "/api/v3/allOrders" +uri_path = "/sapi/v1/capital/deposit/hisrec" + +out_path = "E:\\prodigy\\Scripts\\api-testing\\binance\\" # windows needs double \\ escape the escape + +df_nest_symbols = pd.read_excel(out_path + "binance.xlsx", sheet_name="BinanceCoinListManual", usecols="B", header=0) # using header none is the way, 0 = first row header +# df_nested_symbol_str = df_nest_symbols.to_string(index=False, header=False) # in compilation with headers none, this will read the single cell data to a variable + +# print(df_nest_symbols) # prints pandas.DataFrame read from excel sheet + +# time to loop that data in multiple calls. while also appending the data from the calls to a pandas.Dataframe +appended_data = [] +for row in df_nest_symbols.itertuples(): + data_symbol = { + "timestamp": int(time.time() * 1000), + # "startTime": '90', # within 1-90 days for some reason trash but be a unix timestamp or something a LONG?! default is 90 days anyways, but you could roll this every 15 days and only pull last 15 days worth of data, check again x or something list goes on + "coin": str.upper(row.Ticker2) # might work if you use coin instead of symbol.. + } + print(data_symbol) + print("reading JSON data...") + result=binanceus_request_key(uri_path, data_symbol, api_key, secret_key) + print(result) + print("reading JSON data into DataFrame...") + df_nest = pd.read_json(io.StringIO(result)) + print("DataFrame created succesfully") + + print("DataFrame Shape:", df_nest.shape) # show dataframe is expanding + + appended_data.append(df_nest) + +appended_data = pd.concat(appended_data) + + +try: + with pd.ExcelWriter(out_path + 'binance.xlsx', mode="a", engine="openpyxl", if_sheet_exists="replace") as writer: + appended_data.to_excel(writer, sheet_name="BinanceDepositHistory", index=False) + print("DataFrame written to Excel") +except Exception as e: + print(f"Error: {e}") + +# might work if you use coin instead of symbol in each call. if you use symbol, it will just pull data apparently.. idk, maybe it's actually not mandatory.... \ No newline at end of file