簡體   English   中英

如何使用 DuckDuckGo 的搜索自動完成建議

[英]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

以下是使用要求:

  • 在您使用我們的 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 提供 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM