如何解决如何使用DuckDuckGo的搜索自动完成建议
我正在将我的个人搜索建议从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的查询返回:
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","foobar ape","foobar2000 layout","foobar2000 decoder","foobar2000 tak","foobar2000 dsp"]]
两者之间的区别似乎是jsonCallback && jsonCallback([data])
包含在Google查询中,我不明白为什么它们与众不同或如何解决。
编辑1
在js中添加了一些错误处理后,我得到的错误是:
parsererror Error: jsonCallback was not called
编辑2
深入研究这一点之后,我认为DDG的服务器不允许这样做。据我了解,他们的服务器需要发送适当的响应,但我不认为这样做。
解决方法
请参阅:https://duckduckgo.com/api
要自己使用它,您可以使用下面列出的语言库之一,或者直接在api子域中的任何查询URL上添加“&format = json”(或xml(如果您愿意))
https://api.duckduckgo.com/?q=DuckDuckGo&format=json
以下是使用要求:
- 您在每个地方的归因都使用我们的API和我们的任何底层来源。对于源,您可以链接到源的相关详细信息页面。对于我们来说,您可以说带有徽标的DuckDuckGo结果(并链接到特定结果页面)。
- 除非您获得我们的电子邮件批准,否则不得用于商业用途(尽管我们通常会接受任何不粗略的内容)。
- 使用描述性的t参数,即将&t = nameofapp附加到您的请求中。
我们的总体目标是吸引更多的人使用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/
这里的问题是这些不是建议,而这些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"
}
);
尽管可以,但是对我们没有太大帮助,因为我们无法获取其中包含的数据。
示例: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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。