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:
@@ -81,6 +81,12 @@ SQL);
|
||||
$pdo->exec('ALTER TABLE sites ADD COLUMN icon_custom INTEGER NOT NULL DEFAULT 0');
|
||||
}
|
||||
|
||||
// 老库升级:清掉「搜狗联想」这个已经彻底失效的默认值
|
||||
// (2026-09-28 实测:suggnew/ajajjson 返回 200 但 0 字节,联想域名 w.sugg.sogou.com 已不解析)
|
||||
// 只匹配默认种子里的那个 URL —— 用户自己改过的地址绝不动。
|
||||
$pdo->prepare('UPDATE engines SET suggest_url=?, suggest_type=? WHERE slug=? AND suggest_url=?')
|
||||
->execute(['', '', 'sogou', 'https://www.sogou.com/suggnew/ajajjson?type=web&key={q}']);
|
||||
|
||||
// 是否为空库(用于判断是否写入默认数据)
|
||||
$isEmpty = (int)$pdo->query('SELECT COUNT(*) FROM groups')->fetchColumn() === 0;
|
||||
|
||||
@@ -112,13 +118,16 @@ function seed_engines(PDO $pdo): void
|
||||
return;
|
||||
}
|
||||
// name, slug, search_url, param, suggest_url, suggest_type, color, active, sort
|
||||
// ⚠️ suggest_url 留空的含义:该引擎自己没有可用的联想接口。
|
||||
// 反正默认「联想词来源 = 百度」,留空只会让 auto 模式下少一次无谓的超时等待。
|
||||
// 搜狗(suggnew/ajajjson 已失效)、谷歌 / DuckDuckGo(国内不可达)都不填。
|
||||
$rows = [
|
||||
['必应', 'bing', 'https://cn.bing.com/search', 'q', 'https://api.bing.com/osjson.aspx?query={q}', 'bing_osjson', '#60A504', 1, 1],
|
||||
['百度', 'baidu', 'https://www.baidu.com/s', 'wd', 'https://www.baidu.com/sugrec?prod=pc&wd={q}', 'baidu_sugrec', '#2100E0', 1, 2],
|
||||
['谷歌', 'google', 'https://www.google.com/search', 'q', 'https://suggestqueries.google.com/complete/search?client=firefox&q={q}', 'google_firefox','#3B83FA', 0, 3],
|
||||
['搜狗', 'sogou', 'https://www.sogou.com/web', 'query', 'https://www.sogou.com/suggnew/ajajjson?type=web&key={q}', 'sogou_ajaj', '#FE6B14', 0, 4],
|
||||
['谷歌', 'google', 'https://www.google.com/search', 'q', '', '', '#3B83FA', 0, 3],
|
||||
['搜狗', 'sogou', 'https://www.sogou.com/web', 'query', '', '', '#FE6B14', 0, 4],
|
||||
['360', 'so360', 'https://www.so.com/s', 'q', 'https://sug.so.360.cn/suggest?encodein=utf-8&encodeout=utf-8&format=json&word={q}', 'so360', '#1BB04A', 0, 5],
|
||||
['DuckGo','ddg', 'https://duckduckgo.com/', 'q', 'https://duckduckgo.com/ac/?type=list&q={q}', 'ddg', '#DE5833', 0, 6],
|
||||
['DuckGo','ddg', 'https://duckduckgo.com/', 'q', '', '', '#DE5833', 0, 6],
|
||||
];
|
||||
$stmt = $pdo->prepare('INSERT INTO engines (name,slug,search_url,param,suggest_url,suggest_type,color,is_active,sort_order) VALUES (?,?,?,?,?,?,?,?,?)');
|
||||
foreach ($rows as $r) {
|
||||
|
||||
Reference in New Issue
Block a user