import json, time, urllib.request, urllib.error
KUNCI = json.load(open(".serper_token.json"))["key"]
H = {"X-API-KEY": KUNCI, "Content-Type": "application/json", "User-Agent": "Mozilla/5.0"}
def cari(q, lokasi=None, jumlah=10):
    body = {"q": q, "gl": "id", "hl": "id", "num": jumlah}
    if lokasi: body["location"] = lokasi
    try:
        r = urllib.request.urlopen(urllib.request.Request("https://google.serper.dev/search",
              data=json.dumps(body).encode(), headers=H), timeout=90)
        return json.loads(r.read())
    except urllib.error.HTTPError as e:
        return {"err": e.code, "msg": e.read().decode("utf-8","replace")[:200]}
    except Exception as e:
        return {"err": str(e)[:120]}
for q, lok in [("jasa seo surabaya","Surabaya, Indonesia"), ("bengkel mobil surabaya","Surabaya, Indonesia"), ("jasa seo surabaya",None)]:
    d = cari(q, lok)
    if "err" in d:
        print("ERR", q, lok, d); continue
    print("="*70)
    print("kueri:", q, "| lokasi:", lok)
    print("  keys:", [k for k in d.keys()])
    lp = d.get("places") or d.get("localPack")
    print("  local pack:", type(lp).__name__, len(lp) if isinstance(lp,list) else lp)
    if isinstance(lp, list):
        for p in lp[:5]:
            print("     -", str(p.get("title"))[:50], "|", p.get("address"), "|", p.get("rating"), p.get("ratingCount"))
    print("  related:", [s.get("query") for s in (d.get("relatedSearches") or [])][:8])
    print("  paa:", [s.get("question") for s in (d.get("peopleAlsoAsk") or [])][:6])
    print("  organic top5:")
    for h in (d.get("organic") or [])[:5]:
        print("     -", str(h.get("link"))[:80])
    time.sleep(0.5)
