From c3a14c8eef05acf8b6a7660db64d373d1d853876 Mon Sep 17 00:00:00 2001 From: emotion04 <1695617871@qq.com> Date: Mon, 20 Jul 2026 14:28:17 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20add=20bing-cli=20=E2=80=94=20Bing?= =?UTF-8?q?=20search=20CLI=20powered=20by=20browser=20automation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- bing-cli/.gitignore | 15 ++ bing-cli/.gitignore.baiduyun.uploading.cfg | Bin 0 -> 679 bytes bing-cli/ARCHAEOLOGY.md | 97 +++++++++ bing-cli/README.md | 103 +++++++++ bing-cli/bing/common.go | 41 ++++ .../bing/common.go.baiduyun.uploading.cfg | Bin 0 -> 685 bytes bing-cli/bing/result.go | 73 +++++++ .../bing/result.go.baiduyun.uploading.cfg | Bin 0 -> 684 bytes bing-cli/bing/search.go | 206 ++++++++++++++++++ bing-cli/browser/client.go | 120 ++++++++++ bing-cli/cmd/root.go | 178 +++++++++++++++ bing-cli/go.mod | 9 + bing-cli/go.sum | 10 + bing-cli/main.go | 12 + bing-cli/output/output.go | 24 ++ 15 files changed, 888 insertions(+) create mode 100644 bing-cli/.gitignore create mode 100644 bing-cli/.gitignore.baiduyun.uploading.cfg create mode 100644 bing-cli/ARCHAEOLOGY.md create mode 100644 bing-cli/README.md create mode 100644 bing-cli/bing/common.go create mode 100644 bing-cli/bing/common.go.baiduyun.uploading.cfg create mode 100644 bing-cli/bing/result.go create mode 100644 bing-cli/bing/result.go.baiduyun.uploading.cfg create mode 100644 bing-cli/bing/search.go create mode 100644 bing-cli/browser/client.go create mode 100644 bing-cli/cmd/root.go create mode 100644 bing-cli/go.mod create mode 100644 bing-cli/go.sum create mode 100644 bing-cli/main.go create mode 100644 bing-cli/output/output.go diff --git a/bing-cli/.gitignore b/bing-cli/.gitignore new file mode 100644 index 0000000..789fcb5 --- /dev/null +++ b/bing-cli/.gitignore @@ -0,0 +1,15 @@ +# Build output +/bing-cli +*.exe +*.dll +*.so +*.dylib + +# Test binaries +*.test +*.out + +# Editors +.vscode/ +.idea/ +.DS_Store diff --git a/bing-cli/.gitignore.baiduyun.uploading.cfg b/bing-cli/.gitignore.baiduyun.uploading.cfg new file mode 100644 index 0000000000000000000000000000000000000000..2ee1ffa856784a0c8f8e3ad2f60d07668e84d888 GIT binary patch literal 679 zcmV;Y0$BZqF-iDYjVh`4HCJ0Df~^-ztXiAJX}YXmS<2Q7pVKYR&@NG(Jk2Kp zqH`H(NyVN`@B)C!e6>o+Q6;s5*w#}wupl!TN1?r<+(UGkaU>0R|dKNC`fOHFV>m;fyd*Ab-(!O z6>t^QWB5V4ssQPh85y5_zVOkqJr1}IGdR&i5cY0q!r z4fXS)=uu})|2Pha`+A`^w)EsG#a6#MSlb^}18S{(#BIJ_@yAf;JVjSwL$~3)ZdKra zyVe!8nni8SAtvgR$mFB%?Qs6CMm)onv1*}+N4G^ZX!!AhG4IgC`oDFXx;XhHFhZ~H zMhd8;2^g%RnB*4pcAzHfyf)v$xh$K^r3h?$$odTv(em9~VB`^T-{y9OX!ivNBUSmC z)Mo@*CT^VXT~cYE?%+EQny?q3MYK7$?!JXeC2Cm@Nz47Qtbd@OBKkUu^7@aHbSO6? zbNYpskJ~LjHhuVGcqtttWvy@7Aq8Etb`VG$7f4Qp`Z}` + +**URL:** `GET https://www.bing.com/search?q=&count=&offset=` + +- No auth required for basic search. +- Results are SSR'd in the DOM — no XHR needed for page one. +- Chinese market (`cc=cn&setlang=zh-Hans`) vs international (`cc=us&setlang=en`). +- `count` max is ~50 per page. `offset` enables pagination. + +### DOM Structure + +Each organic result lives in: + +```html +
  • + +

    Title text

    +
    https://example.com
    +

    Snippet text...

    +
  • +``` + +**Selectors:** + +| Field | Selector | Notes | +|---------|----------------|-------| +| title | `#b_results > li.b_algo h2 a` textContent | | +| url | `#b_results > li.b_algo .b_attribution cite` textContent | Display URL (domain only) | +| snippet | `#b_results > li.b_algo .b_caption p` textContent | May include breadcrumb prefix | +| source | same as `cite` | | +| bingHref| `h2 a` getAttribute("href") | Encrypted /ck/a redirect — resolved on Go side | + +### Extract Strategy + +Async IIFE with 8 s polling deadline (google-cli pattern): + +1. Check for consent interstitial (`location.host.startsWith('consent.')`). +2. Poll `#b_results > li.b_algo` every 500 ms until results appear. +3. Deduplicate by display URL (Set). +4. Clean snippet: `replace(/\s+/g, " ")`, strip trailing "Read more", slice to 300. + +### Gotchas + +- **Encrypted href**: The `

    ` `href` is a Bing redirect (`/ck/a?...&u=`). The CLI follows each redirect via HTTP GET and extracts the real URL from the response HTML body using a regex. +- **Inline `