#!/usr/bin/env python3 """Search РГБ (Russian State Library) via libgen.vg biblioservice. JSON, paginated. Usage: rsl.py "query" [maxpages] Polite: 3s between page requests.""" import sys, time, json, urllib.parse, urllib.request UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36" def fetch(url, tries=3): last = None for i in range(tries): try: req = urllib.request.Request(url, headers={"User-Agent": UA}) return urllib.request.urlopen(req, timeout=90).read().decode("utf-8", "replace") except Exception as e: last = e time.sleep(5 + 5 * i) raise SystemExit(f"fetch failed: {last}") def main(): q = sys.argv[1] maxpages = int(sys.argv[2]) if len(sys.argv) > 2 else 2 seen = set() for page in range(1, maxpages + 1): url = "https://libgen.vg/biblioservice.php?" + urllib.parse.urlencode( {"value": q, "type": "rsl", "format": "json", "page": page}) try: d = json.loads(fetch(url)) except SystemExit: print("(fetch failed)") break recs = {k: v for k, v in d.items() if k != "error"} if not recs: if page == 1: print("(no records)") break new = 0 for k in sorted(recs, key=int): r = recs[k] if r["id"] in seen: continue seen.add(r["id"]) new += 1 title = " ".join(r.get("title", [])) + ( (" : " + r["title_add"]) if r.get("title_add") else "") author = "; ".join(r.get("author", [])) pub = " ".join(r.get("publisher", [])) city = " ".join(r.get("city", [])) year = " ".join(r.get("year", [])) pages = " ".join(r.get("pages", [])) isbn = ", ".join(r.get("505_isbn", [])) series = " ".join(r.get("series_name", [])) print(f"[{r['id']}] {title}") print(f" {author}") print(f" {city} : {pub}, {year} | {pages} | {isbn}" + (f" | серия: {series}" if series else "")) if new == 0: break time.sleep(3) if __name__ == "__main__": main()