[英]How to use DuckDuckGo's search autocomplete suggestions
我正在將我的個人搜索建議從 google 轉換為duckduckgo,但我缺少一些簡單的方法來使其工作。 我正在使用jQuery-UI 的自動完成框架。
我的搜索表單
<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","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 的服務器不允許這樣做。 我的理解是他們的服務器需要發送適當的響應,我認為它沒有這樣做。
請參閱: https : //duckduckgo.com/api
要自己使用它,您可以使用下面列出的語言庫之一,或者只需將 '&format=json'(或 xml,如果您願意)添加到 api 子域中的任何查詢 URL,例如
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/
這里的問題是,這些不是建議,而且這些 URL, https: //ac.duckduckgo.com/ac/ 不想與 CORS 配合得很好。 您可以使用 FETCH API 繞過它,但即使請求失敗或無法解析,這也只會繼續 Promise。
因此,在 DDG 提供 Suggestion 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 的自動完成框架在其服務器上設置 DuckDuckGo 的搜索自動完成建議的任何人。
默認情況下,不允許使用 JavaScript 跨域抓取/獲取數據,因此我必須在我的服務器上創建一個代理文件來繞過這些限制。
我在這種情況下的掛斷是,如果您在請求中傳遞某些變量,則 google 的搜索自動完成建議服務器明確允許這些 CORS 違規。
這是我的代碼,用於在我的網頁上獲取 DuckDuckGo 的搜索自動完成建議:
索引.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 );
}
});
}
});
代理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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.