首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用DuckDuckGo的搜索自动完成建议

如何使用DuckDuckGo的搜索自动完成建议
EN

Stack Overflow用户
提问于 2020-09-24 14:23:20
回答 2查看 3.1K关注 0票数 3

我正在把我的个人搜索建议从谷歌转移到duckduckgo,但我错过了一些简单的东西来让它发挥作用。我在用jQuery的自动完成框架

我的搜索表格

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
$( "#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的查询返回:

代码语言:javascript
运行
复制
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的查询返回:

代码语言:javascript
运行
复制
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之后,我得到的错误是:

代码语言:javascript
运行
复制
parsererror Error: jsonCallback was not called

编辑2

在深入研究这个问题之后,我不认为DDG的服务器允许它。据我所知,他们的服务器需要发送一个适当的响应,我不认为它会这样做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-24 22:31:36

请参阅:https://duckduckgo.com/api

要自己使用它,您可以使用下面列出的语言库之一,或者只需在api子域中的任何查询URL上添加'&format=json‘(或xml )。

代码语言:javascript
运行
复制
https://api.duckduckgo.com/?q=DuckDuckGo&format=json

以下是使用的要求:

  • 属性在每个地方,您使用我们的API对我们和任何潜在的来源。对于源,可以链接到源的相关详细信息页。对于我们来说,您可以用我们的徽标来表示DuckDuckGo的结果(并链接到特定的结果页面)。
  • 非商业用途,除非您得到我们的电子邮件批准(虽然我们通常对任何不粗略的事情都很好)。
  • 使用描述性t参数,即将&t=nameofapp追加到请求中。

我们的总体目标是让更多的人使用DuckDuckGo,所以请记住这一点。

代码语言:javascript
运行
复制
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/

代码语言:javascript
运行
复制
var script = $("<script />", {
    src: "https://ac.duckduckgo.com/ac/?q=" + req.term,
    type: "application/json"
  }
);

尽管这样做很有效,但它对我们没有多大帮助,因为我们无法获取其中包含的数据。

示例:https://jsfiddle.net/Twisty/rqdtv9sn/89/

浏览器显示响应,但随后得到一个分析错误。

票数 1
EN

Stack Overflow用户

发布于 2020-09-25 15:12:02

这是任何人谁想要设置DuckDuckGo的搜索自动完成建议在他们的服务器上使用jQueryUI的自动完成框架

默认情况下,您不允许使用JavaScript在域之间刮取/获取数据,所以我必须在服务器上创建一个代理文件来绕过这些限制。

在这种情况下,我的挂断是google的搜索自动完成建议服务器显式地允许这些CORS违规,如果您在请求中传递某些变量。

下面是让DuckDuckGo的搜索自动完成建议在我的网页上工作的代码:

index.php

代码语言:javascript
运行
复制
<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

代码语言:javascript
运行
复制
$( "#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

代码语言:javascript
运行
复制
<?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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64048533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档