网站截图 API
同步截图
screenshot 端点运行浏览器会话,执行 JavaScript,并在单次同步请求中返回 base64 编码的图像。
POST
/
v1
/
screenshot
同步截图
curl --request POST \
--url https://screenshot.cleariflow.com/v1/screenshot \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"api_key": "<string>",
"session_id": "<string>",
"fingerprint": "<string>",
"render": {},
"render.wait_until": "<string>",
"render.timeout_ms": 123,
"render.post_load_wait_ms": 123,
"render.ignore_https_errors": true,
"render.full_page": true,
"render.screenshot_format": "<string>",
"render.user_agent": "<string>",
"render.viewport": {},
"resources": {},
"resources.block": [
{}
],
"actions": [
{}
],
"actions[].type": "<string>",
"actions[].selector": "<string>",
"actions[].text": "<string>",
"actions[].css": "<string>",
"actions[].to": "<string>",
"actions[].wait_ms": 123,
"cookies": [
{}
],
"capture_full_page": true,
"width": 123,
"height": 123,
"delay": 123,
"css_injection": "<string>",
"export_format": "<string>"
}
'import requests
url = "https://screenshot.cleariflow.com/v1/screenshot"
payload = {
"url": "<string>",
"api_key": "<string>",
"session_id": "<string>",
"fingerprint": "<string>",
"render": {},
"render.wait_until": "<string>",
"render.timeout_ms": 123,
"render.post_load_wait_ms": 123,
"render.ignore_https_errors": True,
"render.full_page": True,
"render.screenshot_format": "<string>",
"render.user_agent": "<string>",
"render.viewport": {},
"resources": {},
"resources.block": [{}],
"actions": [{}],
"actions[].type": "<string>",
"actions[].selector": "<string>",
"actions[].text": "<string>",
"actions[].css": "<string>",
"actions[].to": "<string>",
"actions[].wait_ms": 123,
"cookies": [{}],
"capture_full_page": True,
"width": 123,
"height": 123,
"delay": 123,
"css_injection": "<string>",
"export_format": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
api_key: '<string>',
session_id: '<string>',
fingerprint: '<string>',
render: {},
'render.wait_until': '<string>',
'render.timeout_ms': 123,
'render.post_load_wait_ms': 123,
'render.ignore_https_errors': true,
'render.full_page': true,
'render.screenshot_format': '<string>',
'render.user_agent': '<string>',
'render.viewport': {},
resources: {},
'resources.block': [{}],
actions: [{}],
'actions[].type': '<string>',
'actions[].selector': '<string>',
'actions[].text': '<string>',
'actions[].css': '<string>',
'actions[].to': '<string>',
'actions[].wait_ms': 123,
cookies: [{}],
capture_full_page: true,
width: 123,
height: 123,
delay: 123,
css_injection: '<string>',
export_format: '<string>'
})
};
fetch('https://screenshot.cleariflow.com/v1/screenshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://screenshot.cleariflow.com/v1/screenshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'api_key' => '<string>',
'session_id' => '<string>',
'fingerprint' => '<string>',
'render' => [
],
'render.wait_until' => '<string>',
'render.timeout_ms' => 123,
'render.post_load_wait_ms' => 123,
'render.ignore_https_errors' => true,
'render.full_page' => true,
'render.screenshot_format' => '<string>',
'render.user_agent' => '<string>',
'render.viewport' => [
],
'resources' => [
],
'resources.block' => [
[
]
],
'actions' => [
[
]
],
'actions[].type' => '<string>',
'actions[].selector' => '<string>',
'actions[].text' => '<string>',
'actions[].css' => '<string>',
'actions[].to' => '<string>',
'actions[].wait_ms' => 123,
'cookies' => [
[
]
],
'capture_full_page' => true,
'width' => 123,
'height' => 123,
'delay' => 123,
'css_injection' => '<string>',
'export_format' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://screenshot.cleariflow.com/v1/screenshot"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://screenshot.cleariflow.com/v1/screenshot")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://screenshot.cleariflow.com/v1/screenshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"image_base64": "/9j/4AAQSkZJRg...",
"content_type": "image/jpeg",
"meta": {
"elapsed_ms": 4521
}
}
入门
基础 URL
https://screenshot.cleariflow.com/v1/screenshot
请求示例
curl -X POST 'https://screenshot.cleariflow.com/v1/screenshot' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_UNIQUE_API_KEY",
"url": "https://cleariflow.com",
"capture_full_page": true,
"export_format": "jpeg"
}'
{
"ok": true,
"image_base64": "/9j/4AAQSkZJRg...",
"content_type": "image/jpeg",
"meta": {
"elapsed_ms": 4521
}
}
image_base64 以获取原始 JPEG 或 PNG 字节。
渲染选项
render 对象控制浏览器在截图前如何加载页面。所有字段均为可选 — 省略时使用服务器默认值。
"render": {
"wait_until": "networkidle",
"timeout_ms": 60000,
"post_load_wait_ms": 2000,
"ignore_https_errors": false,
"full_page": true,
"screenshot_format": "jpeg",
"user_agent": "Mozilla/5.0 ...",
"viewport": {
"width": 1365,
"height": 768
}
}
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
wait_until | String | domcontentloaded | 何时认为导航完成。使用 domcontentloaded 获得更快结果;若页面在初始 HTML 后通过 XHR/fetch 加载数据,使用 networkidle。 |
timeout_ms | Integer | 60000 | 等待页面加载的最长时间(毫秒)。 |
post_load_wait_ms | Integer | 0 | wait_until 之后、截图前的额外延迟(毫秒)。适用于动画或懒加载内容。 |
ignore_https_errors | Boolean | false | 为 true 时忽略目标页面的 TLS 证书错误。 |
full_page | Boolean | true | 为 true 时捕获整个可滚动页面高度。 |
screenshot_format | String | jpeg | 输出格式:jpeg 或 png。 |
user_agent | String | — | 浏览器会话的自定义 User-Agent 字符串。 |
viewport | Object | 1365×768 | 通过像素单位的 width 和 height 设置 viewport 大小。 |
便捷字段
这些顶层字段是合并到render 和 actions 的别名,用于向后兼容和简化请求:
| 字段 | 映射到 | 说明 |
|---|---|---|
capture_full_page | render.full_page | 全页截图开关。 |
width / height | render.viewport | viewport 尺寸(像素)。 |
delay | render.post_load_wait_ms | 截图前延迟(秒)。 |
export_format | render.screenshot_format | jpeg 或 png。 |
user_agent | render.user_agent | 自定义 User-Agent。 |
css_injection | inject_css 操作 | 当 actions 中没有 inject_css 操作时,截图前注入的 CSS。 |
curl -X POST 'https://screenshot.cleariflow.com/v1/screenshot' \
-H 'Content-Type: application/json' \
-d '{
"api_key": "YOUR_UNIQUE_API_KEY",
"url": "https://cleariflow.com",
"width": 1280,
"height": 720,
"delay": 2,
"export_format": "png"
}'
资源选项
resources 对象控制浏览器在截图期间加载哪些资源类型。在视觉保真度允许的情况下,阻止重型资源可加快请求速度。
"resources": {
"block": ["images", "fonts", "media"]
}
| 值 | 阻止 |
|---|---|
images | 图片(<img>、CSS 背景) |
fonts | Web 字体 |
media | 视频和音频流 |
Legacy GET 端点
GET /v1/ 返回原始图像字节(JPEG 或 PNG)而非 JSON。参数以查询字符串传递:
https://screenshot.cleariflow.com/v1/?api_key=YOUR_UNIQUE_API_KEY&url=https://cleariflow.com&capture_full_page=true&export_format=jpeg
url、api_key、session_id、fingerprint、capture_full_page、width、height、delay、css_injection、user_agent、export_format。
请求参数
String
必填
要捕获的目标 URL。必须是公开的 HTTP 或 HTTPS URL。对 localhost 和私有 IP 地址的请求会被 SSRF 防护阻止。
String
必填
您的唯一 API 密钥。
String
可选的会话标识符,用于在多个请求之间复用浏览器状态(Cookie、local storage)。
String
浏览器指纹预设。支持的值:
desktop_en_us、desktop_ru_ru、mobile_en_us。Object
浏览器会话的渲染和截图选项。
String
何时认为导航完成。值:
domcontentloaded、networkidle。默认值:domcontentloaded。Integer
等待页面加载的最长时间(毫秒)。默认值:60000。
Integer
页面加载事件之后、截图前的额外延迟(毫秒)。
Boolean
为
true 时忽略目标页面的 TLS 证书错误。Boolean
为
true 时捕获整个可滚动页面。默认值:true。String
输出格式:
jpeg 或 png。默认值:jpeg。String
浏览器会话的自定义 User-Agent。
Object
包含像素单位
width 和 height 的 viewport 大小。Object
资源加载控制。
Array
要阻止的资源类型。支持的值:
images、fonts、media。Array
截图前执行的浏览器操作有序列表。每个操作是带有
type 字段的对象。String
必填
操作类型。支持的值:
wait、wait_for、click、type、scroll、inject_css。String
wait_for、click 或 type 操作的 CSS 选择器。String
type 操作要输入的文本。String
inject_css 操作的 CSS 字符串。String
scroll 操作的滚动目标(例如 bottom)。Integer
wait 操作的持续时间(毫秒)。Array
导航前注入的 Cookie。每个 Cookie 对象需要
name 和 value;可选字段:domain、path。Boolean
render.full_page 的便捷别名。Integer
render.viewport.width 的便捷别名。Integer
render.viewport.height 的便捷别名。Integer
截图前延迟(秒)。映射到
render.post_load_wait_ms。String
当
actions 中尚未存在时,通过 inject_css 操作注入的 CSS。String
render.screenshot_format 的便捷别名。值:jpeg、png。响应参数
API 响应以通用轻量 JSON 格式 返回。Boolean
截图是否成功完成。
String
Base64 编码的图像数据。解码以获取原始 JPEG 或 PNG 字节。
String
图像的 MIME 类型(
image/jpeg 或 image/png)。Object
有关截图的元数据,包括耗时(毫秒)。
Object
当
ok 为 false 时的错误详情。⌘I
同步截图
curl --request POST \
--url https://screenshot.cleariflow.com/v1/screenshot \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>",
"api_key": "<string>",
"session_id": "<string>",
"fingerprint": "<string>",
"render": {},
"render.wait_until": "<string>",
"render.timeout_ms": 123,
"render.post_load_wait_ms": 123,
"render.ignore_https_errors": true,
"render.full_page": true,
"render.screenshot_format": "<string>",
"render.user_agent": "<string>",
"render.viewport": {},
"resources": {},
"resources.block": [
{}
],
"actions": [
{}
],
"actions[].type": "<string>",
"actions[].selector": "<string>",
"actions[].text": "<string>",
"actions[].css": "<string>",
"actions[].to": "<string>",
"actions[].wait_ms": 123,
"cookies": [
{}
],
"capture_full_page": true,
"width": 123,
"height": 123,
"delay": 123,
"css_injection": "<string>",
"export_format": "<string>"
}
'import requests
url = "https://screenshot.cleariflow.com/v1/screenshot"
payload = {
"url": "<string>",
"api_key": "<string>",
"session_id": "<string>",
"fingerprint": "<string>",
"render": {},
"render.wait_until": "<string>",
"render.timeout_ms": 123,
"render.post_load_wait_ms": 123,
"render.ignore_https_errors": True,
"render.full_page": True,
"render.screenshot_format": "<string>",
"render.user_agent": "<string>",
"render.viewport": {},
"resources": {},
"resources.block": [{}],
"actions": [{}],
"actions[].type": "<string>",
"actions[].selector": "<string>",
"actions[].text": "<string>",
"actions[].css": "<string>",
"actions[].to": "<string>",
"actions[].wait_ms": 123,
"cookies": [{}],
"capture_full_page": True,
"width": 123,
"height": 123,
"delay": 123,
"css_injection": "<string>",
"export_format": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
url: '<string>',
api_key: '<string>',
session_id: '<string>',
fingerprint: '<string>',
render: {},
'render.wait_until': '<string>',
'render.timeout_ms': 123,
'render.post_load_wait_ms': 123,
'render.ignore_https_errors': true,
'render.full_page': true,
'render.screenshot_format': '<string>',
'render.user_agent': '<string>',
'render.viewport': {},
resources: {},
'resources.block': [{}],
actions: [{}],
'actions[].type': '<string>',
'actions[].selector': '<string>',
'actions[].text': '<string>',
'actions[].css': '<string>',
'actions[].to': '<string>',
'actions[].wait_ms': 123,
cookies: [{}],
capture_full_page: true,
width: 123,
height: 123,
delay: 123,
css_injection: '<string>',
export_format: '<string>'
})
};
fetch('https://screenshot.cleariflow.com/v1/screenshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://screenshot.cleariflow.com/v1/screenshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'url' => '<string>',
'api_key' => '<string>',
'session_id' => '<string>',
'fingerprint' => '<string>',
'render' => [
],
'render.wait_until' => '<string>',
'render.timeout_ms' => 123,
'render.post_load_wait_ms' => 123,
'render.ignore_https_errors' => true,
'render.full_page' => true,
'render.screenshot_format' => '<string>',
'render.user_agent' => '<string>',
'render.viewport' => [
],
'resources' => [
],
'resources.block' => [
[
]
],
'actions' => [
[
]
],
'actions[].type' => '<string>',
'actions[].selector' => '<string>',
'actions[].text' => '<string>',
'actions[].css' => '<string>',
'actions[].to' => '<string>',
'actions[].wait_ms' => 123,
'cookies' => [
[
]
],
'capture_full_page' => true,
'width' => 123,
'height' => 123,
'delay' => 123,
'css_injection' => '<string>',
'export_format' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://screenshot.cleariflow.com/v1/screenshot"
payload := strings.NewReader("{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://screenshot.cleariflow.com/v1/screenshot")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://screenshot.cleariflow.com/v1/screenshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"url\": \"<string>\",\n \"api_key\": \"<string>\",\n \"session_id\": \"<string>\",\n \"fingerprint\": \"<string>\",\n \"render\": {},\n \"render.wait_until\": \"<string>\",\n \"render.timeout_ms\": 123,\n \"render.post_load_wait_ms\": 123,\n \"render.ignore_https_errors\": true,\n \"render.full_page\": true,\n \"render.screenshot_format\": \"<string>\",\n \"render.user_agent\": \"<string>\",\n \"render.viewport\": {},\n \"resources\": {},\n \"resources.block\": [\n {}\n ],\n \"actions\": [\n {}\n ],\n \"actions[].type\": \"<string>\",\n \"actions[].selector\": \"<string>\",\n \"actions[].text\": \"<string>\",\n \"actions[].css\": \"<string>\",\n \"actions[].to\": \"<string>\",\n \"actions[].wait_ms\": 123,\n \"cookies\": [\n {}\n ],\n \"capture_full_page\": true,\n \"width\": 123,\n \"height\": 123,\n \"delay\": 123,\n \"css_injection\": \"<string>\",\n \"export_format\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"image_base64": "/9j/4AAQSkZJRg...",
"content_type": "image/jpeg",
"meta": {
"elapsed_ms": 4521
}
}