趣味工具
转换颜色格式并计算 WCAG 对比度
GET
/color/{hex}公开访问curl
_format=svg 返回原色、更亮、更暗和补色的色板,公开缓存 1 天。对比度按不透明 RGB 计算。 访问类别:匿名 API,可携带 Token 使用独立额度
请求参数
hexpath必填- 3、4、6 或 8 位十六进制,可带 #
- string · 3、4、6 或 8 位十六进制,可带 # · 最短:3 字符 · 最长:9 字符
againstquery- 可选的对照色
- string · 可选的对照色 · 最短:3 字符 · 最长:9 字符
_formatquery- 响应格式为 svg、json 或 text。/color/{hex} 默认 JSON,带 curl* 标记的接口默认 SVG。plain 是 text 的别名。未识别的值继续按 Accept 协商。
- string · 可选:svg、json、text
_colorquery- 控制 text 响应的 ANSI 颜色。0、false、off、no 关闭;省略或其他值保留。
- string · 可选:0、false、off、no
响应
200 颜色分量、CSS 写法、相对亮度和 WCAG 对比度。_format=svg 时为色板。
application/json
{
"type": "object",
"properties": {
"hex": {
"type": "string"
},
"rgb": {
"type": "object",
"properties": {
"r": {
"type": "number"
},
"g": {
"type": "number"
},
"b": {
"type": "number"
},
"a": {
"type": "number"
}
},
"required": [
"r",
"g",
"b",
"a"
]
},
"hsl": {
"type": "object",
"properties": {
"h": {
"type": "number"
},
"s": {
"type": "number"
},
"l": {
"type": "number"
}
},
"required": [
"h",
"s",
"l"
]
},
"css": {
"type": "object",
"properties": {
"hex": {
"type": "string"
},
"rgb": {
"type": "string"
},
"hsl": {
"type": "string"
}
},
"required": [
"hex",
"rgb",
"hsl"
]
},
"luminance": {
"type": "number"
},
"contrast": {
"type": "object",
"properties": {
"black": {
"type": "object",
"properties": {
"ratio": {
"type": "number"
},
"aa": {
"type": "boolean"
},
"aaa": {
"type": "boolean"
},
"aaLarge": {
"type": "boolean"
},
"aaaLarge": {
"type": "boolean"
}
},
"required": [
"ratio",
"aa",
"aaa",
"aaLarge",
"aaaLarge"
]
},
"white": {
"type": "object",
"properties": {
"ratio": {
"type": "number"
},
"aa": {
"type": "boolean"
},
"aaa": {
"type": "boolean"
},
"aaLarge": {
"type": "boolean"
},
"aaaLarge": {
"type": "boolean"
}
},
"required": [
"ratio",
"aa",
"aaa",
"aaLarge",
"aaaLarge"
]
},
"against": {
"type": [
"object",
"null"
],
"properties": {
"ratio": {
"type": "number"
},
"aa": {
"type": "boolean"
},
"aaa": {
"type": "boolean"
},
"aaLarge": {
"type": "boolean"
},
"aaaLarge": {
"type": "boolean"
}
},
"required": [
"ratio",
"aa",
"aaa",
"aaLarge",
"aaaLarge"
]
}
},
"required": [
"black",
"white",
"against"
]
}
},
"required": [
"hex",
"rgb",
"hsl",
"css",
"luminance",
"contrast"
],
"additionalProperties": {}
}image/svg+xml
{
"type": "string"
}400 请求校验或执行失败
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}401 凭据无效、停用、过期或缺少所需 Token
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}403 需要管理员 Token
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}413 请求体过大
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}415 请求内容类型无效
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}429 请求过于频繁,Retry-After 为建议等待秒数;匿名额度及认证保护在各 Cloudflare 地点近似计数,Token 业务额度使用 D1 原子计数
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}500 内部执行失败
application/json
{
"type": "object",
"properties": {
"error": {
"type": "object",
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"issues": {
"type": "array",
"items": {
"type": "object",
"properties": {
"location": {
"type": "string",
"enum": [
"body",
"query",
"path",
"header"
]
},
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string"
}
},
"required": [
"location",
"field",
"code",
"message"
]
}
}
},
"required": [
"code",
"message"
]
}
},
"required": [
"error"
]
}响应示例
运行命令前,将环境变量 BASE_URL 设置为站点地址。
成功响应
curl --silent --show-error -H 'User-Agent: simpleWebUtils-example/2.0.1' -H 'Accept: application/json' "$BASE_URL"'/color/336699'
HTTP 200
content-type: application/json
content-encoding: gzip
cache-control: no-store
{
"hex": "#336699",
"rgb": {
"r": 51,
"g": 102,
"b": 153,
"a": 1
},
"hsl": {
"h": 210,
"s": 50,
"l": 40
},
"css": {
"hex": "#336699",
"rgb": "rgb(51, 102, 153)",
"hsl": "hsl(210, 50%, 40%)"
},
"luminance": 0.125,
"contrast": {
"black": {
"ratio": 3.5,
"aa": false,
"aaa": false,
"aaLarge": true,
"aaaLarge": false
},
"white": {
"ratio": 6,
"aa": true,
"aaa": false,
"aaLarge": true,
"aaaLarge": true
},
"against": null
}
}错误示例
curl --silent --show-error -H 'User-Agent: simpleWebUtils-example/2.0.1' -H 'Accept: application/json' "$BASE_URL"'/color/invalid%20value?against=hello'
HTTP 400
content-type: application/json
content-encoding: gzip
cache-control: no-store
{
"error": {
"code": "INVALID_INPUT",
"message": "参数无效",
"issues": [
{
"location": "path",
"field": "hex",
"code": "too_big",
"message": "字符数最多为 9"
}
]
}
}curl 访问示例
curl、wget、HTTPie 默认得到 text/plain。示例展示纯文本输出。
命令与输出
curl --silent --show-error -H 'User-Agent: curl/8.7.1' "$BASE_URL"'/color/336699?_color=0'
HTTP 200
content-type: text/plain; charset=utf-8
content-encoding: gzip
cache-control: no-store
hex: #336699
rgb:
r: 51
g: 102
b: 153
a: 1
hsl:
h: 210
s: 50
l: 40
css:
hex: #336699
rgb: rgb(51, 102, 153)
hsl: hsl(210, 50%, 40%)
luminance: 0.125
contrast:
black:
ratio: 3.5
aa: false
aaa: false
aaLarge: true
aaaLarge: false
white:
ratio: 6
aa: true
aaa: false
aaLarge: true
aaaLarge: true
against: null
在线调试
调用示例
curl -X GET 'https://oit.sh/color/336699'
响应
等待发送请求
配置上方请求参数后点击「发送请求」查看实时响应
快捷键:Ctrl / ⌘ + Enter