---
name: bing-image-search
description: |
  通过 Bing 图片搜索快速搜图，并行 HEAD 校验 URL 可用性后以 Markdown 行内图片语法直接嵌入预览。
  当用户说"找图片"、"搜图"、"发几张XX图"、"给我看看XX照片"、"找一些XX相关的图片"时使用。
  不要用 web_search 搜图（返回文本不含图片URL），直接用本 skill 的 curl 方案。
homepage: https://cn.bing.com/images/
metadata: { "openclaw": { "emoji": "🖼️", "requires": { "bins": ["curl", "grep", "xargs", "awk"] } } }
---

# Bing 图片搜索与预览

## 核心流程

```
Bing 图片搜索 → 提取 murl → 并行 HEAD 校验 → ![alt](url) 嵌入 → 发出
```

一步到位，不下载、不上传、不经过图像生成。

## 一键脚本：搜图 + 并行校验

把搜图和校验写在同一个 exec 里。**校验是并行的**（`xargs -P 10`），整轮耗时约等于单次超时（~3s），与 `N` 几乎无关：

```bash
N=3                       # 需要张数
QUERY="cute cats"         # 关键词，建议英文；含中文时需 URL 编码
POOL=20                   # 候选池；越大越鲁棒，并行校验不会变慢

# 1) 抓 Bing 图片搜索结果，提取去重后的原图 URL（最多 POOL 个）
URLS=$(curl -sL --max-time 10 \
  "https://cn.bing.com/images/search?q=${QUERY// /+}&first=0&count=${POOL}" \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' \
  | grep -oP 'murl&quot;:&quot;\K[^&"]+\.(jpg|jpeg|png|webp)[^&"]*' \
  | awk '!seen[$0]++' \
  | head -n "$POOL")

# 2) 并行 HEAD 校验，只输出可达 URL；取前 N 个即可
#    stderr 重定向是为了消掉 head 提前关闭管道时 xargs 的 SIGPIPE 噪声
printf '%s\n' "$URLS" | xargs -P 10 -I{} bash -c '
  url="$1"
  code=$(curl -sI -L --max-redirs 3 --connect-timeout 2 --max-time 3 \
    -H "Referer: https://cn.bing.com/" \
    -H "User-Agent: Mozilla/5.0" \
    -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
  [ "$code" = "200" ] && printf "%s\n" "$url"
' _ {} 2>/dev/null | head -n "$N"
```

输出每行一个 URL，直接拿来嵌入即可。

## 仅搜图（不校验）

调试或仅需原始候选列表时：

```bash
curl -sL --max-time 10 \
  "https://cn.bing.com/images/search?q=cute+cats&first=0&count=20" \
  -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36' \
  | grep -oP 'murl&quot;:&quot;\K[^&"]+\.(jpg|jpeg|png|webp)[^&"]*' \
  | awk '!seen[$0]++' | head -n 10
```

## 仅校验（已有 URL 列表）

把 URL 一行一个传给：

```bash
xargs -P 10 -I{} bash -c '
  url="$1"
  code=$(curl -sI -L --max-redirs 3 --connect-timeout 2 --max-time 3 \
    -H "Referer: https://cn.bing.com/" -H "User-Agent: Mozilla/5.0" \
    -o /dev/null -w "%{http_code}" "$url" 2>/dev/null)
  [ "$code" = "200" ] && printf "%s\n" "$url"
' _ {} 2>/dev/null
```

## 嵌入预览

拿到校验通过的 URL 后，每行一条：

```markdown
![描述](URL1)
![描述](URL2)
![描述](URL3)
```

## 性能要点

- **并行校验**：从 N 张图近 `N × max-time` 的串行耗时降到 `max-time` 量级（~3s）。`POOL=20`、`-P 10` 是经验上的甜点。
- **`--connect-timeout 2`**：与 `--max-time 3` 配合，避免 DNS / 三次握手卡满整个 budget。
- **`grep -oP '...\K...'`**：用 PCRE lookbehind 直接得到捕获，省掉 `sed` 管道。
- **`awk '!seen[$0]++'`**：先去重再校验，防止候选池里重复 URL 浪费请求。
- **`Referer: cn.bing.com`**：很多图床只允许"来自搜索引擎"的请求，加了能显著降低裂图率。
- **`head -n "$N"`**：取够即停；上游 `xargs` 会因 SIGPIPE 自动收敛。

## 注意事项

1. **不要下载图片到本地** — 聊天直接用源站 URL 嵌入，不落盘。
2. **不要用 web_search 搜图** — 返回文本摘要，不含图片 URL。
3. **必须校验** — 跳过 HEAD 校验直接嵌 URL，防盗链域名会导致裂图。
4. **关键词优先英文** — Bing 图库英文关键词结果质量和数量都更好；中文关键词请先 URL 编码（`jq -rR @uri` 或 `python3 -c 'import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))' "$QUERY"`）。
5. **User-Agent 必须带** — Bing 会按 UA 节流，不带的请求量太少。
6. **依赖 GNU grep 的 `-P`** — Linux 默认满足；macOS 需 `brew install grep` 后用 `ggrep`，或换用 `pcregrep`。
7. **若所有候选都校验失败** — 增大 `POOL` 重试，或换关键词；少数图床会拒绝 `HEAD`，必要时改成 `curl -sL -r 0-0 -o /dev/null -w '%{http_code}'` 用 1-byte GET 兜底。
