我正在把我的个人搜索建议从谷歌转移到duckduckgo,但我错过了一些简单的东西来让它发挥作用。我在用jQuery的自动完成框架。
我的搜索表格
<form action="https://duckduckgo.com/?q=" method="post" id="search">
<input type="text" name="query" value="" autocomplete="off">
<button type="submit">Search</button>
</form>
My 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的查询返回:
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的查询返回:
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])
,我不明白它们为什么不同,也不明白如何修复它们。
编辑1
在将一些错误处理添加到js之后,我得到的错误是:
parsererror Error: jsonCallback was not called
编辑2
在深入研究这个问题之后,我不认为DDG的服务器允许它。据我所知,他们的服务器需要发送一个适当的响应,我不认为它会这样做。
发布于 2020-09-24 22:31:36
请参阅:https://duckduckgo.com/api
要自己使用它,您可以使用下面列出的语言库之一,或者只需在api子域中的任何查询URL上添加'&format=json‘(或xml )。
https://api.duckduckgo.com/?q=DuckDuckGo&format=json
以下是使用的要求:
我们的总体目标是让更多的人使用DuckDuckGo,所以请记住这一点。
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/。
这里的问题是,这些都不是建议和网址,为这些,https://ac.duckduckgo.com/ac/不想玩好与CORS。您可以使用FETCH API绕过它,但是,即使请求失败或不能被解析,这也只是履行承诺。
因此,在DDG提供建议API之前,您基本上是运气不好。
这里讨论了一些潜在的其他选项:https://www.sitepoint.com/jsonp-examples/
var script = $("<script />", {
src: "https://ac.duckduckgo.com/ac/?q=" + req.term,
type: "application/json"
}
);
尽管这样做很有效,但它对我们没有多大帮助,因为我们无法获取其中包含的数据。
示例:https://jsfiddle.net/Twisty/rqdtv9sn/89/
浏览器显示响应,但随后得到一个分析错误。
发布于 2020-09-25 15:12:02
这是任何人谁想要设置DuckDuckGo的搜索自动完成建议在他们的服务器上使用jQueryUI的自动完成框架。
默认情况下,您不允许使用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;
https://stackoverflow.com/questions/64048533
复制相似问题