import subprocess, json, urllib.request import re # Fetch menu headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} req = urllib.request.Request('https://api.kfcvietnam.com.vn/menu/kfcvn-generic-menu', headers=headers) with urllib.request.urlopen(req) as resp: data = json.loads(resp.read().decode('utf-8')) subcats = data['categories'][0]['categories'] base_prices = { 'gà rán': 37000, 'miếng gà': 37000, # mostly 37k standard 'gà quay': 43000, 'gà tương tỏi': 42000, 'gà mắm tỏi': 40000, 'burger gà yo': 30000, 'burger tôm': 45000, 'burger zinger': 56000, 'burger gà quay': 56000, 'mì ý xúc xích gà': 38000, 'mì ý xúc xích': 38000, 'mì ý gà viên': 43000, 'mì ý gà rán': 68000, 'cơm gà rán': 49000, 'cơm gà quay': 54000, 'khoai tây chiên (vừa)': 20000, 'khoai chiên (vừa)': 20000, 'khoai tây chiên vừa': 20000, 'khoai tây chiên (lớn)': 30000, 'khoai tây chiên (đại)': 40000, 'khoai tây nghiền (vừa)': 13000, 'khoai tây nghiền (lớn)': 23000, 'bắp cải trộn (lớn)': 23000, 'bắp cải trộn (vừa)': 13000, 'bánh trứng': 20000, 'gà viên (vừa)': 40000, 'gà viên popcorn (vừa)': 40000, 'tender': 14000, # 3 pieces = 42k 'pepsi (tiêu chuẩn)': 13000, 'pepsi tiêu chuẩn': 13000, 'pepsi (vừa)': 17000, 'pepsi vừa': 17000, 'pepsi (đại)': 20000, 'pepsi đại': 20000, 'súp rong biển': 20000, 'cơm gà nanban': 40000 } def guess_value(item_str): item_str = item_str.lower() for k, v in base_prices.items(): if k in item_str: return v if 'pepsi' in item_str: return 13000 if 'khoai tây' in item_str: return 20000 if 'burger' in item_str: return 30000 if 'cơm' in item_str: return 49000 if 'mì ý' in item_str: return 38000 if 'gà' in item_str: return 37000 return 0 header = ["Danh Mục", "Tên Sản Phẩm", "Loại", "Giá Bán (VND)", "Giá Gốc (VND)", "Chiết Khấu (%)", "Thành Phần", "Giá Trị Thành Phần (ước tính)"] rows = [header] for sc in subcats: cname = sc.get('name') for p in sc.get('products') or []: for it in p.get('items') or []: price = int(it.get('price', 0)) if price == 0: continue strike = int(it.get('strikePrice', 0)) vname = '' for dn in it.get('dname', []): if dn.get('lang') == 'vn': vname = dn.get('value').strip() if not vname: vname = it.get('name') vdesc = '' for ds in it.get('description', []): if ds.get('lang') == 'vn': vdesc = ds.get('value').strip() is_combo = "Combo" in vname or "Deal" in vname or "Xô" in vname or "+" in vdesc loai = "Combo" if is_combo else "Món lẻ" discount = f"{-((strike - price)/strike * 100):.1f}%" if strike > price else "" breakdown_str = "" if is_combo and vdesc: parts = re.split(r'\s*\+\s*', vdesc) # Compute total estimated value total_est = 0 part_vals = [] for part in parts: qty = 1 m = re.match(r'^(\d+)\s+(.+)', part.strip()) if m: qty = int(m.group(1)) part_name = m.group(2) else: part_name = part.strip() val = guess_value(part_name) total_est += qty * val part_vals.append((qty, part_name, val)) # Breakdown bd = [] for qty, pname, val in part_vals: if total_est > 0: alloc = (val * price) / total_est if qty > 1: bd.append(f"{pname}: {alloc:,.0f} x {qty}") else: bd.append(f"{pname}: {alloc:,.0f}") breakdown_str = " | ".join(bd) elif not is_combo: breakdown_str = f"{vname}: {price:,.0f}" rows.append([ cname, vname, loai, str(price), str(strike), discount, vdesc, breakdown_str ]) # Save to JSON with open('sheet_data.json', 'w') as f: json.dump(rows, f) # Call API to update sheet cmd = [ 'python3', '/root/.hermes/profiles/reviewer/skills/productivity/google-workspace/scripts/google_api.py', 'sheets', 'update', '1yNVqn5LcgARSwvpIJdWbg8lCELwki6Rl0bxNrJ5RKUA', 'Sheet1!A1:H200', '--values', json.dumps(rows) ] res = subprocess.run(cmd, capture_output=True, text=True, env={'HERMES_HOME': '/root/.hermes'}) print("Update Output:", res.stdout) if res.stderr: print("Update Error:", res.stderr)