【问题标题】:New Bing API PHP example doesnt work新的 Bing API PHP 示例不起作用
【发布时间】:2012-07-12 11:48:32
【问题描述】:

Microsoft 自己的新 Bing API 的 PHP 示例不起作用。我尝试了很多方法,它只是显示:

服务器错误
401 - 未经授权:由于凭据无效,访问被拒绝。
您无权查看此目录或页面 使用您提供的凭据。

官方文档中给出的示例编码如下,它在

处分解
'proxy' => 'tcp://127.0.0.1:8888',  

我 100% 确定我的密钥是正确的,当我在浏览器 url 中输入它时它工作正常,即

https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27love+message%27

(您需要将API密钥作为您的密码和用户名可以是任何东西)

<html>
    <head>
        <link href="styles.css" rel="stylesheet" type="text/css" />
        <title>PHP Bing</title>
    </head>
    <body>
        <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
            Type in a search:

            <input type="text" id="searchText" name="searchText"
                value="<?php
                        if (isset($_POST['searchText']))

                                   {
                            echo($_POST['searchText']);
                        }
                        else
                        {
                            echo('sushi');
                        }
                       ?>"
            />

            <input type="submit" value="Search!" name="submit" id="searchButton" />
            <?php
                if (isset($_POST['submit']))
                {
                    // Replace this value with your account key
                    $accountKey = 'BKqC2hIKr8foem2E1qiRvB5ttBQJK8objH8kZE/WJVs=';

                    $ServiceRootURL = 'https://api.datamarket.azure.com/Bing/Search/';

                    $WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query=';

                    $context = stream_context_create(array(
                        'http' => array(
                            //'proxy' => 'tcp://127.0.0.1:8888',
                            'request_fulluri' => true,
                            'header' => "Authorization: Basic " . base64_encode($accountKey . ":" . $accountKey)
                        )
                    ));

                    $request = $WebSearchURL . urlencode( '\'' . $_POST["searchText"] . '\'');

                    echo($request);

                    $response = file_get_contents($request, 0, $context);

                    print_r($response);

                    $jsonobj = json_decode($response);

                    echo('<ul ID="resultList">');

                    foreach($jsonobj->d->results as $value)
                    {
                        echo('<li class="resultlistitem"><a href="' . $value->MediaURL . '">');

                        echo('<img src="' . $value->Thumbnail->MediaUrl. '"></li>');
                    }

                    echo("</ul>");
                }
            ?>
        </form>
    </body>
</html>

google API 和 Yahoo API 我都试过了,都没有这么难。

【问题讨论】:

  • 别这么快责怪 MS。 很多人使用 API,如果它本身就被破坏了,我相信现在有人会注意到的。
  • 您是否正在运行需要身份验证的本地代理?您的 BING api 密钥对本地代理毫无意义。
  • 我不知道有多少人有这个问题,但是,google 中给出的示例编码,yahoo api 更干净并且工作完美.. 可能他们故意不想让 php 开发人员使用它。 . 无论如何..
  • 所以如果这是一个本地代理服务器,那么我应该怎么做才能让它工作?文档根本没有回答任何问题..
  • 我不认为我在运行代理,我在 VPS 和另一个完全不同的网络专用服务器上都测试过,都给了我同样的错误,还记得这个编码是来自 bing 的官方示例,我是除了类似的代理服务器连接之外没有改变任何东西..(两者都不起作用)

标签: php rest bing


【解决方案1】:

在与 microsoft techinchal 支持争论了几天后,他们承认它没有用

这是在 BING API 中使用 CURL 执行此操作的正确编码,应用 CURL 方法而不是 file_get_contents,后者无法将正确的身份验证信息从 Linux 客户端传递到 BING 服务。

<html>
    <head>
        <title>PHP Bing</title>
    </head>
    <body>
        <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
            Type in a search:

            <input type="text" id="searchText" name="searchText"
                value="<?php
                        if (isset($_POST['searchText']))

                                   {
                            echo($_POST['searchText']);
                        }
                        else
                        {
                            echo('sushi');
                        }
                       ?>"
            />

            <input type="submit" value="Search!" name="submit" id="searchButton" />
            <?php


                if (isset($_POST['submit']))
                {

            $credentials = "username:xxx";

                $url= "https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27{keyword}%27";        
                $url=str_replace('{keyword}', urlencode($_POST["searchText"]), $url);
                $ch = curl_init();

            $headers = array(
                    "Authorization: Basic " . base64_encode($credentials)
                );

                $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
                curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,5);
                curl_setopt($ch, CURLOPT_FAILONERROR, true);
                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                curl_setopt($ch, CURLOPT_AUTOREFERER, true);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

                $rs = curl_exec($ch);
            echo($rs);
                curl_close($ch);
                return $rs;

        }

            ?>
        </form>
    </body>
</html>

【讨论】:

    【解决方案2】:

    我必须添加

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    

    为了使它工作,至少在我的本地副本 (WAMP) 中。

    希望它有所帮助,我整天都在搞这个。

    【讨论】:

      【解决方案3】:
      $WebSearchURL = $ServiceRootURL . 'Image?$format=json&Query=';  
      

      这是问题的一部分

      这不会给出 bing 正在寻找的 url

      e.g. https://api.datamarket.azure.com/Bing/SearchWeb/Web?Query=%27love+message%27 
      

      应该是

      https://api.datamarket.azure.com/Bing/Search/Image?$format=json&Query=%27love+message%27 
      

      而您想要一个网络而不是图像搜索,并且格式和其他参数应该在查询之后

      “图像”应该是“网络”

      我花了 3 天的时间试图让它工作。

      【讨论】:

      • 这不是解决方案,实际上我所说的是将 url 设置为 api.datamarket.azure.com/Bing/SearchWeb/… 将起作用并设置其他图像 url ......等等都正确,但这仍然连微软技术支持活动都无法弄清楚发送标头部分不起作用
      • 图片搜索的完整代码是什么? /* 我现在遇到这个问题,我需要这个解决方案,很长时间,在其他地方找不到它 */
      【解决方案4】:

      我刚刚发布了一个如何使用Unirest Library 连接到 Bing/Azure API 的示例:https://stackoverflow.com/a/20096151/257815

      【讨论】:

        猜你喜欢
        • 2012-12-28
        • 2012-11-09
        • 2017-04-21
        • 2011-07-27
        • 2016-08-03
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多