Last active
April 21, 2022 15:38
-
-
Save lucas34/1858bc98d219bf20c02c2755c44cc9f8 to your computer and use it in GitHub Desktop.
Convert FairPrice invoice to CSV
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import json | |
import pandas as pd | |
import sys | |
if len(sys.argv) != 3: | |
print("bearer token needed as argument") | |
exit(1) | |
headers = {"Authorization": sys.argv[1] + " " + sys.argv[2]} | |
def get_prucharse_history(page_token = 1): | |
url = 'https://pay.fairprice.com.sg/api/pay/invoices?pageToken={}&pageSize=100'.format(page_token) | |
r = requests.get(url, headers=headers) | |
if r.status_code != 200: | |
print("HTTP ERROR code " + str(r.status_code)) | |
print(r.json()) | |
exit() | |
else: | |
result = r.json() | |
data = result["data"] | |
total_items = data["totalSize"] | |
items = data["invoices"] | |
if 'nextPageToken' in data: | |
print(".") | |
return get_prucharse_history(data["nextPageToken"]) + items | |
else: | |
return items | |
# Call API to get list of purchased items link to this invoice Id | |
def get_item_purchased(id): | |
url = 'https://pay.fairprice.com.sg/api/pay/invoices/{}/items'.format(id) | |
r = requests.get(url, headers=headers) | |
if r.status_code != 200: | |
print("Fail to load invoice id=" + id) | |
print("HTTP ERROR code " + str(r.status_code)) | |
print(r.json()) | |
exit() | |
else: | |
return r.json()["data"]["items"] | |
# Remove uncessary field to keep only item "Name", "Quantity" and "Price" (Price refer to total price for all identicals items) | |
def shrink_json(items, date): | |
result = [] | |
for item in items: | |
elements = {"date": date, "name": item["name"], "quantity": item["quantity"], "total_price": item["price"]} | |
result.insert(0, elements) | |
return result | |
def result_to_csv(result): | |
df = pd.read_json(json.dumps(result)) | |
df.to_csv(r'faireprice_result.csv', index=None) | |
print("DONE") | |
def pull_all_data(): | |
result = [] | |
print("Fetching purchase history") | |
invoices = get_prucharse_history() | |
print("Number of invoices: " + str(len(invoices))) | |
for idx, invoice in enumerate(invoices): | |
print("Fetching " + str(idx + 1) + "/" + str(len(invoices))) | |
item = shrink_json(get_item_purchased(invoice["id"]), str(invoice["invoiceDate"])) | |
result = result + item | |
return result | |
# Setup | |
# pip install requests | |
# pip install pandas | |
# Get your Bearer token | |
# Login to https://www.fairprice.com.sg/ and with developer console, any request contains the token in the header | |
# python fairprice.py Bearer ABCDEF | |
# Result is in faireprice_result.csv | |
result_to_csv(pull_all_data()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment