Nodes/arkennemasis Nodes/arkennemasis ScreenshotOne (hosted, ad-free page shot)
ComfyUI Node

arkennemasis ScreenshotOne (hosted, ad-free page shot)

The screenshot service that photographs articles, not consent dialogs

By Hishamahmer·Created about a month ago·Updated a day ago· 6
arkennemasis ScreenshotOne (hosted, ad-free page shot)
    • image
    • report
    url
    device
    image_format
    image_quality80
    scroll_into_viewbody > div.wp-site-blocks > header > div > div
    scroll_adjust_top500
    block_adstrue
    block_cookie_bannerstrue
    block_trackerstrue
    block_banners_by_heuristicsfalse
    full_pagefalse
    delay0
    timeout60
    width430
    height932
    access_key
    force_refetchfalse

    There's a reason the pack has two screenshot nodes. ArkWebShot drives your local browser, is free, and is great at reading a page - but a real publisher page is a consent wall, a notification prompt, and three ad slots stacked over the article. Fighting that with injected JavaScript is an arms race against every cookie-consent vendor on the internet. ArkScreenshotOne is the hosted version that already won that fight: ads, cookie banners and trackers are blocked server-side, the article headline is scrolled into frame, and you get a clean picture. Some sites photograph correctly through this service and as a consent dialog through a plain browser - the pack's README says so outright.

    The catch is spelled out in the name of the game: it's billed per shot, and the key comes from your environment, never from the workflow file.

    How it works

    The node calls the ScreenshotOne API. The url and the device viewport (device defaults to iphone_15_pro_max - the phone options are what give you a tall portrait shot that sits behind a vertical video) plus image_format (jpg default; png if you need a clean edge for compositing) and image_quality make up the required set.

    Then the settings that actually matter:

    • block_cookie_banners - the tooltip calls it "the single most valuable setting here," and it isn't exaggerating. Without it, most publisher pages photograph as a consent dialog.
    • scroll_into_view + scroll_adjust_top - the CSS selector that frames the headline instead of the nav bar. The default fits one specific WordPress theme, and the tooltip warns you that a selector that fits one publisher doesn't fit another. Blank shoots the top of the page.
    • force_refetch - off by default, deliberately. Every fetch is billed, so the cached image is what you want while you tune anything downstream. Re-shooting is an explicit opt-in act.

    The key handling is the part that matters for sharing workflows: access_key is left blank. The node reads SCREENSHOTONE_ACCESS_KEY from the environment or the .env file at the portable root - so a saved workflow carries no secret and can be shared as-is. That's the same key-resolution pattern (node field → env var → .env) the pack uses across its API nodes, and it's the right one: no secret ever sits in a workflow JSON that gets committed to git.

    Outputs: image and a report.

    Installing

    cd ComfyUI/custom_nodes
    git clone https://github.com/Hishamahmer/comfyui-arkennemasis
    pip install replicate httpx
    

    Then get a ScreenshotOne key and drop it in .env at the ComfyUI root (the pack's README prefers the root over the repo folder, so re-cloning never touches your secret):

    SCREENSHOTONE_ACCESS_KEY=your_key_here
    

    Restart ComfyUI.

    Troubleshooting

    • It refuses to shoot / errors on auth: the key isn't in the environment. It's never in the node - check .env and the env var.
    • The shot is the nav bar, not the headline: that site's DOM doesn't match the default scroll_into_view selector. Inspect the page and update it, or leave blank for the top.
    • Unexpected charges: force_refetch is opt-in for a reason. The cache is your friend; every fetch is a billed fetch.
    Categoryarkennemasis/Utility

    Inputs (17)

    NameTypeDefaultDescription
    urlSTRINGThe page to photograph.
    deviceCOMBOViewport to emulate. The phone devices are what give a tall portrait shot that sits behind a vertical video.
    image_formatCOMBOjpg is what the original used; png if you need a clean edge for compositing.
    image_qualityINT8020–100JPEG quality. Ignored for png.
    scroll_into_viewoptSTRINGbody > div.wp-site-blocks > header > div > divCSS selector to scroll to before the shutter. This is what frames the headline instead of the nav bar — and the reason a selector that fits one publisher does not fit another. Blank shoots the top of the page.
    scroll_adjust_topoptINT500-4000–8000Pixels past the matched element. 500 with a site-header selector lands on the article title.
    block_adsoptBOOLEANtrue
    block_cookie_bannersoptBOOLEANtrueThe single most valuable setting here. Without it most publisher pages photograph as a consent dialog.
    block_trackersoptBOOLEANtrue
    block_banners_by_heuristicsoptBOOLEANfalseAggressive extra pass. Off by default because it also removes legitimate page furniture.
    full_pageoptBOOLEANfalseCapture the whole scroll height instead of one viewport. Produces a very tall image; `scroll_into_view` then has nothing to do.
    delayoptINT00–30Extra settle time server-side, in seconds.
    timeoutoptINT6010–120
    widthoptINT43064–4096Only used when `device` is the none option.
    heightoptINT93264–8192
    access_keyoptSTRINGLeave BLANK. The key is read from SCREENSHOTONE_ACCESS_KEY in the environment or the .env at the portable root, so no secret is saved into the workflow file.
    force_refetchoptBOOLEANfalseShoot again even though nothing changed. Every fetch is billed, so this is opt-in — the cached image is what you want while tuning anything downstream.

    Outputs (2)

    NameTypeDescription
    imageIMAGE
    reportSTRING