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

如何解决如何使用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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-