npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

wsper-js

v0.1.4

Published

TypeScript library for building reusable ethical scrapers across multiple platforms.

Readme

npm TypeScript Node ESM License

wsper-js

wsper-js adalah library TypeScript/JavaScript untuk scraping, downloader, converter, AI/generative helper, dan utilitas media dengan kontrak respons yang konsisten. README ini disusun ulang agar menjadi manual developer yang lengkap, rapi, dan mudah dipakai saat integrasi ke bot, API server, CLI, atau worker queue.

Dokumentasi API di bawah dibuat dari snapshot source src/ yang tersedia: class scraper, method publik, tipe return, credential environment, dan modul utilitas. Tidak ada cookie, token, atau secret asli yang disalin ke README ini.

Status dokumentasi

  • Scraper & Adaptor terdaftar: 164 class.
  • Method publik berkontrak: 360+ method.
  • Mesin Kreasi Grafis Lokal: 12 generator kartu (modules/creation).
  • Toolkit Manipulasi Gambar: 15 fungsi sharp (modules/image-tools).
  • Variabel environment terdokumentasi: 31 variabel.
  • Format respons utama: WsperResponse<TData> untuk sukses dan gagal.
  • README ini aman untuk dipublish karena memakai placeholder, bukan credential asli.

Daftar isi

Instalasi

npm install wsper-js
# atau
pnpm add wsper-js
# atau
yarn add wsper-js

Prasyarat runtime

| Komponen | Wajib | Catatan | |---|:---:|---| | Node.js >=18 | Ya | Node.js 20+ direkomendasikan untuk ESM, fetch, Blob, FormData, dan performa runtime yang lebih stabil. | | TypeScript | Tidak | Hanya diperlukan jika project memakai TS langsung. | | yt-dlp | Opsional | Dibutuhkan oleh YouTube/Spotify downloader yang memakai binary eksternal. | | ffmpeg dan ffprobe | Opsional | Dibutuhkan untuk ekstraksi/konversi audio-video. | | Cookie/token/API key | Opsional | Hanya untuk scraper yang membutuhkan akses terotentikasi atau endpoint gated. |

Quick start

Kontrak Spotify dan YouTube

SpotifyScraper tetap mengembalikan WsperResponse, tetapi data sekarang memakai nama field stabil yang sama dengan fixture yt/spotify_*.json: title, duration_ms, duration, cover_url, pagination, dan results/tracks. Spotify metadata membutuhkan Client Credentials dari environment atau constructor; example tidak menyimpan credential.

YouTubeScraper mengembalikan objek raw yt-dlp dalam data, mempertahankan field snake_case seperti fixture yt/video.json, yt/search.json, dan yt/playlist.json. getChannel() mengambil koleksi videos, shorts, streams, dan playlists; gunakan getChannelSection() bila hanya membutuhkan satu koleksi. Semua operasi yt-dlp, download, dan ffmpeg melewati queue per instance; getQueueState() menampilkan jumlah job aktif dan menunggu.

Runtime didukung di Windows, Linux, dan macOS. Berikan yt-dlp/ffmpeg pada PATH, atau gunakan YouTubeScraper.create() agar binary resolver memilih yt-dlp atau fallback python3 -m yt_dlp di Linux/macOS (python di Windows).

ESM JavaScript

import { InstagramScraper } from "wsper-js";

const instagram = new InstagramScraper({
  debug: true,
  queue: { concurrency: 1, intervalMs: 1000, intervalCap: 1 },
  http: { timeoutMs: 30_000, retries: 1 },
});

const result = await instagram.getProfile("instagram");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

TypeScript

import { YouTubeScraper } from "wsper-js";
import type { WsperResponse } from "wsper-js";

const youtube = new YouTubeScraper({
  ytdlpPath: "yt-dlp",
  ffmpegPath: "ffmpeg",
  ffprobePath: "ffprobe",
  outputDir: "./downloads/youtube",
});

const result: WsperResponse<unknown> = await youtube.searchVideos("lofi", { limit: 5 });
if (!result.ok) throw new Error(result.error?.message ?? "Unknown wsper-js error");
console.log(result.data);

Creation Engine (Mesin Kartu & Grafis)

wsper-js menyertakan Creation Engine lokal berperforma tinggi menggunakan @napi-rs/canvas. Seluruh kartu digambar secara native di memori tanpa bergantung pada API eksternal atau browser headless.

Contoh Pembuatan Kartu Kutipan & Profil

import { WsperScraper, createQuoteCard, createProfileCard } from "wsper-js";

const wsper = new WsperScraper();

// 1. Kartu Kutipan / Lirik
const quoteBuffer = await wsper.creation.quote({
  quote: "Any fool can write code that a computer can understand. Good programmers write code that humans can understand.",
  author: "Martin Fowler",
  title: "Clean Code",
  theme: "gradient",
});

// 2. Kartu Profil Pengguna / Game
const profileBuffer = await wsper.creation.profile({
  username: "WSPER DEVELOPER",
  tag: "#0001",
  level: 42,
  currentXp: 8500,
  requiredXp: 10000,
  badges: ["CORE", "VIP", "CONTRIBUTOR"],
});

// 3. Kartu Repositori GitHub
const repoBuffer = await wsper.creation.repository({
  name: "wsper-js",
  owner: "neira-project",
  description: "Next-generation multi-agent scraping & creation engine library.",
  language: "TypeScript",
  stars: 1250,
  forks: 320,
});

Generator yang Tersedia

| Method | Deskripsi | Return | |---|---|---| | wsper.creation.quote(options) | Kartu kutipan / quote aesthetic | Promise<Buffer> (PNG) | | wsper.creation.welcome(options) | Banner ucapan selamat datang member baru | Promise<Buffer> (PNG) | | wsper.creation.goodbye(options) | Banner ucapan perpisahan member | Promise<Buffer> (PNG) | | wsper.creation.profile(options) | Kartu profil dengan XP progress bar & badge | Promise<Buffer> (PNG) | | wsper.creation.rank(options) | Kartu rank dengan progress bar | Promise<Buffer> (PNG) | | wsper.creation.leaderboard(options) | Infografis leaderboard top skor | Promise<Buffer> (PNG) | | wsper.creation.meme(options) | Classic impact top/bottom text meme | Promise<Buffer> (PNG) | | wsper.creation.collage(options) | Grid kolase multi-gambar | Promise<Buffer> (PNG) | | wsper.creation.poster(options) | Poster pengumuman & promosi event | Promise<Buffer> (PNG) | | wsper.creation.qr(options) | Kartu QR code bermerek resolusi tinggi | Promise<Buffer> (PNG) | | wsper.creation.repository(options) | Kartu preview repositori Git | Promise<Buffer> (PNG) | | wsper.creation.levelUp(options) | Banner perayaan kenaikan level | Promise<Buffer> (PNG) |

Sharp Image Processing Toolkit

Toolkit manipulasi gambar berbasis sharp dengan proteksi bawaan terhadap decompression bomb (maksimal 64 MegaPixels) dan batas dimensi maksimal 8192px.

import {
  resizeImage,
  cropImage,
  blurImage,
  convertFormat,
  watermarkImage,
  getImageMetadata,
} from "wsper-js";

// Metadata inspeksi
const meta = await getImageMetadata(imageBuffer);
console.log(`Dimensi: ${meta.width}x${meta.height}, Format: ${meta.format}`);

// Resize & Konversi ke WebP
const webpBuffer = await convertFormat(imageBuffer, {
  format: "webp",
  quality: 85,
});

// Watermark
const watermarked = await watermarkImage(imageBuffer, {
  watermark: logoBuffer,
  position: "bottom-right",
  margin: 24,
});

Kontrak response

Semua scraper sebaiknya diperlakukan sebagai operasi I/O yang bisa gagal. Jangan langsung akses data tanpa memeriksa ok. Pola ini mengurangi crash runtime—bot tidak perlu “pingsan dramatis” hanya karena satu endpoint sedang rewel.

export interface WsperResponse<TData> {
  ok: boolean;
  statusCode: number;
  data: TData | null;
  error: { code: string; message: string; details?: Record<string, unknown> } | null;
  meta: {
    statusCode: number;
    sourceUrl: string;
    fetchedAt: string;
    durationMs: number;
  };
}

Pola handler yang disarankan

function unwrapWsper<T>(result: WsperResponse<T>): T {
  if (!result.ok || result.data === null) {
    throw new Error(`${result.error?.code ?? "WSPER_ERROR"}: ${result.error?.message ?? "Unknown error"}`);
  }
  return result.data;
}

Konfigurasi global

Sebagian besar scraper menerima opsi berbasis ScraperOptions:

export interface ScraperOptions {
  credentials?: string | {
    cookie?: string;
    csrfToken?: string;
    bearerToken?: string;
    apiKey?: string;
    userAgent?: string;
    bxUa?: string;
    bxUmidtoken?: string;
  };
  debug?: boolean;
  http?: {
    timeoutMs?: number;
    retries?: number;
    retryDelayMs?: number;
    maxRetryAfterMs?: number;
    maxRedirects?: number;
    headers?: Record<string, string>;
    userAgent?: string;
    allowPrivateNetwork?: boolean;
  };
  queue?: {
    concurrency?: number;
    intervalMs?: number;
    intervalCap?: number;
    minDelayMs?: number;
    maxDelayMs?: number;
    timeoutMs?: number;
    retries?: number;
  };
  baseUrl?: string;
}

Queue aman untuk produksi

const safeQueue = {
  concurrency: 1,
  intervalMs: 1000,
  intervalCap: 1,
  minDelayMs: 500,
  maxDelayMs: 1500,
};

Gunakan concurrency kecil untuk platform sosial, dan naikkan bertahap hanya untuk API publik yang memang stabil. Untuk bot WhatsApp, tetap pasang limiter di layer command supaya user tidak spam command sebelum job sebelumnya selesai.

Credential dan environment

Urutan resolusi credential yang direkomendasikan: constructor credentials → registry runtime setPlatformCredential() → environment variable → mode publik. Jangan commit cookie/token ke repository.

| Variabel | Deskripsi | |---|---| | DOLA_COOKIE | Alias kompatibilitas untuk cookie Dola. | | QWEN_BX_UA | Alias kompatibilitas untuk bx-ua Qwen. | | QWEN_BX_UMIDTOKEN | Alias kompatibilitas untuk bx-umidtoken Qwen. | | QWEN_COOKIE | Alias kompatibilitas untuk cookie Qwen. | | QWEN_TOKEN | Alias kompatibilitas untuk token Qwen. | | REMOVEBG_API_KEY | API key remove.bg. | | WSPER_ALLOW_MOCK_BASE_URL | Flag untuk mengizinkan mock base URL dalam test/sandbox. | | WSPER_BILIBILI_COOKIE | Cookie Bilibili untuk stream/metadata yang membutuhkan login. | | WSPER_CAI_TOKEN | Token Character.AI. | | WSPER_DOLA_COOKIE | Cookie Dola chat jika digunakan. | | WSPER_DREAMINA_COOKIE | Cookie Dreamina jika memakai mode web. | | WSPER_DREAMINA_TOKEN | Token/API key Dreamina provider. | | WSPER_FACEBOOK_COOKIE | Cookie sesi Facebook untuk profil/post yang gated. | | WSPER_INSTAGRAM_COOKIE | Cookie sesi Instagram untuk data yang membutuhkan login/rate-limit lebih longgar. | | WSPER_MOCK_BASE_URL | Base URL mock server untuk testing lokal. | | WSPER_PINTEREST_COOKIE | Cookie sesi Pinterest. | | WSPER_PIXIV_COOKIE | Cookie Pixiv untuk ilustrasi yang membutuhkan sesi. | | WSPER_QWEN_BX_UA | Header bx-ua untuk Qwen jika diperlukan. | | WSPER_QWEN_BX_UMIDTOKEN | Header bx-umidtoken untuk Qwen jika diperlukan. | | WSPER_QWEN_COOKIE | Cookie Qwen Chat Web. | | WSPER_QWEN_TOKEN | Token/Bearer Qwen atau DashScope. | | WSPER_SPOTIFY_CALLBACK_URL | Redirect/callback URL untuk Authorization Code Flow Spotify. | | WSPER_SPOTIFY_CLIENT_ID | Client ID Spotify Developer Dashboard. | | WSPER_SPOTIFY_CLIENT_SECRET | Client Secret Spotify Developer Dashboard. | | WSPER_SPOTIFY_MARKET | Market metadata Spotify, contoh ID. | | WSPER_TERABOX_COOKIE | Cookie Terabox untuk link gated. | | WSPER_THREADS_COOKIE | Cookie sesi Threads. | | WSPER_TIKTOK_COOKIE | Cookie sesi TikTok. | | WSPER_TWITTER_COOKIE | Cookie sesi Twitter/X, biasanya berisi auth_token dan ct0. |

Inject credential lewat constructor

const scraper = new InstagramScraper({
  credentials: {
    cookie: process.env.WSPER_INSTAGRAM_COOKIE,
  },
});

Inject credential saat runtime

import { setPlatformCredential, InstagramScraper } from "wsper-js";

setPlatformCredential("instagram", { cookie: process.env.WSPER_INSTAGRAM_COOKIE ?? "" });
const scraper = new InstagramScraper();

Facade WsperScraper

WsperScraper adalah aggregator untuk beberapa platform populer. Ini berguna jika aplikasi ingin satu instance utama yang membagikan konfigurasi debug, http, queue, dan sebagian credential.

import { WsperScraper } from "wsper-js";

const wsper = new WsperScraper({
  debug: true,
  queue: { concurrency: 1, intervalMs: 1000, intervalCap: 1 },
  credentials: {
    instagram: { cookie: process.env.WSPER_INSTAGRAM_COOKIE },
    twitter: { cookie: process.env.WSPER_TWITTER_COOKIE },
  },
});

const profile = await wsper.instagram.getProfile("instagram");
const video = await wsper.youtube.getVideo("dQw4w9WgXcQ");

Panduan integrasi produksi

Untuk bot WhatsApp / Telegram / Discord

  1. Validasi input user sebelum memanggil scraper.
  2. Pasang queue per kategori berat: sosial/video, AI, image processing, dan API publik.
  3. Simpan job download besar di worker terpisah agar event loop bot tetap responsif.
  4. Selalu kirim respons progres: queued, processing, success, failed.
  5. Jangan lempar credential, cookie, endpoint internal, atau stack trace ke chat user.

Untuk API server

app.get("/api/instagram/:username", async (req, res) => {
  const result = await instagram.getProfile(req.params.username);
  res.status(result.ok ? 200 : result.statusCode || 500).json(result);
});

Untuk worker queue

const job = await queue.add("download-youtube", { url: inputUrl }, {
  attempts: 2,
  backoff: { type: "exponential", delay: 3000 },
  removeOnComplete: true,
});

Katalog scraper

| Kategori | Jumlah | |---|---:| | AI & generative | 12 | | Anime, manga, games & entertainment | 24 | | Finance, economy & commerce | 9 | | Image, design & file converters | 21 | | News, weather & public information | 18 | | Other / utility scrapers | 5 | | Research, open data & developer registries | 17 | | Social, video, audio & downloaders | 33 |

| Scraper | Kategori | Method publik | Credential | |---|---|---:|---| | AioScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | AlkitabScraper | Other / utility scrapers | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | AnilistScraper | Anime, manga, games & entertainment | 7 | Tidak wajib; GraphQL publik bebas diakses. | | AnimeQuoteScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | AnimeRandomScraper | Anime, manga, games & entertainment | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | AppleMusicScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ArenaAiScraper | AI & generative | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ArxivScraper | Research, open data & developer registries | 2 | Tidak wajib; XML export feed bebas diakses. | | AttpScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | BankIndonesiaScraper | Finance, economy & commerce | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | BiliBiliScraper | Social, video, audio & downloaders | 2 | WSPER_BILIBILI_COOKIE | | BimasIslamScraper | Finance, economy & commerce | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | BinanceScraper | Finance, economy & commerce | 4 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | BMKGScraper | News, weather & public information | 6 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | BpsScraper | Finance, economy & commerce | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | CaiScraper | AI & generative | 6 | WSPER_CAI_TOKEN | | CapCutScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ClinicalTrialsScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | CodashopScraper | Finance, economy & commerce | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | CoinGeckoScraper | Finance, economy & commerce | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | CrossrefScraper | Research, open data & developer registries | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | CuacaScraper | News, weather & public information | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DataEuropaScraper | Research, open data & developer registries | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DataGovScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DataGovAuScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DataGovUkScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DbpediaScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DeepAiScraper | AI & generative | 6 | Tidak diperlukan (anonymous browser request key) | | DeepSeekScraper | AI & generative | 5 | WSPER_DEEPSEEK_COOKIE, WSPER_DEEPSEEK_TOKEN | | DetikNewsScraper | News, weather & public information | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DevCommunityScraper | Research, open data & developer registries | 5 | Tidak wajib; Forem API publik. | | DonghubScraper | Social, video, audio & downloaders | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DownrScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DrakorScraper | Anime, manga, games & entertainment | 4 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DramaboxScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | DreaminaScraper | AI & generative | 1 | WSPER_DREAMINA_TOKEN, WSPER_DREAMINA_COOKIE | | EcbScraper | Finance, economy & commerce | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | EdgeTtsScraper | AI & generative | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | EuropePmcScraper | Research, open data & developer registries | 3 | Tidak wajib; EMBL-EBI REST API publik. | | FacebookScraper | Social, video, audio & downloaders | 3 | WSPER_FACEBOOK_COOKIE | | FaceswapScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | FaceswapV2Scraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ForeignNewsScraper | News, weather & public information | 5 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | GDriveScraper | Social, video, audio & downloaders | 2 | credentials object opsional, jika endpoint membutuhkan sesi | | GeminiScraper | AI & generative | 1 | Cookie sesi Gemini Web yang sah melalui credentials.cookie. | | GenshinImpactScraper | Anime, manga, games & entertainment | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | GetrendsScraper | Research, open data & developer registries | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | GithubScraper | Research, open data & developer registries | 3 | Token GitHub opsional (Authorization: Bearer <token>). | | GoogleImageScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | GoqrScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | GutendexScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | HackerNewsScraper | News, weather & public information | 5 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | HalodocScraper | News, weather & public information | 2 | credentials object opsional | | HokInfoScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | HtmlToJpgScraper | Image, design & file converters | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | HuggingFaceScraper | Research, open data & developer registries | 6 | Token Hugging Face opsional. | | Igdl2Scraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | Igdl3Scraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | IkiruMangaScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ImageScraper | Image, design & file converters | 5 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ImgUpscalerScraper | Image, design & file converters | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ImgflipScraper | Image, design & file converters | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | InstagramScraper | Social, video, audio & downloaders | 6 | WSPER_INSTAGRAM_COOKIE | | JabarProvScraper | News, weather & public information | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | KemendagScraper | Finance, economy & commerce | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | KomikindoScraper | Anime, manga, games & entertainment | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | KompasNewsScraper | News, weather & public information | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | LikeeScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | LiquipediaScraper | Anime, manga, games & entertainment | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | LyricsScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MangatoonScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | McAddonScraper | Anime, manga, games & entertainment | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MConverterScraper | Image, design & file converters | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MediafireScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MediaWikiScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MobileLocationScraper | Other / utility scrapers | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ModAndroidScraper | Anime, manga, games & entertainment | 5 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | MyAnimeListScraper | Anime, manga, games & entertainment | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NanoBananaScraper | AI & generative | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NanoBananaV2Scraper | AI & generative | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NasaApodScraper | News, weather & public information | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NominatimScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NyckelScraper | AI & generative | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | NpmRegistryScraper | Research, open data & developer registries | 4 | Tidak wajib; npm registry & download count API publik. | | OcrScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | OpenCanadaScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | OpenFdaScraper | Research, open data & developer registries | 4 | Tidak wajib; US FDA OpenData publik. | | OpenLibraryScraper | Research, open data & developer registries | 4 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | OpenMeteoScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | OpenAlexScraper | Research, open data & developer registries | 4 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | OsvScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PackagistScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PhotoAiScraper | Image, design & file converters | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PinterestScraper | Social, video, audio & downloaders | 3 | WSPER_PINTEREST_COOKIE | | PixivScraper | Anime, manga, games & entertainment | 1 | WSPER_PIXIV_COOKIE | | PlayStoreScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PrimbonScraper | Anime, manga, games & entertainment | 30 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PubgMobileScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | PypiScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | QwenScraper | AI & generative | 1 | WSPER_QWEN_COOKIE, WSPER_QWEN_TOKEN, WSPER_QWEN_BX_UA, WSPER_QWEN_BX_UMIDTOKEN, QWEN_COOKIE, QWEN_TOKEN | | RemovebgScraper | Image, design & file converters | 1 | REMOVEBG_API_KEY | | RemovebgV2Scraper | Image, design & file converters | 1 | REMOVEBG_API_KEY | | ResepScraper | Other / utility scrapers | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | RestCountriesScraper | News, weather & public information | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | RetatubeScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | RorScraper | Research, open data & developer registries | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SakuraNovelScraper | Anime, manga, games & entertainment | 3 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ScribdScraper | Research, open data & developer registries | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SearchwebtoonScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SemanticScholarScraper | Research, open data & developer registries | 4 | API key Semantic Scholar opsional. | | SfileScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SnackvideoScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SnapsaveScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | SoundcloudScraper | Social, video, audio & downloaders | 1 | credentials object opsional | | SpotifyScraper | Social, video, audio & downloaders | 12 | WSPER_SPOTIFY_CLIENT_ID, WSPER_SPOTIFY_CLIENT_SECRET, WSPER_SPOTIFY_CALLBACK_URL, WSPER_SPOTIFY_MARKET | | SswebScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | StackExchangeScraper | Research, open data & developer registries | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | StalkScraper | Other / utility scrapers | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | StickerSearchScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | Sub4unlockScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | TeraboxScraper | Social, video, audio & downloaders | 1 | WSPER_TERABOX_COOKIE | | TextReplaceScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | ThreadsScraper | Social, video, audio & downloaders | 7 | WSPER_THREADS_COOKIE | | TiktokScraper | Social, video, audio & downloaders | 6 | WSPER_TIKTOK_COOKIE | | TopAnimeScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | TtpScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | TwitterScraper | Social, video, audio & downloaders | 10 | WSPER_TWITTER_COOKIE | | UguuScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UnblurVideoScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UnsplashScraper | Other / utility scrapers | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UnwatermarkScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UnwatermarkV2Scraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UpscalerScraper | Image, design & file converters | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UpscalerV3Scraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | UsgsEarthquakeScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | VideyScraper | Social, video, audio & downloaders | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | VisualParadigmScraper | Image, design & file converters | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WallpaperScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WattpadScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | Webp2Mp4Scraper | Social, video, audio & downloaders | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WikidataScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WikimediaCommonsScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WikipediaScraper | News, weather & public information | 2 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WorldBankScraper | Finance, economy & commerce | 4 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | WwCharScraper | Anime, manga, games & entertainment | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | XiaohongshuScraper | Social, video, audio & downloaders | 1 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. | | XiaomiMimoScraper | AI & generative | 2 | credentials object wajib untuk chat tertentu | | YouTubeScraper | Social, video, audio & downloaders | 8 | Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan. |

Dokumentasi per scraper

AI & generative

ArenaAiScraper — arena-ai

  • Nama platform/domain: Arena Ai
  • Source path: src/scrapers/arena-ai/ArenaAiScraper.ts
  • Constructor: ArenaAiScraper(options: ArenaAiScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: ArenaAiScraperOptions, ArenaLeaderboardMeta, ArenaModelItem, ArenaLeaderboardResponse, ArenaCategoryInfo, ArenaCategoriesResponse

| Method | Kegunaan | Return | |---|---|---| | async getCategories(): Promise<WsperResponse<ArenaCategoriesResponse>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<ArenaCategoriesResponse>> | | async getLeaderboard(category = "text"): Promise<WsperResponse<ArenaLeaderboardResponse>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<ArenaLeaderboardResponse>> |

Contoh cepat:

import { ArenaAiScraper } from "wsper-js";

const scraper = new ArenaAiScraper({ debug: true });
const result = await scraper.getCategories();

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

CaiScraper — cai

  • Nama platform/domain: Character.AI
  • Source path: src/scrapers/cai/CaiScraper.ts
  • Constructor: CaiScraper(options: CaiScraperOptions = {})
  • Credential: WSPER_CAI_TOKEN
  • Tipe terkait: CaiScraperOptions, CaiChatParams, CaiChatResult, CaiSearchResult, CaiVoiceResult

| Method | Kegunaan | Return | |---|---|---| | getClient(): CAINode | Get the underlying low-level CAINode client. Useful if you need direct access to all Character.AI endpoints, WebSockets, or events. | CAINode | | async searchCharacters(query: string): Promise<WsperResponse<CaiSearchResult[]>> | Search for characters on Character.AI. @param query The search query (e.g. "Mario") | Promise<WsperResponse<CaiSearchResult[]>> | | async chat(params: CaiChatParams): Promise<WsperResponse<CaiChatResult>> | Send a chat message to a character. | Promise<WsperResponse<CaiChatResult>> | | async disconnectCharacterSession(characterId: string): Promise<boolean> | Disconnect a cached persistent chat session for a character. Chat sessions are intentionally kept online after chat() so repeated messages do not reconnect on every turn. Call this when the character is no longer active in your application. | Promise<boolean> | | async disconnectAllCharacterSessions(): Promise<number> | Disconnect every cached persistent character chat session. Returns the number of sessions that were disconnected. | Promise<number> | | async getVoice(voiceId: string, customPreviewText?: string): Promise<WsperResponse<CaiVoiceResult>> | Get details for a specific voice by its ID. @param voiceId The unique ID of the voice. @param customPreviewText Optional text to update the voice preview. | Promise<WsperResponse<CaiVoiceResult>> |

Contoh cepat:

import { CaiScraper } from "wsper-js";

const scraper = new CaiScraper({ debug: true });
const result = await scraper.searchCharacters("naruto");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

DeepAiScraper — deepai

  • Nama platform/domain: Deepai
  • Source path: src/scrapers/deepai/DeepAiScraper.ts
  • Constructor: DeepAiScraper(options: DeepAiScraperOptions = {})
  • Credential: tidak diperlukan; scraper membuat anonymous browser request key sesaat di memory.
  • Tipe terkait: DeepAiScraperOptions, DeepAiChatHistoryMessage, DeepAiChatOptions, DeepAiChatParserResult, DeepAiChatResponse, DeepAiSessionData, DeepAiMySessionsResponse, DeepAiImageOptions, DeepAiImageResponse

| Method | Kegunaan | Return | |---|---|---| | async getChatSession(uuid: string): Promise<WsperResponse<DeepAiSessionData>> | Retrieves an existing chat session history. | Promise<WsperResponse<DeepAiSessionData>> | | async saveChatSession(uuid: string, messages: DeepAiChatHistoryMessage[], title = ""): Promise<WsperResponse<{ success: boolean }>> | Saves a chat session history. Note: We must NOT send the 'api-key' header to this endpoint as it causes a 500 error. | Promise<WsperResponse<{ success: boolean }>> | | async deleteChatSession(uuid: string): Promise<WsperResponse<{ success: boolean }>> | Deletes a chat session history. Note: We must NOT send the 'api-key' header to this endpoint as it causes a 500 error. | Promise<WsperResponse<{ success: boolean }>> | | async getMyChatSessions(knownUuids: string[] = []): Promise<WsperResponse<DeepAiMySessionsResponse>> | Retrieves list of active sessions. Note: We must NOT send the 'api-key' header to this endpoint as it causes a 500 error. | Promise<WsperResponse<DeepAiMySessionsResponse>> | | async chat(options: DeepAiChatOptions): Promise<WsperResponse<DeepAiChatResponse>> | Sends a chat prompt using DeepAI's chat completion endpoint. | Promise<WsperResponse<DeepAiChatResponse>> | | async generateImage(options: DeepAiImageOptions): Promise<WsperResponse<DeepAiImageResponse>> | Generates an image using DeepAI's text2img API. | Promise<WsperResponse<DeepAiImageResponse>> |

Contoh cepat:

import { DeepAiScraper } from "wsper-js";

const scraper = new DeepAiScraper({ debug: true });
const result = await scraper.chat({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

DeepSeekScraper — deepseek

  • Nama platform/domain: Deepseek
  • Source path: src/scrapers/deepseek/DeepSeekScraper.ts
  • Constructor: DeepSeekScraper(options: DeepSeekScraperOptions = {})
  • Credential: WSPER_DEEPSEEK_COOKIE, WSPER_DEEPSEEK_TOKEN
  • Tipe terkait: DeepSeekScraperOptions, DeepSeekChatParams, DeepSeekChatResult, DeepSeekKeepAliveResult, DeepSeekDeleteResult, DeepSeekPowChallenge

| Method | Kegunaan | Return | |---|---|---| | isConfigured(): boolean | True when both a cookie and a bearer token are configured. | boolean | | async keepAlive(): Promise<WsperResponse<DeepSeekKeepAliveResult>> | Lightweight authenticated ping to keep the DeepSeek session "warm". Most of a chat turn's cost is the PoW solve; this only fetches a PoW challenge (an authenticated POST) without solving it, which is enough to prove the cookie + token are still accepted. Hosts can call this on an interval so the connection behaves like a persistent ("always online") link instead of authenticating cold on every message. Never throws — failures are returned as an ok:false {@link WsperResponse}. | Promise<WsperResponse<DeepSeekKeepAliveResult>> | | async deleteSession(sessionId: string): Promise<WsperResponse<DeepSeekDeleteResult>> | Delete a DeepSeek chat session (the whole conversation) by its chat_session_id, removing it server-side at chat.deepseek.com. Hosts that persist per-user sessions in a database can call this to truly forget a conversation — e.g. when a user resets their chat, or during inactive-user cleanup — so nothing lingers on DeepSeek's side. Never throws — failures are returned as an ok:false {@link WsperResponse}. | Promise<WsperResponse<DeepSeekDeleteResult>> | | async deleteAllSessions(): Promise<WsperResponse<{ deleted: boolean }>> | Delete all DeepSeek chat sessions on this account, clearing all chat room history server-side. Never throws — failures are returned as an ok:false {@link WsperResponse}. | Promise<WsperResponse<{ deleted: boolean }>> | | async chat(params: DeepSeekChatParams): Promise<WsperResponse<DeepSeekChatResult>> | Send a prompt to DeepSeek and stream the reply. Pass sessionId/parentMessageId to continue an existing conversation; omit them to start a new session. The (possibly new) session id and the latest response_message_id are returned so the caller can persist them. | Promise<WsperResponse<DeepSeekChatResult>> |

Contoh cepat:

import { DeepSeekScraper } from "wsper-js";

const scraper = new DeepSeekScraper({ debug: true });
const result = await scraper.chat({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

DreaminaScraper — dreamina

  • Nama platform/domain: Dreamina
  • Source path: src/scrapers/dreamina/DreaminaScraper.ts
  • Constructor: DreaminaScraper(options: DreaminaScraperOptions = {})
  • Credential: WSPER_DREAMINA_TOKEN, WSPER_DREAMINA_COOKIE
  • Tipe terkait: DreaminaProvider, DreaminaScraperOptions, DreaminaGenerateParams, DreaminaGenerateResult

| Method | Kegunaan | Return | |---|---|---| | async generateImage(params: DreaminaGenerateParams): Promise<WsperResponse<DreaminaGenerateResult>> | Generates images based on prompt and chosen provider. | Promise<WsperResponse<DreaminaGenerateResult>> |

Contoh cepat:

import { DreaminaScraper } from "wsper-js";

const scraper = new DreaminaScraper({ debug: true });
const result = await scraper.generateImage({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

EdgeTtsScraper — edge-tts

  • Nama platform/domain: Edge Tts
  • Source path: src/scrapers/edge-tts/EdgeTtsScraper.ts
  • Constructor: EdgeTtsScraper(options: EdgeTtsScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: EdgeTtsScraperOptions, EdgeTtsVoice, EdgeTtsSynthesizeOptions, EdgeTtsWordBoundary, EdgeTtsAudioResponse

| Method | Kegunaan | Return | |---|---|---| | async getVoices(): Promise<WsperResponse<EdgeTtsVoice[]>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<EdgeTtsVoice[]>> | | async synthesize(text: string, voice: string = DEFAULT_VOICE, options: EdgeTtsSynthesizeOptions = {}): Promise<WsperResponse<EdgeTtsAudioResponse>> | Method publik yang diekspor oleh scraper ini. | Promise<WsperResponse<EdgeTtsAudioResponse>> |

Contoh cepat:

import { EdgeTtsScraper } from "wsper-js";

const scraper = new EdgeTtsScraper({ debug: true });
const result = await scraper.getVoices();

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

GeminiScraper — gemini

  • Nama platform/domain: Gemini
  • Source path: src/scrapers/gemini/GeminiScraper.ts
  • Constructor: GeminiScraper(options: GeminiScraperOptions = {})
  • Credential: Cookie sesi Gemini Web yang sah melalui credentials.cookie.
  • Tipe terkait: GeminiScraperOptions, GeminiChatParams, GeminiChatResult

| Method | Kegunaan | Return | |---|---|---| | async chat(params: GeminiChatParams): Promise<WsperResponse<GeminiChatResult>> | Send a chat prompt to Gemini. | Promise<WsperResponse<GeminiChatResult>> |

Contoh cepat:

import { GeminiScraper } from "wsper-js";

const cookie = process.env.GEMINI_COOKIE?.trim();
if (!cookie) {
  throw new Error("GEMINI_COOKIE is required.");
}

const scraper = new GeminiScraper({ credentials: { cookie } });
const result = await scraper.chat({
  prompt: "Halo",
  sessionKey: "stable-chat-id"
});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

Gunakan sessionKey yang stabil untuk setiap percakapan agar pesan berurutan tidak berlomba memakai state sesi yang sama. GEMINI_AUTH_REQUIRED berarti cookie tidak lagi menghasilkan bootstrap terautentikasi dan harus diperbarui oleh operator. GEMINI_BOOTSTRAP_SCHEMA_CHANGED berarti halaman terautentikasi tidak lagi memuat field request yang dibutuhkan. Error autentikasi dan schema tidak di-retry; HTTP 429/5xx dan gangguan jaringan tetap mengikuti retry terbatas.

Scraper mempertahankan pembaruan Set-Cookie pada instance. Opsi session: { cachePath, refresh: true } mengaktifkan cache privat dan pembaruan sesi Google tanpa proses browser. Simpan cache di direktori privat yang diabaikan Git. Setelah semua chat selesai, panggil await scraper.dispose() untuk menghentikan timer dan menyelesaikan penulisan cache. scraper.getSessionHealth() memberi status tanpa nilai cookie. Sesi yang ditolak Google tetap menghasilkan error autentikasi; HTTP 200 dari pembaruan cookie belum membuktikan akses chat berhasil. Bukti dan batas pengujian integrasi bot dicatat di ../Oblivinx-v3/securityandupdate/reliability/GEMINI_SESSION_RELIABILITY.md.

NanoBananaScraper — nanobanana

  • Nama platform/domain: Nanobanana
  • Source path: src/scrapers/nanobanana/NanoBananaScraper.ts
  • Constructor: NanoBananaScraper(options: NanoBananaScraperOptions & { maxPollAttempts?: number; pollIntervalMs?: number } = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: NanoBananaScraperOptions, NanoBananaResult

| Method | Kegunaan | Return | |---|---|---| | async edit(buffer: Buffer, prompt: string): Promise<WsperResponse<NanoBananaResult>> | Method publik yang diekspor oleh scraper ini. | Promise<WsperResponse<NanoBananaResult>> |

Contoh cepat:

import { NanoBananaScraper } from "wsper-js";

const scraper = new NanoBananaScraper({ debug: true });
const result = await scraper.edit(Buffer.from("..."), "hello world");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

NanoBananaV2Scraper — nanobanana-v2

  • Nama platform/domain: Nanobanana V2
  • Source path: src/scrapers/nanobanana-v2/NanoBananaV2Scraper.ts
  • Constructor: NanoBananaV2Scraper(options: NanoBananaV2ScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: NanoBananaV2ScraperOptions, NanoBananaV2Result

| Method | Kegunaan | Return | |---|---|---| | async edit(buffer: Buffer, prompt: string): Promise<WsperResponse<NanoBananaV2Result>> | Edits an image according to prompt. Returns the result URL when the upstream response includes one — always check raw too since the schema is unofficial. | Promise<WsperResponse<NanoBananaV2Result>> |

Contoh cepat:

import { NanoBananaV2Scraper } from "wsper-js";

const scraper = new NanoBananaV2Scraper({ debug: true });
const result = await scraper.edit(Buffer.from("..."), "hello world");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

NyckelScraper — nyckel

  • Nama platform/domain: Nyckel
  • Source path: src/scrapers/nyckel/NyckelScraper.ts
  • Constructor: NyckelScraper(options: NyckelScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: NyckelScraperOptions, NyckelIdentifyResult

| Method | Kegunaan | Return | |---|---|---| | async identifyImage(input: string \| Buffer, options?: { filename?: string }): Promise<WsperResponse<NyckelIdentifyResult>> | Method publik yang diekspor oleh scraper ini. | Promise<WsperResponse<NyckelIdentifyResult>> |

Contoh cepat:

import { NyckelScraper } from "wsper-js";

const scraper = new NyckelScraper({ debug: true });
const result = await scraper.identifyImage({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

QwenScraper — qwen

  • Nama platform/domain: Qwen
  • Source path: src/scrapers/qwen/QwenScraper.ts
  • Constructor: QwenScraper(options: QwenScraperOptions = {})
  • Credential: WSPER_QWEN_COOKIE, WSPER_QWEN_TOKEN, WSPER_QWEN_BX_UA, WSPER_QWEN_BX_UMIDTOKEN, QWEN_COOKIE, QWEN_TOKEN
  • Tipe terkait: QwenScraperOptions, QwenChatParams, QwenChatResult

| Method | Kegunaan | Return | |---|---|---| | async chat(params: QwenChatParams): Promise<WsperResponse<QwenChatResult>> | Send a chat prompt to Qwen. | Promise<WsperResponse<QwenChatResult>> |

Contoh cepat:

import { QwenScraper } from "wsper-js";

const scraper = new QwenScraper({ debug: true });
const result = await scraper.chat({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

XiaomiMimoScraper — xiaomi-mimo

  • Nama platform/domain: Xiaomi Mimo
  • Source path: src/scrapers/xiaomi-mimo/XiaomiMimoScraper.ts
  • Constructor: XiaomiMimoScraper(options: XiaomiMimoScraperOptions = {})
  • Credential: credentials object wajib untuk chat tertentu
  • Tipe terkait: XiaomiMimoScraperOptions, XiaomiMimoModelConfig, XiaomiMimoVoice, XiaomiMimoBotConfig, XiaomiMimoMessage, XiaomiMimoChatParams, XiaomiMimoChatResult

| Method | Kegunaan | Return | |---|---|---| | async getBotConfig(): Promise<WsperResponse<XiaomiMimoBotConfig>> | Fetches the public AI Studio playground configuration. Includes available models, voices (TTS), and recommended questions. | Promise<WsperResponse<XiaomiMimoBotConfig>> | | async chat(params: XiaomiMimoChatParams): Promise<WsperResponse<XiaomiMimoChatResult>> | Calls the OpenAI-compatible chat completion endpoint. Supports standard completion and SSE streaming. | Promise<WsperResponse<XiaomiMimoChatResult>> |

Contoh cepat:

import { XiaomiMimoScraper } from "wsper-js";

const scraper = new XiaomiMimoScraper({ debug: true });
const result = await scraper.chat({});

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

Social, video, audio & downloaders

AioScraper — aio

  • Nama platform/domain: AIO
  • Source path: src/scrapers/aio/AioScraper.ts
  • Constructor: AioScraper(options: AioScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: AioScraperOptions, AioMedia, AioResult

| Method | Kegunaan | Return | |---|---|---| | async download(url: string): Promise<WsperResponse<AioResult>> | Mengambil metadata lalu mengunduh/meresolve asset. | Promise<WsperResponse<AioResult>> |

Contoh cepat:

import { AioScraper } from "wsper-js";

const scraper = new AioScraper({ debug: true });
const result = await scraper.download("https://example.com/item");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

AppleMusicScraper — apple-music

  • Nama platform/domain: Apple Music
  • Source path: src/scrapers/apple-music/AppleMusicScraper.ts
  • Constructor: AppleMusicScraper(options: AppleMusicScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: AppleMusicScraperOptions, AppleMusicHeroItem, AppleMusicTrackLockup, AppleMusicProductLockup, AppleMusicNewReleases

| Method | Kegunaan | Return | |---|---|---| | async getNewReleases(storefront?: string): Promise<WsperResponse<AppleMusicNewReleases>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<AppleMusicNewReleases>> |

Contoh cepat:

import { AppleMusicScraper } from "wsper-js";

const scraper = new AppleMusicScraper({ debug: true });
const result = await scraper.getNewReleases();

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

BiliBiliScraper — bilibili

  • Nama platform/domain: Bilibili
  • Source path: src/scrapers/bilibili/BiliBiliScraper.ts
  • Constructor: BiliBiliScraper(options: BiliBiliScraperOptions = {})
  • Credential: WSPER_BILIBILI_COOKIE
  • Tipe terkait: BiliBiliScraperOptions, BiliBiliVideoStream, BiliBiliVideoInfo, BiliBiliSearchItem, BiliBiliSearchResult

| Method | Kegunaan | Return | |---|---|---| | async search(query: string, page = 1): Promise<WsperResponse<BiliBiliSearchResult>> | Search for videos on bilibili.com. @param query - Search keyword @param page - Page number (1-based) | Promise<WsperResponse<BiliBiliSearchResult>> | | async getVideoInfo(input: string): Promise<WsperResponse<BiliBiliVideoInfo>> | Fetch detailed info and available streams for a Bilibili video. @param input - Full bilibili.com URL (https://www.bilibili.com/video/BVxxx) or a bare BV ID string (BV1xxxxxxxxxxxx) | Promise<WsperResponse<BiliBiliVideoInfo>> |

Contoh cepat:

import { BiliBiliScraper } from "wsper-js";

const scraper = new BiliBiliScraper({ debug: true });
const result = await scraper.search("naruto");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

CapCutScraper — capcut

  • Nama platform/domain: Capcut
  • Source path: src/scrapers/capcut/CapCutScraper.ts
  • Constructor: CapCutScraper(options: CapCutScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: CapCutScraperOptions, CapCutDownloadResult

| Method | Kegunaan | Return | |---|---|---| | async download(url: string): Promise<WsperResponse<CapCutDownloadResult>> | Mengambil metadata lalu mengunduh/meresolve asset. | Promise<WsperResponse<CapCutDownloadResult>> |

Contoh cepat:

import { CapCutScraper } from "wsper-js";

const scraper = new CapCutScraper({ debug: true });
const result = await scraper.download("https://example.com/item");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

DonghubScraper — donghub

  • Nama platform/domain: Donghub
  • Source path: src/scrapers/donghub/DonghubScraper.ts
  • Constructor: DonghubScraper(options: DonghubScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: DonghubSearchItem, DonghubSearchResult, DonghubEpisode, DonghubDetail, DonghubScraperOptions

| Method | Kegunaan | Return | |---|---|---| | async search(query: string): Promise<WsperResponse<DonghubSearchResult>> | Mencari item berdasarkan query/kata kunci. | Promise<WsperResponse<DonghubSearchResult>> | | async getDetail(url: string): Promise<WsperResponse<DonghubDetail>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<DonghubDetail>> |

Contoh cepat:

import { DonghubScraper } from "wsper-js";

const scraper = new DonghubScraper({ debug: true });
const result = await scraper.search("naruto");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

DownrScraper — downr

  • Nama platform/domain: Downr
  • Source path: src/scrapers/downr/DownrScraper.ts
  • Constructor: DownrScraper(options: DownrScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: DownrScraperOptions, DownrMedia, DownrResult

| Method | Kegunaan | Return | |---|---|---| | async getVideo(url: string): Promise<WsperResponse<DownrResult>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<DownrResult>> |

Contoh cepat:

import { DownrScraper } from "wsper-js";

const scraper = new DownrScraper({ debug: true });
const result = await scraper.getVideo("https://example.com/item");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

FacebookScraper — facebook

  • Nama platform/domain: Facebook
  • Source path: src/scrapers/facebook/FacebookScraper.ts
  • Constructor: FacebookScraper(options: FacebookScraperOptions = {})
  • Credential: WSPER_FACEBOOK_COOKIE
  • Tipe terkait: FacebookScraperOptions, FacebookUserProfile, FacebookPostDetail, FacebookDownloadResult

| Method | Kegunaan | Return | |---|---|---| | async getUserProfile(usernameOrId: string): Promise<WsperResponse<FacebookUserProfile>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<FacebookUserProfile>> | | async getPostDetail(url: string): Promise<WsperResponse<FacebookPostDetail>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<FacebookPostDetail>> | | async downloadImage(url: string): Promise<WsperResponse<FacebookDownloadResult>> | Mengambil metadata lalu mengunduh/meresolve asset. | Promise<WsperResponse<FacebookDownloadResult>> |

Contoh cepat:

import { FacebookScraper } from "wsper-js";

const scraper = new FacebookScraper({ debug: true });
const result = await scraper.downloadImage("https://example.com/item");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

GDriveScraper — gdrive

  • Nama platform/domain: Google Drive
  • Source path: src/scrapers/gdrive/GDriveScraper.ts
  • Constructor: GDriveScraper(options: GDriveScraperOptions = {})
  • Credential: credentials object opsional, jika endpoint membutuhkan sesi
  • Tipe terkait: GDriveFileInfo, GDriveDownloadInfo, GDriveScraperOptions

| Method | Kegunaan | Return | |---|---|---| | async download(fileIdOrUrl: string): Promise<WsperResponse<GDriveDownloadInfo>> | Resolve a Google Drive file to a direct, confirm-resolved download URL. Ports the proven sc.js GDriveDl approach: POST to the uc?export=download JSON endpoint, which returns an XSSI-guarded ()]}'-prefixed) JSON payload { fileName, sizeBytes, downloadUrl } with the large-file confirm token already applied — so the returned downloadUrl is immediately fetchable. | Promise<WsperResponse<GDriveDownloadInfo>> | | async getFileInfo(fileIdOrUrl: string): Promise<WsperResponse<GDriveFileInfo>> | Mengambil data/detail dari endpoint sumber. | Promise<WsperResponse<GDriveFileInfo>> |

Contoh cepat:

import { GDriveScraper } from "wsper-js";

const scraper = new GDriveScraper({ debug: true });
const result = await scraper.download("https://example.com/item");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

GoogleImageScraper — google-image

  • Nama platform/domain: Google Image
  • Source path: src/scrapers/google-image/GoogleImageScraper.ts
  • Constructor: GoogleImageScraper(options: GoogleImageScraperOptions = {})
  • Credential: Tidak wajib; berjalan mode publik selama endpoint sumber mengizinkan.
  • Tipe terkait: GoogleImageScraperOptions

| Method | Kegunaan | Return | |---|---|---| | async searchGoogleImages(query: string): Promise<WsperResponse<string[]>> | Mencari item berdasarkan query/kata kunci. | Promise<WsperResponse<string[]>> |

Contoh cepat:

import { GoogleImageScraper } from "wsper-js";

const scraper = new GoogleImageScraper({ debug: true });
const result = await scraper.searchGoogleImages("naruto");

if (result.ok) {
  console.log(result.data);
} else {
  console.error(result.error?.code, result.error?.message);
}

Igdl2Scraper — igdl2

  • Nama platform/domain: Igdl2
  • Source path: src/scrapers/igdl2/Igdl2Scraper.ts
  • Constructor: Igdl2Scraper(options: Igdl2ScraperOptions = {})
  • Credential: Tidak wajib; be