如何使用 DuckDuckGo 的搜索自动完成建议
How to use DuckDuckGo's search autocomplete suggestions
我正在将我的个人搜索建议从 google 转移到 duckduckgo,但我缺少一些简单的方法来让它发挥作用。我正在使用 jQuery-UI's autocomplete framework.
我的搜索表单
<form action="https://duckduckgo.com/?q=" method="post" id="search">
<input type="text" name="query" value="" autocomplete="off">
<button type="submit">Search</button>
</form>
我的jQuery
$( "#search input[type=text]" ).autocomplete(
{
delay: 0,
minLength: 1,
position: { my: "left top-3" },
source: function( request, response )
{
// var suggestURL = "https://www.google.com/complete/search?client=firefox&q=%QUERY";
var suggestURL = "https://duckduckgo.com/ac/?q=%QUERY&type=list";
suggestURL = suggestURL.replace( "%QUERY", request.term );
$.ajax({
method: "GET",
dataType: "jsonp",
jsonpCallback: "jsonCallback",
url: suggestURL,
success: function( data )
{
response( data[1] );
},
error: function( jqXHR, textStatus, errorThrown )
{
console.log( textStatus, errorThrown );
}
}
});
查询 google returns:
https://suggestqueries.google.com/complete/search?client=firefox&q=foobar&callback=jsonCallback&_=1600956954436
jsonCallback && jsonCallback(["foobar",["foobar","foobar meaning","foobar google","foobar challenge","foobar2000 skins","foobar2k","foobar2000 themes","foobar2000 download","foobar2000 mac","foobar themes"],[],{"google:suggestsubtypes":[[433],[],[],[],[],[],[],[],[],[]]}])
duckduckgo 的查询returns:
https://ac.duckduckgo.com/ac/?q=foobar&type=list&callback=jsonCallback&_=1600956892202
["foobar",["foobar2000","foobar","foobar2000 download","foobar ape","foobar2000 layout","foobar2000 decoder","foobar2000 tak","foobar2000 dsp"]]
两者之间的区别似乎是 jsonCallback && jsonCallback([data])
包含在 google 查询中,我不明白为什么它们不同或如何修复它。
编辑 1
在 js 中添加了一些错误处理后,我得到的错误是:
parsererror Error: jsonCallback was not called
编辑 2
在深入研究之后,我认为 DDG 的服务器不允许这样做。据我了解,他们的服务器需要发送适当的响应,但我不认为它会这样做。
To consume it yourself, you can use one of the language libraries listed below or simply add '&format=json' (or xml if you prefer) onto any query URL in the api subdomain, e.g.
https://api.duckduckgo.com/?q=DuckDuckGo&format=json
Here are the requirements for use:
- 在您使用我们的每个地方的署名 API 我们和任何潜在来源。对于来源,可以link到来源的相关详情页面。对于我们,您可以说带有我们徽标的 DuckDuckGo 的结果(以及 link 到特定结果页面)。
- Non-commercial 除非您获得我们的电子邮件批准,否则请使用(尽管我们通常可以接受任何不粗略的内容)。
- 使用描述性 t 参数,即在您的请求中附加 &t=nameofapp。
Our overall goal is to get more people using DuckDuckGo, so please keep that in mind as well.
q: query
format: output format (json or xml)
If format=='json', you can also pass:
callback: function to callback (JSONP format)
这适用于 JSONP:https://jsfiddle.net/Twisty/rqdtv9sn/86/
这里的问题是这些不是建议,URL 对于那些,https://ac.duckduckgo.com/ac/ 不想与 CORS 一起玩。您可以使用 FETCH API 绕过它,但即使请求失败或无法解析,这也会继续执行 Promise。
因此,在 DDG 提出建议 API 之前,您多半是运气不佳。
此处讨论了一些可能的其他选项:https://www.sitepoint.com/jsonp-examples/
var script = $("<script />", {
src: "https://ac.duckduckgo.com/ac/?q=" + req.term,
type: "application/json"
}
);
Although that works, it doesn’t help us much, as we have no way of getting at the data it contains.
示例:https://jsfiddle.net/Twisty/rqdtv9sn/89/
浏览器显示响应,但随后出现解析错误。
这适用于想要在其服务器上使用 jQueryUI's autocomplete framework.
设置 DuckDuckGo 的搜索自动完成建议的任何人
默认情况下you're not allowed to scrape/get data across domains with JavaScript,所以我不得不在我的服务器上创建一个代理文件来绕过这些限制。
我在这种情况下的挂断是,如果您在请求中传递某些变量,google 的搜索自动完成建议服务器明确允许这些 CORS 违规行为。
这是我的代码,用于在我的网页上运行 DuckDuckGo 的搜索自动完成建议:
index.php
<form action="https://duckduckgo.com/?q=" method="post" id="search">
<input type="text" name="query" value="" autocomplete="off">
<button type="submit">Search</button>
</form>
javascript.js
$( "#search input[type=text]" ).autocomplete(
{
delay: 0,
minLength: 1,
position: { my: "left top-3" },
source: function( request, response )
{
var suggestURL = "https://www.example.com/proxy-duckduckgo.php?q=%QUERY";
suggestURL = suggestURL.replace( "%QUERY", request.term );
suggestURL = suggestURL.replace( / /g, "+" )
$.ajax({
method: "GET",
dataType: "json",
url: suggestURL,
success: function( data )
{
response( data[1] );
},
error: function( jqXHR, textStatus, errorThrown )
{
console.log( textStatus, errorThrown );
}
});
}
});
proxy-duckduckgo.php
<?php
$query = isset( $_GET['q'] ) ? str_replace( ' ', '+', $_GET['q'] ) : 'example';
$url = 'https://duckduckgo.com/ac/?q='.$query.'&type=list';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
$html = curl_exec( $ch );
curl_close( $ch );
echo $html;
我正在将我的个人搜索建议从 google 转移到 duckduckgo,但我缺少一些简单的方法来让它发挥作用。我正在使用 jQuery-UI's autocomplete framework.
我的搜索表单
<form action="https://duckduckgo.com/?q=" method="post" id="search">
<input type="text" name="query" value="" autocomplete="off">
<button type="submit">Search</button>
</form>
我的jQuery
$( "#search input[type=text]" ).autocomplete(
{
delay: 0,
minLength: 1,
position: { my: "left top-3" },
source: function( request, response )
{
// var suggestURL = "https://www.google.com/complete/search?client=firefox&q=%QUERY";
var suggestURL = "https://duckduckgo.com/ac/?q=%QUERY&type=list";
suggestURL = suggestURL.replace( "%QUERY", request.term );
$.ajax({
method: "GET",
dataType: "jsonp",
jsonpCallback: "jsonCallback",
url: suggestURL,
success: function( data )
{
response( data[1] );
},
error: function( jqXHR, textStatus, errorThrown )
{
console.log( textStatus, errorThrown );
}
}
});
查询 google returns:
https://suggestqueries.google.com/complete/search?client=firefox&q=foobar&callback=jsonCallback&_=1600956954436
jsonCallback && jsonCallback(["foobar",["foobar","foobar meaning","foobar google","foobar challenge","foobar2000 skins","foobar2k","foobar2000 themes","foobar2000 download","foobar2000 mac","foobar themes"],[],{"google:suggestsubtypes":[[433],[],[],[],[],[],[],[],[],[]]}])
duckduckgo 的查询returns:
https://ac.duckduckgo.com/ac/?q=foobar&type=list&callback=jsonCallback&_=1600956892202
["foobar",["foobar2000","foobar","foobar2000 download","foobar ape","foobar2000 layout","foobar2000 decoder","foobar2000 tak","foobar2000 dsp"]]
两者之间的区别似乎是 jsonCallback && jsonCallback([data])
包含在 google 查询中,我不明白为什么它们不同或如何修复它。
编辑 1
在 js 中添加了一些错误处理后,我得到的错误是:
parsererror Error: jsonCallback was not called
编辑 2
在深入研究之后,我认为 DDG 的服务器不允许这样做。据我了解,他们的服务器需要发送适当的响应,但我不认为它会这样做。
To consume it yourself, you can use one of the language libraries listed below or simply add '&format=json' (or xml if you prefer) onto any query URL in the api subdomain, e.g.
https://api.duckduckgo.com/?q=DuckDuckGo&format=json
Here are the requirements for use:
- 在您使用我们的每个地方的署名 API 我们和任何潜在来源。对于来源,可以link到来源的相关详情页面。对于我们,您可以说带有我们徽标的 DuckDuckGo 的结果(以及 link 到特定结果页面)。
- Non-commercial 除非您获得我们的电子邮件批准,否则请使用(尽管我们通常可以接受任何不粗略的内容)。
- 使用描述性 t 参数,即在您的请求中附加 &t=nameofapp。
Our overall goal is to get more people using DuckDuckGo, so please keep that in mind as well.
q: query
format: output format (json or xml)
If format=='json', you can also pass:
callback: function to callback (JSONP format)
这适用于 JSONP:https://jsfiddle.net/Twisty/rqdtv9sn/86/
这里的问题是这些不是建议,URL 对于那些,https://ac.duckduckgo.com/ac/ 不想与 CORS 一起玩。您可以使用 FETCH API 绕过它,但即使请求失败或无法解析,这也会继续执行 Promise。
因此,在 DDG 提出建议 API 之前,您多半是运气不佳。
此处讨论了一些可能的其他选项:https://www.sitepoint.com/jsonp-examples/
var script = $("<script />", {
src: "https://ac.duckduckgo.com/ac/?q=" + req.term,
type: "application/json"
}
);
Although that works, it doesn’t help us much, as we have no way of getting at the data it contains.
示例:https://jsfiddle.net/Twisty/rqdtv9sn/89/
浏览器显示响应,但随后出现解析错误。
这适用于想要在其服务器上使用 jQueryUI's autocomplete framework.
设置 DuckDuckGo 的搜索自动完成建议的任何人默认情况下you're not allowed to scrape/get data across domains with JavaScript,所以我不得不在我的服务器上创建一个代理文件来绕过这些限制。
我在这种情况下的挂断是,如果您在请求中传递某些变量,google 的搜索自动完成建议服务器明确允许这些 CORS 违规行为。
这是我的代码,用于在我的网页上运行 DuckDuckGo 的搜索自动完成建议:
index.php
<form action="https://duckduckgo.com/?q=" method="post" id="search">
<input type="text" name="query" value="" autocomplete="off">
<button type="submit">Search</button>
</form>
javascript.js
$( "#search input[type=text]" ).autocomplete(
{
delay: 0,
minLength: 1,
position: { my: "left top-3" },
source: function( request, response )
{
var suggestURL = "https://www.example.com/proxy-duckduckgo.php?q=%QUERY";
suggestURL = suggestURL.replace( "%QUERY", request.term );
suggestURL = suggestURL.replace( / /g, "+" )
$.ajax({
method: "GET",
dataType: "json",
url: suggestURL,
success: function( data )
{
response( data[1] );
},
error: function( jqXHR, textStatus, errorThrown )
{
console.log( textStatus, errorThrown );
}
});
}
});
proxy-duckduckgo.php
<?php
$query = isset( $_GET['q'] ) ? str_replace( ' ', '+', $_GET['q'] ) : 'example';
$url = 'https://duckduckgo.com/ac/?q='.$query.'&type=list';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
$html = curl_exec( $ch );
curl_close( $ch );
echo $html;