|
import os
|
|
import requests
|
|
import pandas as pd
|
|
from plotly.subplots import make_subplots
|
|
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 uf(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}")
|
|
|
|
rf = lambda: base64.b64decode(response.json()['content']).decode() if (response := requests.get(FILEURL, headers=HEADERS)).status_code == 200 else "{}"
|
|
|
|
ir = lambda: json.loads(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
|
|
|
|
def ambil_data_emas():
|
|
data_is_ready = ir()
|
|
data_is_change = False
|
|
later_day = False
|
|
jam_sudah_cukup = False
|
|
|
|
if data_is_ready:
|
|
|
|
data = json.loads(rf())
|
|
|
|
|
|
last_updates = [pd.to_datetime(d["lastUpdate"]) for d in data["data"]["priceList"]]
|
|
last_update_date = max(last_updates)
|
|
|
|
|
|
now = datetime.now()
|
|
|
|
|
|
later_day = now.date() > last_update_date.date()
|
|
|
|
|
|
jam_sudah_cukup = now.hour >= 11
|
|
|
|
data_is_change = (later_day and jam_sudah_cukup) or not data_is_ready
|
|
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))
|
|
with open(data_path, "w") as f:
|
|
json.dump(data, f, indent=4)
|
|
|
|
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") |