import os import requests import pandas as pd from plotly.subplots import make_subplots import threading import plotly import plotly.graph_objects as go from tqdm import tqdm from datetime import datetime import pytz import json import base64 plotly.io.defaults.default_height = 720 plotly.io.defaults.default_width = 1440 GITHUB_TOKEN = os.getenv("GITHUB_TOKEN") OWNER = os.getenv("OWNER") REPO = os.getenv("REPO") HEADERS = { "Authorization": f"token {GITHUB_TOKEN}", } FILEPATH = "data/data.json" FILEURL = f"https://api.github.com/repos/{OWNER}/{REPO}/contents/{FILEPATH}" def puf(filepath, content): fileurl = f"https://api.github.com/repos/{OWNER}/{REPO}/contents/{filepath}" response = requests.get(fileurl, headers=HEADERS) is_update = response.status_code == 200 res = response.json() sha = res["sha"] if is_update else None if is_update and content == res: return data = { "message": "Update" if is_update else "Upload", "content": base64.b64encode( content.encode() if isinstance(content, str) else content ).decode() } if is_update: data["sha"] = sha resp = requests.put(fileurl, headers=HEADERS, json=data) print("✅ Upload success" if resp.ok else f"❌ Error: {resp.text}") uf = lambda filepath, content: threading.Thread(target=puf, args=(filepath, content)).start() rf = lambda: json.loads(base64.b64decode(response.json()['content']).decode() if (response := requests.get(FILEURL, headers=HEADERS)).status_code == 200 else "{}") ir = lambda d=None: (d or rf() != {}) lhs = [7, 15, 30, 60, 90, 120, 240, 365, 1000, 1440] header_fill_color = [ "#d9d9d9", # No - abu netral "#add8e6", # Tgl Beli - biru muda (tanggal = waktu) "#9be7a3", # Harga Beli/g - hijau terang (uang masuk) "#fdd9a0", # Berat - oranye terang (fisik) "#f4b6c2", # Modal - merah muda (biaya awal) "#87cefa", # Tgl Jual - biru langit (tanggal = waktu) "#b2fab4", # Harga Jual/g - hijau pastel (uang keluar / potensi untung) "#fff5ba", # Nilai Jual - kuning pastel (nilai total) "#ffadc1", # Profit/Loss - merah muda (untung/rugi) ] cells_fill_color = [ "#eeeeee", # No - abu netral lebih lembut "#e6f2ff", # Tgl Beli "#d5fbe3", # Harga Beli/g "#ffecd9", # Berat "#ffe0e8", # Modal "#e0f2ff", # Tgl Jual "#dcfce7", # Harga Jual/g "#fff9db", # Nilai Jual "#ffe6ef", # Profit/Loss ] data = None data_dir = "data" data_path = os.path.join(data_dir, "data.json") os.makedirs(data_dir, exist_ok=True) makeslcy = lambda x: -0.575 - (7 - x) * (0.575 / 7) * 5 data = None def ambil_data_emas(): global data later_day = False jam_sudah_cukup = False days_diff = 0 data = data or rf() data_is_ready = ir(data) # os.path.exists(data_path) print("data_is_ready", data_is_ready) if data_is_ready: # with open(data_path, "r") as f: data = json.load(f) # Ambil tanggal terakhir dari lastUpdate last_update_date = max([pd.to_datetime(d["lastUpdate"]) for d in data["data"]["priceList"]]).date() # Waktu sekarang now = datetime.now() # Periksa apakah tanggal hari ini lebih baru dari tanggal terakhir later_day = now.date() > last_update_date print(later_day, now.date(), last_update_date) days_diff = int((now.date() - last_update_date).days) print(days_diff) # Periksa apakah jam sudah lewat dari jam 11 pagi jam_sudah_cukup = now.hour >= 11 print(jam_sudah_cukup) data_is_change = (later_day and jam_sudah_cukup) or not data_is_ready or days_diff >= 2 print("data_is_change", data_is_change) # Jika belum ada data, atau sudah lewat tanggal dan cukup jam if data_is_change: url = f"https://sahabat.pegadaian.co.id/gold/prices/chart?interval={max(lhs)}&isRequest=true" response = requests.get(url) if response.status_code != 200: raise Exception("Gagal mengambil data harga dari Pegadaian.") data = response.json() uf(FILEPATH, json.dumps(data, indent=4)) try: with open(data_path, "w") as f: json.dump(data, f, indent=4) except: pass print(len(data["data"]["priceList"])) return data fred = { 60: "D", 90: "2D", 180: "3D", 360: "4D", 480: "5D", 1000: "3W", 2500: "6W", "Default": "9W" } frek = list(fred.keys()) frev = list(fred.values()) default_hari = 90 def get_freq(lama_hari): if len(frek) !=len(frev): raise Exception("Len Frek !=Len Frev") freq = frev[-1] for i in range(len(frek)): if frek[i] !=frek[-1] and lama_hari <=int(frek[i]) and lama_hari >=int(frek[i-1] if frek[i-1] !=frek[-1] else 0): freq = frev[i] break return freq # Data pembelian tanggal_beli = [ pd.Timestamp(d) for d in [ # "2025-04-10", "2025-04-14", "2025-06-04", "2025-06-08", "2025-06-10" ] ] berat_gram = [ # 1, 0.0101, 1.0817, 0.2182, 0.0816, ] uang_awal = [ # 1_671_000, 18_648, 2_000_000, 400_000, 150_000, ] harga_beli_dan_jual_pada_saat_membeli = [ [1_863_000, 1_797_000], [1_834_000, 1_769_000], [1_840_000, 1_775_000] ] harga_beli_dan_jual_saat_ini = [1_840_000, 1_775_000] tglf = lambda tgl: pd.to_datetime(tgl, format='%Y-%m-%d %H:%M:%S') cwta = [2.5, 6.6, 11.75, 7, 10, 6.6, 12.5, 16.6, 11] misy = "-" data = ambil_data_emas() # Ambil timestamp string dari data timestamp_utc = data["timestamp"] # Parsing ISO format ke datetime object (timezone-aware UTC) dt_utc = datetime.fromisoformat(timestamp_utc.replace("Z", "+00:00")) # Konversi ke zona waktu WIB (UTC+7) wib = pytz.timezone("Asia/Jakarta") dt_wib = dt_utc.astimezone(wib) # Format menjadi string lokal timestamp_lokal = dt_wib.strftime("%d %B %Y, %H:%M WIB")