fix: 联想建议词改成「统一来源 + 自动兜底」,任何引擎都能出词
问题:除百度/360 外,其它引擎的联想下拉基本是空的。 实测(2026-09-28 在站点服务器上逐个探测): 百度 sugrec 200 / 0.12s / 1137B ✅ 最快最稳 360 sug.so.360.cn 200 / 0.20s / 714B ✅ 必应 api.bing.com 200 / 0.5~1.6s ✅ 可用但明显慢 搜狗 ajajjson 200 / **0 字节** ❌ 联想域名 w.sugg.sogou.com 已不解析 谷歌 suggestqueries 连接超时 ❌ 国内不可达 DuckDuckGo 连接超时 ❌ 国内不可达 按「联想统一取百度、搜索仍走各自引擎」实现: - 新增设置 suggest_source(设置页可选 百度/必应/360/各引擎自己的接口),默认百度。 - 任何情况下都带自动兜底链:首选来源取不到词(接口挂/超时/返回空) 就依次回退 百度 → 必应 → 360;单个候选 3 秒超时,绝不让下拉框卡住。 - 候选来源不过滤 is_active —— 作为联想来源的引擎可能在前台被隐藏。 - 响应里带 src 字段标明这次实际用的是谁,便于排查。 顺带修一个更隐蔽的 bug:前台 <form id="search-form"> 原本**没有 data-slug**, 而 JS 只在「点击引擎标签」时才把它写上 → 一进站、没点过引擎时 slug 为空, suggest.php 查不到引擎,联想**全都不出词**。现在表单自带默认引擎的 slug。 其它: - 清掉种子里已失效的搜狗联想地址;加一条幂等迁移,只匹配默认种子值, 用户自己改过的地址不动。谷歌/DDG 也不再预设(前端不可达)。 - app.js:请求加序号,防止先发的慢响应覆盖后发的快响应;切换引擎时 若输入框已有内容就顺带换一份建议。 - e2e 新增「联想来源」场景(本地桩服务器 + 独立端口,不依赖外网): 8 条断言覆盖 默认来源 / auto 模式 / 回退 / 空关键词 / 响应头。 验证:本地 e2e 57/57;部署 38 文件哈希逐字节一致、双版本 php -l、37 条 静态断言全过;线上实测 google/sogou/ddg 三个「自家接口不可用」的引擎 均返回 10 条百度建议(src=baidu),中英文都正常。
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
- **轻量**:纯 PHP + SQLite,不依赖 MySQL / 框架 / Composer;前端无 Bootstrap / jQuery,原生 CSS + JS。
|
||||
- **个人向**:单管理员,页面就是「你自己常用网站的起始页」。
|
||||
- **搜索引擎可切换 + 联想下拉**:后台勾选喜欢的搜索引擎即可显示在顶部;输入时下拉联想词由服务端代理(规避跨域)。后台的「显示/隐藏」按钮点一下**原地生效、不跳页**,且无 JS 时也能正常提交。
|
||||
- **搜索引擎可切换 + 联想下拉**:后台勾选喜欢的搜索引擎即可显示在顶部;输入时下拉建议词由服务端代理(规避跨域)。默认**联想词统一取百度、搜索走各自引擎**,并带自动兜底,任何引擎都保证有下拉词(详见下节实测表)。后台的「显示/隐藏」按钮点一下**原地生效、不跳页**,且无 JS 时也能正常提交。
|
||||
- **添加即补全**:填网址后先访问该网址拿到标题,再按「高清优先」的顺序去网上找相关图标(`manifest` 512 → `apple-touch-icon` → `<link rel=icon>` → 第三方聚合服务),下载后统一规范化为 **128×128 PNG** 存到服务器本地。
|
||||
- **图标可自定义,且自定义后不再被覆盖**:可为任一网站上传图标或直接填图标地址;一旦自定义,该网站的图标会被标记保护,「一键全部更新」只刷新它的名称、跳过图标。
|
||||
- **显示简称**:每个网站有「名称(自动)」和「简称(手动)」两个字段,页面展示你自定义的简称。
|
||||
@@ -58,20 +58,39 @@ SimpleNav/
|
||||
> 需要额外说明的是:**服务器上若装了宝塔「网站加速」之类的页面缓存插件,本站也不需要为它做任何特殊配置**。
|
||||
> 动态页发的 `Cache-Control: ... no-cache ...` 会被这类插件视为「不缓存」而直接跳过写入。
|
||||
|
||||
## 搜索引擎联想接口说明
|
||||
## 搜索联想(建议词)说明
|
||||
|
||||
联想接口需服务端代理(浏览器直接调用会跨域)。内置解析类型:
|
||||
联想接口必须由**服务端代理**(浏览器直接调用会跨域)。2026-09-28 在本站服务器实测各家的可用性:
|
||||
|
||||
| 类型 | 平台 | 联想接口 |
|
||||
| 引擎 | 联想接口 | 实测 | 结论 |
|
||||
|---|---|---|---|
|
||||
| 百度 | `www.baidu.com/sugrec?prod=pc&wd={q}` | 200 / 0.12s | ✅ 最快最稳 |
|
||||
| 360 | `sug.so.360.cn/suggest?...&word={q}` | 200 / 0.20s | ✅ |
|
||||
| 必应 | `api.bing.com/osjson.aspx?query={q}` | 200 / 0.5~1.6s | ✅ 可用但明显慢 |
|
||||
| 搜狗 | `www.sogou.com/suggnew/ajajjson?...` | 200 / **0 字节** | ❌ 已失效(联想域名不再解析) |
|
||||
| 谷歌 | `suggestqueries.google.com/complete/search?...` | 连接超时 | ❌ 国内不可达 |
|
||||
| DuckDuckGo | `duckduckgo.com/ac/?...` | 连接超时 | ❌ 国内不可达 |
|
||||
|
||||
因此默认策略是——**联想词统一取百度,搜索仍走各自引擎**:点哪个引擎就用哪个引擎去搜,
|
||||
只是输入框下面的建议来自百度,这样切到任何引擎都有下拉词。
|
||||
|
||||
后台「设置 → 联想词来源」可切换:`百度`(默认)/ `必应` / `360` / `各搜索引擎自己的接口`。
|
||||
任何情况下都带**自动兜底链**:首选来源取不到词(接口挂了、超时、返回空)就依次回退
|
||||
`百度 → 必应 → 360`,所以下拉框不会因为某家接口失效而变空。
|
||||
|
||||
> 想在某个引擎上恢复「用自己的联想接口」,把来源改成「各搜索引擎自己的接口」,
|
||||
> 再在该引擎的「联想接口 / 联想解析类型」里填好地址即可(解析类型见下)。
|
||||
|
||||
内置的解析类型(`suggest_type`):
|
||||
|
||||
| 类型 | 说明 | 返回形态 |
|
||||
|---|---|---|
|
||||
| `bing_osjson` | 必应 | `https://api.bing.com/osjson.aspx?query={q}` |
|
||||
| `baidu_sugrec` | 百度 | `https://www.baidu.com/sugrec?prod=pc&wd={q}` |
|
||||
| `google_firefox` | 谷歌 | `https://suggestqueries.google.com/complete/search?client=firefox&q={q}` |
|
||||
| `sogou_ajaj` | 搜狗 | `https://www.sogou.com/suggnew/ajajjson?type=web&key={q}` |
|
||||
| `so360` | 360 | `https://sug.so.360.cn/suggest?encodein=utf-8&encodeout=utf-8&format=json&word={q}` |
|
||||
| `ddg` | DuckDuckGo | `https://duckduckgo.com/ac/?type=list&q={q}` |
|
||||
|
||||
> 注:国内服务器访问 Google / DuckDuckGo 可能不通,联想会优雅降级为空(不影响搜索跳转)。
|
||||
| `baidu_sugrec` | 百度 | `{"g":[{"q":"…"}]}` |
|
||||
| `so360` | 360 | `{"result":[{"word":"…"}]}` |
|
||||
| `bing_osjson` | 必应 | `["q",["s1","s2"]]` |
|
||||
| `google_firefox` | 谷歌 | `["q",["s1","s2"]]` |
|
||||
| `sogou_ajaj` | 搜狗 | `{"items":[…]}`(GBK,已自动转码) |
|
||||
| `ddg` | DuckDuckGo | `[{"phrase":"…"}]` |
|
||||
|
||||
## 许可
|
||||
|
||||
|
||||
Reference in New Issue
Block a user