|
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", |
|
"#add8e6", |
|
"#9be7a3", |
|
"#fdd9a0", |
|
"#f4b6c2", |
|
"#87cefa", |
|
"#b2fab4", |
|
"#fff5ba", |
|
"#ffadc1", |
|
] |
|
|
|
cells_fill_color = [ |
|
"#eeeeee", |
|
"#e6f2ff", |
|
"#d5fbe3", |
|
"#ffecd9", |
|
"#ffe0e8", |
|
"#e0f2ff", |
|
"#dcfce7", |
|
"#fff9db", |
|
"#ffe6ef", |
|
] |
|
|
|
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) |
|
|
|
print("data_is_ready", data_is_ready) |
|
if data_is_ready: |
|
|
|
|
|
|
|
last_update_date = max([pd.to_datetime(d["lastUpdate"]) for d in data["data"]["priceList"]]).date() |
|
|
|
|
|
now = datetime.now() |
|
|
|
|
|
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) |
|
|
|
|
|
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) |
|
|
|
|
|
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 |
|
|
|
|
|
tanggal_beli = [ |
|
pd.Timestamp(d) for d in [ |
|
|
|
"2025-04-14", |
|
"2025-06-04", |
|
"2025-06-08", |
|
"2025-06-10" |
|
] |
|
] |
|
berat_gram = [ |
|
|
|
0.0101, |
|
1.0817, |
|
0.2182, |
|
0.0816, |
|
] |
|
uang_awal = [ |
|
|
|
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() |
|
|
|
|
|
timestamp_utc = data["timestamp"] |
|
|
|
|
|
dt_utc = datetime.fromisoformat(timestamp_utc.replace("Z", "+00:00")) |
|
|
|
|
|
wib = pytz.timezone("Asia/Jakarta") |
|
dt_wib = dt_utc.astimezone(wib) |
|
|
|
|
|
timestamp_lokal = dt_wib.strftime("%d %B %Y, %H:%M WIB") |