Antibot-Detector

scrapfly活跃维护

实时识别网站使用的反爬系统、验证码和浏览器指纹技术,能判断 Cloudflare、Akamai、DataDome、reCAPTCHA 等并给出置信度,帮爬虫开发者快速摸清目标站点的防护底细。

Real-time detection of anti-bot systems, captchas & fingerprinting techniques. Identifies Cloudflare, Akamai, DataDome, reCAPTCHA, hCaptcha, Shape Security & more with confidence scoring and advanced capture tools.

v3.1.5发布于 2026-11-09 12:41 UTC627star +6 / 7 天73fork同步于 2026-11-10 17:57 UTC

怎么上手

由 README 提炼,执行前请确认
git clone https://github.com/scrapfly/Antibot-Detector.git
然后在 chrome://extensions 开启开发者模式,点击「加载已解压的扩展程序」选择该目录
硬件要求按 README 说明

README 未说明;作为 Chrome 浏览器扩展运行,无需 GPU 或显存。

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

Chrome 扩展,实时识别网页用了哪些反爬系统、验证码和指纹技术并给出置信度

实时识别网站使用的反爬系统、验证码和浏览器指纹技术,能判断 Cloudflare、Akamai、DataDome、reCAPTCHA 等并给出置信度,帮爬虫开发者快速摸清目标站点的防护底细。

核心能力

  • 用 URL、Cookie、Header、DOM、JS Hook 等八种方法匹配检测规则
  • 内置 86 项检测:43 种反爬、22 种验证码、21 种指纹技术
  • 每条规则为可读可改的 JSON,支持自行扩展与在线更新
  • 按信号强度给出 0-100% 置信度与低中高难度评级
  • 提供 reCAPTCHA 等验证码的 site key 提取与回调检查工具

容易踩的坑

从源码加载无构建步骤,但改文件后需在 chrome://extensions 手动点重载并刷新页面;检测结果默认缓存 7 天,需在 Detection 页清缓存才会重新扫描;上传检测结果默认发往第三方 dpaste.com 生成分享链接。

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v3.1.5
  1. v3.1.5Antibot-Detector - v3.1.5最新正式版2026-11-09 · 2026-11-09 12:41 UTC

    What's Changed in v3.1.5

    Added

    • Rules: with a search or filter on, the menu can export, turn on or turn off only the rules shown.
    • History: sort the list by newest, oldest, most protections or site name from a new dropdown beside the filter chips.
    • Detection: Copy → One line copies the page and its protections as a single line, for chats and tickets.
    • Detection: a Combinations chip next to the category chips shows only the detections where a combination fired.
    • Bulk scan: a Show menu in the results filters pages by protections found, none found, or failed; exports include only the pages shown.
    • AWS WAF: also detected when a page uses its CAPTCHA script.

    Fixed

    • History no longer loses pinned pages first when the browser storage is full.
    • Imported History files with dates written as plain milliseconds now show and export their dates.
    • Single-page sites that change page right after loading now get the new page scanned instead of skipped.
    • Settings: buttons that are busy or have nothing to do, like Check now or Back up now, now look disabled instead of highlighting on hover.
    • Arabic: the Captures search icon and the duplicate rule bullet list now sit on the correct side.
    • History: Clear on browser close now runs when only private windows remain open.
    • Detection: the notice asking you to set up a custom server for uploads now appears in your interface language instead of English.
    • Statistics → Rules: a rule renamed after History saved its pages, such as HUMAN Security, no longer shows as never found.
    • Turning the extension off or on is picked up at once instead of occasionally lagging for a few seconds.
    • A failed webhook delivery waiting for retry is still retried if you switch the extension back on within the hour.
    • Bulk scan: a paused run left paused for a few minutes can still be resumed instead of ending as stopped.
    • History: an entry with no known date no longer shows 1 January 1970 in its hover text, details or copied text.

    Installation

    # Download from Releases → Load as unpacked extension in Chrome
    
  2. v3.1.4Antibot-Detector - v3.1.42026-11-06 · 2026-11-06 13:31 UTC
    查看更新说明

    What's Changed in v3.1.4

    Added

    • The popup says when stored settings or rules cannot be read: scanning pauses until Settings → Data → Reset, and rule changes are not saved over unreadable rules.

    Changed

    • After an update, saved results are cleared, so pages are scanned again with the new version instead of showing what the old one found.
    • The popup says the extension must be reloaded, as soon as it opens, when its background part is out of date.
    • History: Compare scans is easier to read, with a one-line scan list, the page path under it, four counts at a glance, aligned scores with a +/− badge, long Unchanged lists folded, and seconds shown for scans in the same minute.
    • Settings: the Privacy preset also turns off automatic update checks, so it contacts nothing.
    • Settings: Back up everything keeps which official rules you switched off and your theme, safe to restore on another version, and Restore says what a backup never holds.
    • Rules: a regular expression in a rule you write or import reads only the first 100,000 characters of a page, script or request body.
    • Scans no longer download stylesheets again or copy the page's HTML when no rule reads them, and a page-element rule saves one match with its count.
    • Copy, export, delete and save always confirm with a message; the Notifications switch now only silences detection alerts.

    Fixed

    • Imperva: captures cover only Imperva's own requests on the page's site, at most 20 challenge addresses and payloads are kept, and Start Capturing over Analyze Scripts no longer doubles results.
    • Shape Security: stopping a capture early no longer leaves a stale notice or blocks the next Start, and a timeout with nothing captured saves no empty entry.
    • Akamai: a second Extract Sensor run is no longer ended by the first one's timer, and Start Capturing deletes the _abck cookie only once armed.
    • Advanced: ALTCHA Extract Site Key finds the key of an ALTCHA Cloud widget before its challenge has loaded.
    • Detection: Scan again says the extension must be reloaded when its background part is out of date, instead of only "Scan failed".
    • Custom rules, edits to official rules and switched-off detectors are no longer replaced by the shipped rules when stored rules cannot be read.
    • When settings cannot be read, no page is scanned and nothing is sent or kept, History and Bulk scan stay paused, and backup, watchlist and update schedules stay as they were.
    • Webhook: a delivery waiting to be retried is dropped when your filters or skipped sites no longer allow it, private-window pages are never sent, and recent deliveries never name sites History ignores.
    • Log Collector: sites History ignores, skipped sites and private-window pages appear as "[hidden site]" in collected and exported logs.
    • Check Cookies no longer records sites kept out of scans, and saved Advanced captures are limited to about 4 MB in total.
    • Rules: a rule you write or import can no longer freeze scanning with a slow regular expression; Import refuses such rules and very large files and names what it skips.
    • Rules: two URL rules with the same address both match with their own confidence, and a single pattern switched off no longer matches anything.
    • Rules → Test finds official patterns deep in long scripts, as a scan does, and page-reported window detections use the rule's own confidence and description.
    • Rules help: DOM rules search the page head, and requests made after the scan count for URL rules, in all 22 languages.
    • Changing the cache scope drops results saved under the old one, so pages are scanned again instead of showing another page's old result.
    • With the extension switched off, nothing of it stays on the page or in its frames.
    • An overdue watchlist check is no longer pushed back each time the background worker wakes.
    • A new scan result no longer makes the popup reload your whole History, which slowed large Histories.
    • Turning a page in Detection, History or Rules starts at the top, and the
  3. v3.1.3Antibot-Detector - v3.1.32026-11-05 · 2026-11-05 18:07 UTC
    查看更新说明

    What's Changed in v3.1.3

    Added

    • History: a Combinations filter next to the category filters keeps the pages where a combination matched.
    • Detection: a Scan again button, next to Clear cache and on pages with no completed scan, reloads and rescans the page in one click.
    • Detection: Anti-bot, Captcha and Fingerprint filter chips under the search narrow the results, together with the search.
    • Rules: filter chips for the three categories, Custom, Edited and Disabled narrow the list, together with the search.
    • Bulk scan: a "Most seen" line under the totals names the protections found on the most pages; the Markdown and JSON exports include it.
    • Advanced: Lemin Cropped Captcha and ALTCHA get Extract Site Key and Analyze Scripts (ALTCHA's key only on Cloud and Sentinel); 27 protections now have tools.
    • Rules → Update: a new anti-bot detector, SiteGround SG-CAPTCHA, the proof-of-work challenge SiteGround shows to flagged visitors.

    Changed

    • History search ignores accents in Latin and Greek text, so "cafe" finds "Café" and the other way round.
    • Detection and Rules: a search or filter with no match now says so and offers Clear filters, instead of leaving an empty list.

    Fixed

    • Editing, switching off, importing or updating rules now clears the saved results, so the next visit is scanned with the new rules instead of showing old cards for days.
    • Detection: changing the cache scope in Settings no longer leaves the tab blank until the popup is reopened; the page's saved results show again.
    • Detection: coming back to the tab with a search or a filter on keeps the list filtered instead of showing every result.
    • Detection: Brave, Opera and Vivaldi pages and the Chrome Web Store are now reported as pages that cannot be scanned.
    • Rules: a rule you just switched off shows under the Disabled chip, and its switch stays off when you page through the list.
    • Detectors that look for scripts in a page's head or inline (Queue-it, CHEQ, Anubis, Ruishu) now match; these checks never worked before.
    • History: Scan again now and Clear cache clear the saved result even when the cache scope setting changed after the entry was recorded.
    • History is no longer cut to the default size or entry limit while Settings cannot be read; it is capped at 25 MB until then.
    • Rules: a detector you add yourself shows its description in your language instead of English.
    • Akamai Extract Sensor no longer deletes the _abck cookie before it is ready, so a failed start leaves the cookie alone.
    • Imperva tools keep request bodies only from Imperva's own requests, and list each endpoint once, without its query, at most 20.
    • Imperva: Analyze Scripts lists script addresses with the page's own http or https and port, instead of always https without a port.
    • Shape Security: a capture that ends while the popup is open now resets Start Capturing and shows the capture at once.
    • Shape Security: Stop Capturing with nothing captured no longer saves an empty capture.
    • Websites can no longer read, or overwrite, two internal markers the extension kept on their window object (one showed a page came from the cache).
    • A page answered from the saved result no longer risks a scan that never finishes when the extension's window checks were still running.

    Security

    • Bulk scan: a sitemap only adds pages of its own site (www included); listed addresses on other hosts, local ones included, are no longer opened.
    • Bulk scan: a sitemap that redirects to another site is not read, and its row says the file could not be read.

    Installation

    # Download from Releases → Load as unpacked extension in Chrome
    
  4. v3.1.2Antibot-Detector - v3.1.22026-11-04 · 2026-11-04 11:12 UTC
    查看更新说明

    What's Changed in v3.1.2

    Changed

    • Keyboard and screen readers: Rules dialogs keep Tab inside the open dialog and give the focus back when it closes; Settings tabs and the Advanced Tools / History switch are tab lists you move along with the arrow keys.
    • Matched combinations (Detection and History details): the card says when it fires, and the signals found together are folded rows like Detection methods: type, score, and the value when opened.
    • History cards count the combinations that fired, right after the fingerprint total; the hover names each with its score.
    • A quieter interface in Scrapfly's style: labels in sentence case instead of tracked capitals, neutral header buttons, flat cards without gradients or glows, lighter text weights and no decorative motion.
    • Dimmed text is easier to read: lighter in the dark theme, a little darker in the light one.
    • Chrome 111 or newer is required (the scripts that watch the page need it).
    • Copy diagnostics also hides sites written with a path and IPv6 addresses.

    Fixed

    • History import: a file with no history entries in it can no longer replace, and so empty, your history; the dialog counts the entries it can import.
    • Rules → Duplicate: the copy of a rule lost settings the editor does not show, such as a payload rule that reads the response.
    • A rule saved or installed after a page loaded now matches that page on a manual scan, without reloading it.
    • Detection details cut a matched address at the "?" for rules whose pattern starts with https://; the whole address shows again.
    • Clicking the Rules or Advanced tab twice while it loads no longer sets it up twice (the Rules buttons could stop responding).
    • Payload rules that share a description each match; text with a dotted capital I (Turkish) no longer shifts the matched text; a combination that stops holding after a late request scores back down.
    • Rules: a custom rule with a quote in its id can be switched on and off; category colours written as #abc show their tint.
    • Skipped sites: "bank.example." and list entries written with capitals, a port or a whole address are skipped like the plain host.
    • Bulk scan: a list of thousands of addresses on one line is read at once, and runs longer than two minutes keep the browser's background part awake.
    • A long toast with a spinner is no longer dropped when two other messages appear.
    • Advanced → Imperva: a finished capture shows in the tool's own list and clears with it; the Captures tab lists Imperva once; starting again no longer gets stopped by the old timer.
    • Advanced: results of tools such as Check Cookies are no longer drawn as captures with fields they do not have; Shape export code no longer carries another site's addresses.
    • Advanced: captures and analyses keep the browser's background part awake until they end; Extract Sensor no longer saves every request address of the page in History.
    • History: Statistics → Evidence names a signal by its rule again, not by each address; Compare no longer offers scans served from the cache; Auto-delete keeps an entry whose date cannot be read.
    • Statistics: two ports of one host (localhost:3000 and :8080) are no longer read as one page changing its protection; History CSV guards a formula after leading spaces.
    • Amazon: a form field named metadata1 alone is no longer reported as Amazon Bot Protection; Turnstile, DeepSeek and OpenAI rules that read responses are only offered to extensions that can run them.

    Security

    • Webhook and custom share addresses: "localhost." and "10.0.0.1." (with a final dot), and names such as .lan, .home.arpa and .corp, are refused as local.
    • A rule file can no longer make the popup load an icon from a web address; the icon is left out when the rule is imported.
    • The log collector, a tab's detection result and a manual scan answer extension pages only, never a page's own script.
    • A cookie name with "*" in a rule, or a regex repeated a fixed number of times around a repeat, can no longer
  5. v3.1.1Antibot-Detector - v3.1.12026-11-03 · 2026-11-03 14:36 UTC
    查看更新说明

    What's Changed in v3.1.1

    Changed

    • History and Bulk scan Markdown: addresses are links, so a path with an underscore or a tilde no longer shows a backslash.
    • The toolbar icon's hover text is the extension's name in your language, not English.
    • Keyboard and screen readers: History and Rules "..." menus open on their first item and move with the arrow keys; Escape returns to the button.
    • Keyboard and screen readers: every switch, colour picker and dropdown in Settings and Rules has a name, and copy, save and error messages are announced.

    Fixed

    • Webhook: a delivery held while the extension was switched off is sent again once it is switched back on, instead of waiting out its hour.
    • Settings → Data → Reset now works when the stored settings cannot be read; the button refused to run in 3.1.0.
    • Reset keeps the paused sites of an install that still has the oldest settings layout.
    • History: the dropdowns of the Export and Compare dialogs keep long options clear of the arrow.
    • Statistics and the diagnostics report no longer list a rule as "waiting for a newer extension" after the extension updated to a version that supports it.
    • A settings file or backup with an unknown default tab no longer leaves the popup empty.
    • A failed History CSV export said it failed to import; the webhook help showed a stale example for <DETECTION_NAMES>.
    • Hebrew, Persian and Urdu browsers: Statistics and Bulk scan are no longer mirrored right to left around English text.
    • Arabic: dialog and menu text lines up with the reading direction; Arabic and Hindi letters are no longer spaced apart.
    • Keyboard focus shows on the Rules switches, method boxes and confidence slider, and moves on in Bulk scan when Pause, Resume or Stop goes away.

    Installation

    # Download from Releases → Load as unpacked extension in Chrome
    

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Scrapfly Anti-bot Detector

    See how a website defends itself against bots: which anti-bot system, which captcha, which fingerprinting scripts, and how sure each match is.

    Chrome Web Store Users Rating CI License: NPOSL-3.0

    Add to Chrome · Product page · What's new · llms.txt · Report a problem

    English · 简体中文 · Español · Русский


    Scrapfly Anti-bot Detector is a free Chrome extension that shows how a website protects itself from automated traffic. Browse as you normally would: the number on the toolbar icon tells you how many protections the page uses, and the popup lists each one with its confidence, its difficulty and the signals that gave it away.

    It recognizes 86 technologies out of the box: 43 anti-bot systems, 22 CAPTCHAs and 21 browser fingerprinting techniques. Every detector is a plain JSON file that you can read, change or extend, and new rules ship with each release of this repository, so Rules → Update can install them before Chrome updates the extension itself.

    We built it at Scrapfly because every scraping project starts with the same question: what is protecting this page? It is just as useful for checking how your own site's bot protection looks from the outside, or for security research.

    Contents

    Screenshots

    Click an image to see it full size.

    Install

    Chrome Web Store

    The simplest option: install it from the Chrome Web Store. Chrome keeps it up to date for you.

    From a release

    Each version on the Releases page has a ready-to-load zip attached.

    1. Download the zip and extract it into a new folder.
    2. Open chrome://extensions and turn on Developer mode (top right).
    3. Click Load unpacked and choose that folder.

    From source

    There is no build step. Clone the repository and load the folder as it is:

    git clone https://github.com/scrapfly/Antibot-Detector.git
    

    Then follow steps 2 and 3 above, choosing the cloned folder. After editing a file, press the reload button on the extension's card in chrome://extensions and reload the page you are testing.

    How it works

    When a page loads, the extension gathers what the page reveals about itself and checks it against every enabled detector. Each detector combines up to eight methods:

    MethodWhat it looks atExample signal
    URLThe page address, script sources and every network requestchallenges.cloudflare.com/turnstile/v0/api.js
    CookiesCookies the site sets or sends, HttpOnly ones included_abck (Akamai), datadome
    HeadersResponse and request headersx-kpsdk-ct (Kasada)
    ContentThe page's HTML and the code of its inline and loaded scriptsKPSDK.configure(
    DOMElements matched by a CSS selector.cf-turnstile[data-sitekey]
    Window propertiesObjects that scripts add to windowgrecaptcha.render
    JavaScript hooksCalls to browser APIs commonly used for fingerprintingHTMLCanvasElement.prototype.toDataURL
    PayloadBodies of POST, PUT and PATCH requests, optionally filtered by URL and method, and the responses of the URLs a rule namessensor_data (Akamai), "proofofwork":{"required":true (OpenAI Sentinel)

    Confidence. Each rule has its own confidence and detectors define combinations of rules that score higher together. A script that only mentions a vendor's name scores 5–10%; a signal only that vendor's product produces (its own script host, its own cookie, its challenge endpoint) is proof and scores 100% on its own, and so does a vendor's complete integration (its script together with its cookie, widget frame or challenge request). Shared or generic signals stay at 15–90%. The score shown for each detector is its strongest single rule or combination. The page also gets a difficulty rating (Low, Medium or High), which sets the color of the toolbar badge.

    Fingerprinting. The API hooks are in place before the page's own scripts run, and they also cover same-origin iframes, where fingerprinting code often hides. By default they watch for at least 4 seconds, then until the page has been quiet for 2 seconds, and for 8 seconds at most.

    Caching. A result is reused for 7 days by default, so revisiting a page shows it straight away. You can change the duration, and whether a result is shared by the whole domain, by pages with the same path or only by the exact URL, in Settings → Detection. Clear Cache on the Detection tab forgets the stored result, so the page is scanned again the next time it loads. Editing, switching off, importing or updating rules also clears the stored results, so every page is scanned again with the new rules on its next visit.

    What it detects

    The lists below are the detectors that ship with the extension. You can switch any of them off, edit them or add your own in the Rules tab.

    Akamai Bot Manager · Alibaba Cloud WAF · Amazon Bot Protection · Anubis · AWS WAF · Azure Front Door · Castle · Cheq · Cloudflare Bot Management · Cloudflare Waiting Room · DataDome · DDoS-Guard · DeepSeek PoW · F5 BIG-IP ASM · Fastly Bot Management · FingerprintJS · Forter · Google BotGuard · HUMAN (PerimeterX) · Hunt · Incapsula (Imperva) · iovation (TransUnion TruValidate) · Jiasule (Chuangyu Shield) · Kasada · Kount · Meetrics Check · Netacea · Ocule · OpenAI Sentinel · Queue-it · Radware Bot Manager · Reblaze · Riskified · Ruishu · SEON · Shape Security · Sift · SiteGround SG-CAPTCHA · Sucuri WAF · ThreatMetrix · Vercel Firewall · Wordfence · Yundun Cloud WAF

    AliExpress CAPTCHA · Aliyun Captcha 2.0 · ALTCHA · Basilisk Captcha · Binance Captcha · Cap · Captcha.eu · Capy Puzzle Captcha · Cloudflare Turnstile · Dingxiang Captcha · Friendly Captcha · FunCaptcha (Arkose Labs) · GeeTest · Google reCAPTCHA · hCaptcha · Lemin Cropped Captcha · MTCaptcha · NetEase Yidun · Prosopo Procaptcha · QCloud Captcha · Shumei Captcha · Yandex SmartCaptcha

    Audio · Battery API · Canvas · Clipboard API · Crypto · CSS · Device Orientation · Font · Gamepads API · Geolocation · Hardware · IndexedDB · Media · Navigator · Performance · Screen · Timezone/Intl · USB API · Web Storage · WebGL · WebRTC

    A tour of the popup

    Detection

    The protections found on the current page, each with its confidence, its difficulty and the methods that matched. Click a card to see the exact signals behind it, or use the chips under the search box to show only Anti-bot, Captcha or Fingerprint results. Hovering the toolbar icon names them without opening the popup. Scan again now, next to the page address, and Alt+Shift+S (Control+Shift+S on Mac; change it in the browser's shortcut settings) scan the current page again. The buttons at the top let you:

    • Upload detections to get a shareable link (dpaste.com by default; see Share links)
    • Clear Cache, so the page is scanned again on its next load
    • Copy, a menu: the same summary that the upload shares, a Markdown table for a ticket or a chat, or JSON (none of them holds cookie or header values)
    • Block this domain, so the extension stops scanning it

    History

    Every page that had detections, with its protections and difficulty. Search it (accents are ignored), narrow it with the chips under the search box (Pinned, Changed, a category or Combinations, the pages where a combination of signals matched), open an entry for its details, import a JSON export, and export it as JSON, CSV, plain text or Markdown, choosing the protections, period, site and pinned pages first. Pin an entry (it is kept when History is cleaned up), add a note, open the page, scan it again now or copy it as Markdown from its ⋯ menu. Clicking a "Protections changed" notification opens that page. A Changed badge marks a page whose protections differ from its last scan. Settings → Data → Open statistics opens a statistics page (activity, protections, domains, confidence, signals, combinations, rules and Advanced tools) computed locally from your history.

    Bulk scan, in History's More actions menu (⋯), scans a list of pages for you: paste addresses or an https sitemap, or upload a .txt or .csv file, and each page is opened in a background tab, one at a time, as a real visit with your cookies. Choose how many pages to scan and the time limit per page, pause or stop the run (it keeps going if you close the popup), scan the failed pages again, and export the table as CSV, JSON or Markdown. Finished pages go through the normal scan, so they are recorded in History (unless it is paused) and sent to your webhook, and the totals add a Most seen line with the protections found on the most pages. A sitemap only adds pages of its own site, and sites you skip in Settings → Detection are left out.

    Rules

    All detectors, built-in and your own; the chips under the search box narrow the list to a category, or to custom, edited or disabled detectors. Turn each one on or off, open the editor to change its patterns, or add a detector of your own with Add. The More actions menu (⋯) imports and exports detectors as JSON. Every pattern has its own settings: where to look (the page, scripts or all requests; request or response for cookies and headers), whether it is a regular expression, whole word or case sensitive, and its confidence. The editor also handles combinations and the detector's icon, and a regex helper lets you test a pattern against sample text. Check against History shows on how many of your saved pages each pattern and combination matches, and Test on this page runs the rule as it is now (unsaved edits included) on the page the popup is open on: what each cookie, URL, content and DOM pattern finds there, and whether the rule and its combinations match. Header, JS hook, window and payload patterns can only be answered by a real scan, so the test lists them as such instead of as "no match". Nothing is saved or sent.

    Update downloads the official detectors of this repository's latest release. A built-in detector you have edited is never replaced without asking: you choose between your version and the new one. If you delete a built-in detector, Restore official detectors in the same menu brings it back. Detector updates can also run on a schedule (Settings → General).

    Advanced

    Hands-on tools for the protections a page uses. A protection gets its tools when it is detected above 50% confidence; you can change that limit in Settings → Detection → Advanced tools. When nothing on the page qualifies, the tab says so, gives that minimum (or names the protection found below it) and shows the 27 supported protections.

    ProtectionTools
    Akamai Bot ManagerCheck Cookies · Analyze Scripts · Extract Sensor Information · Start Capturing
    AWS WAFCheck Cookies · Analyze Scripts
    Cloudflare Bot ManagementCheck Cookies · Analyze Scripts
    Cloudflare TurnstileExtract SiteKey · Analyze Scripts
    DataDomeCheck Cookies · Analyze Scripts
    FunCaptcha (Arkose Labs)Extract Public Key · Analyze Scripts · Start Capturing
    GeeTestCheck Version · Analyze Scripts
    Google reCAPTCHAObtain Selector · Extract SiteKey · reCAPTCHA callback · Start Capturing
    hCaptchaExtract SiteKey · Check Version · Analyze Scripts · Start Capturing
    Incapsula (Imperva)Check Cookies · Analyze Scripts · Start Capturing
    Shape SecurityCheck Version · Check Cookies · Analyze Scripts · Start Capturing
    Aliyun Captcha 2.0, ALTCHA, Captcha.eu, Capy Puzzle Captcha, Dingxiang Captcha, Friendly Captcha, Lemin Cropped Captcha, MTCaptcha, NetEase Yidun, Prosopo Procaptcha, QCloud Captcha, Shumei Captcha, Yandex SmartCaptchaExtract SiteKey · Analyze Scripts
    AliExpress CAPTCHA, Basilisk Captcha, Binance CaptchaAnalyze Scripts

    Results and captures are kept for 30 minutes in Advanced → History, where you can filter them by site, vendor and tool, open them again and export them.

    Settings

    • General: interface language (22 languages, following your browser by default), theme (Dark, Light or System), notifications, debug mode, scheduled detector updates, and the colors of the badge, categories and tags.

    • Detection: cache duration and scope, the order of categories in the results, the Advanced tools confidence limit, which sites are scanned (every site except the ones you skip, or only the sites you choose), JS API events, webhooks and share links.

    • History: what to record (pause History, skip private windows, ignored sites, minimum confidence, skip fingerprint-only pages), how many entries to keep (up to 10,000; 0 keeps the newest 1,000), deleting entries after a number of days or when the browser closes, skipping or updating repeated scans, notifications when a page's protections change, the default export format, a storage meter with its warning, and an automatic backup to your Downloads folder.

      History is limited to about 6 MB, or 12 or 25 MB if you choose a larger size in Settings → History; when it is full the oldest unpinned entries are removed, and Settings → History says how many. Pages with a hard protection, or one you name, can pin themselves (up to 50), fingerprint-only pages can be deleted after a number of days of their own, and up to 10 pinned pages can be watched: scanned again every day or week in a background tab, with the entry marked Changed when its protections change (each check is a real visit with your cookies).

    • Data: open the statistics page; see how much space each part of the extension uses and clear the detection cache, tool captures, logs or History; back up settings, your own rules and History in one file and restore it; export or import your settings and your history; apply the Privacy or Developer preset or reset every setting; copy a diagnostics summary for a bug report (no sites, addresses or keys).

    Integrations

    JavaScript events

    The extension dispatches events on the page's window, so your own scripts (or a test harness) can react to its results:

    EventWhen
    scrapfly:readyThe extension has loaded on the page
    scrapfly:onStartA scan starts (no cached result, or a manual scan)
    scrapfly:onProgressOne detection method has finished
    scrapfly:onHooksCompleteThe JavaScript hooks stopped watching
    scrapfly:onWindowPropsCompleteThe window property checks finished
    scrapfly:onDetectionThe results are ready, including results served from the cache
    scrapfly:onErrorThe scan failed
    const on = (ev, cb) =>
      addEventListener(`scrapfly:${ev}`, cb);
    
    on('onDetection', (e) => {
      const { url, detections } = e.detail;
      console.log(url, detections);
    });
    

    Because these events reach the page itself, any website you visit can listen for them and learn that the extension is installed. They are off by default; turn them on in Settings → Detection → JS API Events.

    Webhooks

    When a scan finds protections, the extension can send the results to your own endpoint. Choose the HTTP method, add headers and write the body as a template with variables such as <SITEURL>, <HOSTNAME>, <TITLE>, <DETECTIONS>, <DETECTION_COUNT>, <DETECTION_NAMES> (the protections with their confidence, on one line), <CATEGORIES> and <TIMESTAMP>. Start from a preset (Slack, Mattermost or Google Chat, Discord, or a plain text line) fills in the Content-Type and a ready-made chat message. Webhooks only go to HTTPS addresses on public hosts, are off by default, and include a Test button. Set them up in Settings → Detection → Webhook Integration.

    Recent deliveries and retries. Settings → Detection → Webhook lists the last 20 attempts (the page, the status, how long it took; never an address, header or payload). A delivery that fails can be sent again with Retry, and with Retry failed deliveries on (the default) the extension also retries by itself after 1, 5 and 15 minutes when there was no answer or the server answered 408, 425, 429 or 5xx; a refusal such as 401, 403 or 404 waits for your Retry. To do that, the page data of a failed delivery is kept in memory for an hour (at most 20), never on disk, and gone when the browser closes; a retry builds the request again from your current webhook settings, so a corrected address or secret is used and no header or secret is stored with it.

    Signing. Set a signing secret (or press Generate, then Copy it to your server) and each request with a body is signed the way Scrapfly's own webhooks are: X-Scrapfly-Webhook-Signature holds the HMAC-SHA256 of the raw body as uppercase hex, keyed with the secret exactly as written (its UTF-8 bytes; a generated secret is not decoded from hex), and X-Scrapfly-Webhook-Signature-Lowercase the same value in lowercase. Check it against the raw body before parsing it, with a constant-time comparison. GET, HEAD and multipart/form-data requests are not signed, and the URL is never part of the signature. There is no timestamp header; the default template sends <TIMESTAMP> in the body, so your server can refuse stale requests. The secret stays in this browser: exports, backups and diagnostics leave it out, and Reset keeps it unless you also remove the connections.

    // Node.js, with the raw body as a Buffer (for example express.raw({ type: '*/*' }))
    const crypto = require('node:crypto');
    function isFromExtension(rawBody, signatureHeader, secret) {
      const expected = Buffer.from(crypto.createHmac('sha256', secret).update(rawBody).digest('hex'));
      const received = Buffer.from(String(signatureHeader || '').toLowerCase());
      return received.length === expected.length && crypto.timingSafeEqual(received, expected);
    }
    // isFromExtension(req.body, req.get('X-Scrapfly-Webhook-Signature'), process.env.WEBHOOK_SECRET)
    
    import hashlib, hmac
    def is_from_extension(raw_body: bytes, signature_header: str, secret: str) -> bool:
        expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
        return hmac.compare_digest(expected, (signature_header or "").lower())
    

    Share links

    Upload detections on the Detection tab publishes a summary of the page's results, copies the link and opens it in a new tab. The summary contains the page address without its query string or fragment, each protection's name, category and confidence, and which methods matched; never cookie or header values. Choose where it goes, and when it is deleted where the service allows it, in Settings → Detection → Share uploads: dpaste.com (the default), dpaste.org, paste.rs, Pastebin with your API key, a secret GitHub Gist with your token, or your own server.

    Privacy and permissions

    Detection runs entirely in your browser. There are no accounts and no analytics, and nothing about the pages you visit is sent to Scrapfly. The extension does make a few network requests, and you should know what they are:

    • Script contents. To read a script's code, it downloads the page's scripts and stylesheets again, through the browser cache and without cookies.
    • Detector updates. Update, or the optional schedule, asks api.github.com for this repository's latest release, then reads that release's detector files from raw.githubusercontent.com.
    • Site icons. History and other lists show a site's own favicon, or ask Google's favicon service when the site has none.
    • Language flags. The language picker in Settings loads its flags from flagcdn.com.
    • Only when you use them: webhooks and share links, as described above. JS API events never leave the browser, but the page you visit can read them (see JavaScript events).
    PermissionUsed for
    Access to all sites (http://*/*, https://*/*)Scanning whatever page you open
    storageSettings, detectors, history and cached results
    tabs, activeTabKnowing which page the popup is about, and opening pages such as the statistics view
    scriptingRunning the Advanced tools inside the page
    webRequestReading request URLs, headers and request bodies for detection and captures
    webNavigationKnowing when a page or frame has finished loading
    cookiesReading cookies, including HttpOnly ones; some Analyze tools reset a protection cookie before reloading the page
    notificationsStatus messages from the capture tools
    downloadsSaving exported files
    alarmsScheduled detector updates and the clean-up of old history and cached results
    unlimitedStorageLets History take more than the 10 MB browser quota when you choose 12 or 25 MB in Settings → History; History stays at 6 MB unless you choose more

    Development

    You need Chrome (or Chromium) to run the extension and Node.js 20 or newer for the checks. There are no runtime dependencies and no bundler: the files in this repository are the extension.

    manifest.json            Manifest V3 definition
    background.js            Service worker entry point, loads background/
    background/              Detection lifecycle, message handlers, cache, badge
    content.js               Content script (isolated world)
    content-main-world.js    Page-world hooks, installed before the page's scripts
    modules/                 Detection engine, core services, UI helpers, styles
    popup.html, popup.js     The popup
    sections/                One folder per popup tab (detection, history, rules, advanced), plus settings (the Settings modal) and stats (the Statistics page)
    detectors/               Detector rules (JSON), index.json, icons and rule translations
    _locales/                Translations for the 22 languages
    utils/                   Shared helpers
    scripts/                 Repository checks and browser tests
    test/                    Unit tests (node:test)
    

    Checks

    npm run verify            # everything below, as CI runs it
    npm run check:syntax      # node --check on every JavaScript file
    npm run check:structure   # HTML tag balance, JSON validity, modal markup
    npm run check:locale      # every language has exactly the keys of English
    npm run check:locale-quality  # placeholders, code, script, fonts and Web Store limits of every translation
    npm run check:rule-i18n   # every rule text is translated in detectors/i18n/
    npm test                  # unit tests on Node's built-in test runner
    

    The browser tests load the real extension in Chromium. They are not part of verify, and they need Playwright. npm run e2e:setup prepares it once, outside the repository (in ~/.cache/antibot-e2e): it installs Playwright, finds a Chromium that matches it (linking another cached revision under the expected name rather than downloading again), starts Chromium through a wrapper that adds --disable-gpu on Windows Subsystem for Linux, where it otherwise draws no frames, and checks that a frame is drawn. By hand, npm i --no-save playwright && npx playwright install chromium also works.

    npm run e2e:all runs every suite below one at a time, with a time limit each, a log for each and a summary (-- --only history,data, --skip languages, --bail, --timeout <minutes>, --repo <another checkout>). Run nothing else heavy meanwhile: the suites are timing-sensitive, and the unit tests running beside one have made scenarios fail for no reason of their own.

    npm run e2e:methods    # every detection method, from URL to JavaScript hooks
    npm run e2e:settings   # every per-pattern setting: scopes, regex, whole word, case
    npm run e2e:editor     # the rule editor saves settings and keeps every field
    npm run e2e:updater    # Rules → Update against a local stand-in for GitHub
    npm run e2e:data       # Settings → Data: storage and Clear, backup and restore, presets and reset, diagnostics
    npm run e2e:scope      # Settings → Detection → Sites to scan: skipped sites, chosen sites, the paused card
    npm run e2e:webhook    # Settings → Detection → Webhook: filters, cache, failures, Recent deliveries, Test, Clear, signing
    npm run e2e:hooks      # Settings → Detection → Sites without JS hooks: hooks on and off, switching, the popup note, the cache
    npm run e2e:rule-texts  # Rules editor texts in Spanish: one plain box, replaced when changed, untouched when left alone
    npm run e2e:quickwins  # 3.0.3: toolbar hover text, the copy menu, the rescan shortcut, notification clicks, History open and rescan, Duplicate rule, Markdown exports
    npm run e2e:languages  # every language through the real popup, settings and statistics pages
    npm run e2e:controls   # every checkbox, radio and dropdown on screen is drawn by the interface, none is the browser's default look
    npm run e2e:live       # detectors against the real sites in scripts/live-sites.json
    

    e2e:live needs a network connection, and live sites change over time, so a failure there is something to look into rather than proof that a rule is wrong.

    CI runs npm run verify on every push and pull request. To run it locally before each push, enable the repository's hook once:

    git config core.hooksPath .githooks
    

    Adding a language

    A language is a folder of translations plus a few registrations, and the checks fail until all of them are done:

    1. Create _locales/<code>/messages.json with every key of _locales/en/messages.json ({ "key": { "message": "..." } }, {0} placeholders and code in `backticks` unchanged), using a code Chrome accepts (pt_BR, zh_TW, uk...).
    2. Create detectors/i18n/<code>.json with the translation of every rule text (node scripts/check-rule-i18n.js --missing lists them). Cookie, header and path names stay as written.
    3. Add the language to the picker (sections/settings/settings-ui-language.js, in its own name), its flag (utils/url-utils.js), the lists in modules/core/rule-i18n.js, modules/detection/rules/update-manager.js and modules/settings/settings-store.js. test/locale-registry.test.js names the one you forgot.
    4. Write its Chrome Web Store listing: store/listing/<code>.txt (the description, translated from en.txt), store/captions/<code>.json (the copy printed on the images) and the five images from node scripts/generate-store-screenshots.js --lang <code>. npm run check:store-listing and npm run check:store-images name what is missing or wrong; store/README.md has the rules and the commands.
    5. Run npm run verify, then npm run e2e:languages -- --only <code> --shots /tmp/shots and look at the screenshots: it reports text still in English, raw {0} placeholders and labels cut off.

    A new script needs its IBM Plex family too (Thai ships IBMPlexSansThai-*.woff2 in assets/fonts/, declared in modules/styles/common.css and listed in test/font-family.test.js): otherwise the system's font draws it, and npm run check:locale-quality lists the characters involved.

    Writing a detector

    A detector is one JSON file. This is detectors/antibot/detect-datadome.json with four of its rules and one of its combinations:

    {
      "id": "detect-datadome",
      "name": "DataDome",
      "author": "Scrapfly",
      "enabled": true,
      "category": "Anti-Bot",
      "difficulty": "Medium",
      "lastUpdated": "2026-10-05",
      "version": "2.0.0",
      "minExtensionVersion": "2.8",
      "website": "https://datadome.co/",
      "icon": "datadome_official.png",
      "description": "Real-time bot protection with machine learning-based detection",
      "detection": {
        "cookie": [
          {
            "id": "datadome-cookie",
            "name": "^datadome$",
            "nameRegex": true,
            "confidence": 85,
            "description": "DataDome session cookie",
            "nameScope": "all",
            "valueScope": "all"
          }
        ],
        "url": [
          {
            "id": "datadome-tag",
            "confidence": 75,
            "description": "Official DataDome JavaScript tag or its collection endpoint",
            "text": "^https://(?:js|api-js)\\.datadome\\.co/(?:tags\\.js|js/)",
            "textRegex": true,
            "textCaseSensitive": false,
            "textScope": "all"
          }
        ],
        "content": [
          {
            "id": "ddjskey-reference",
            "confidence": 25,
            "description": "Integration snippet setting window.ddjskey",
            "text": "ddjskey",
            "textWholeWord": true,
            "textCaseSensitive": true,
            "scope": "scripts",
            "checkScripts": true
          }
        ],
        "window": [
          {
            "id": "ddjskey-variable",
            "path": "ddjskey",
            "condition": "typeof string",
            "confidence": 60,
            "description": "DataDome JS key set by the integration snippet"
          }
        ]
      },
      "combinations": [
        {
          "id": "datadome-tag-session",
          "name": "DataDome tag with its session cookie",
          "confidence": 95,
          "when": {
            "all": [
              { "any": [{ "pattern": "datadome-tag" }, { "pattern": "ddjskey-variable" }, { "pattern": "ddjskey-reference" }] },
              { "pattern": "datadome-cookie" }
            ]
          }
        }
      ]
    }
    

    On their own, the cookie scores 85% and the tag 75%. The combination raises DataDome to 95% when the cookie appears together with the tag, the ddjskey variable or a script that sets it.

    To add one:

    1. Create detectors/<category>/detect-<name>.json, where the category is antibot, captcha or fingerprint.
    2. Add its id to the matching list in detectors/index.json.
    3. Put its logo in detectors/icons/, or use custom.png (the Scrapfly logo).
    4. Translate each rule description and combination name in every detectors/i18n/<locale>.json. node scripts/check-rule-i18n.js --missing lists the texts still missing.
    5. For anti-bot and CAPTCHA detectors, add a real example of each rule's signal to test/fixtures/antibot-confidence.json or test/fixtures/captcha-confidence.json. Then run npm run verify.
    6. Check it on a live page by adding the site to scripts/live-sites.json and running npm run e2e:live.

    A few things to keep in mind:

    • 100% means proof. A rule scores 100% on its own only when no other product can produce its signal: a request to a host the vendor owns for that product, a header or cookie with a vendor-coined name (a short name such as _px3 also checks the value's shape), the vendor endpoint's own request or response body, or a token only the vendor injects (Akamai's _abck cookie, Cloudflare's /cdn-cgi/challenge-platform/ requests, hCaptcha's api.js). Markup, source text, window globals and anything shared with another product never are: an anti-bot rule of that kind scores at most 90% and a CAPTCHA rule at most 60%. A combination reaches 100% only at a detector's top tier, where every branch is made of that vendor's own signals; the other tiers stay at or below 95%. A rule marked "standalone": false only counts inside a combination. The tests check these limits (test/antibot-confidence.test.js, test/captcha-confidence.test.js).
    • Raise version whenever you change a detector's rules, or Rules → Update will not offer the new version.
    • Mind minExtensionVersion. Rules → Update serves the detectors of the latest release to every installed copy of the extension (2.8.2 and older read the main branch instead), so a detector that relies on newer engine features must declare the oldest extension version that understands it. Older copies then skip it, and 2.8.3 and newer list it as waiting for an extension update.

    Contributing

    Bug reports, detector improvements and new detectors are all welcome. If a detector misses a site or flags one it shouldn't, please open an issue with the page address and what you expected to see.

    For pull requests:

    • npm run verify must pass.
    • Record user-visible changes in CHANGELOG.md under [Unreleased]: one short line that describes what changes for the person using the extension.
    • New interface text goes into every folder of _locales/; npm run check:locale checks it.
    • There is no bundler, so a new script file has to be added, after the files it depends on, everywhere it is loaded: background.js, popup.html or the content_scripts list in manifest.json. test/load-order.test.js checks the order.

    License

    Released under the Non-Profit Open Software License 3.0 (NPOSL-3.0).

    Copyright © 2026 Scrapfly.