arkennemasis ScreenshotOne (hosted, ad-free page shot)
The screenshot service that photographs articles, not consent dialogs
- image
- report
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
.envand the env var. - The shot is the nav bar, not the headline: that site's DOM doesn't match the default
scroll_into_viewselector. Inspect the page and update it, or leave blank for the top. - Unexpected charges:
force_refetchis opt-in for a reason. The cache is your friend; every fetch is a billed fetch.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| url | STRING | The page to photograph. | |
| device | COMBO | Viewport to emulate. The phone devices are what give a tall portrait shot that sits behind a vertical video. | |
| image_format | COMBO | jpg is what the original used; png if you need a clean edge for compositing. | |
| image_quality | INT | 8020–100 | JPEG quality. Ignored for png. |
| scroll_into_viewopt | STRING | body > div.wp-site-blocks > header > div > div | CSS 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_topopt | INT | 500-4000–8000 | Pixels past the matched element. 500 with a site-header selector lands on the article title. |
| block_adsopt | BOOLEAN | true | — |
| block_cookie_bannersopt | BOOLEAN | true | The single most valuable setting here. Without it most publisher pages photograph as a consent dialog. |
| block_trackersopt | BOOLEAN | true | — |
| block_banners_by_heuristicsopt | BOOLEAN | false | Aggressive extra pass. Off by default because it also removes legitimate page furniture. |
| full_pageopt | BOOLEAN | false | Capture the whole scroll height instead of one viewport. Produces a very tall image; `scroll_into_view` then has nothing to do. |
| delayopt | INT | 00–30 | Extra settle time server-side, in seconds. |
| timeoutopt | INT | 6010–120 | — |
| widthopt | INT | 43064–4096 | Only used when `device` is the none option. |
| heightopt | INT | 93264–8192 | — |
| access_keyopt | STRING | Leave 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_refetchopt | BOOLEAN | false | Shoot 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)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| report | STRING | — |