Новый пример Bing API PHP не работает

Собственный пример Microsoft PHP для нового Bing API не работает. Я пробовал разными способами, это просто показывает:

Ошибка сервера
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, ни один из них не был таким сложным, как этот.


person mahen3d    schedule 12.07.2012    source источник
comment
Не спешите обвинять MS. Есть много людей, использующих API, и если бы он был неисправен, я уверен, что кто-то уже заметил бы это.   -  person JJJ    schedule 12.07.2012
comment
Вы используете локальный прокси-сервер, который требует аутентификации? Ваш API-ключ BING абсолютно ничего не будет значить для локального прокси-сервера.   -  person Marc B    schedule 12.07.2012
comment
я не знаю, сколько людей имеет эту проблему, однако пример кодирования, приведенный в google, yahoo api, намного чище и работает отлично.. может быть, они намеренно не хотят, чтобы разработчики php использовали его.. во всяком случае..   -  person mahen3d    schedule 12.07.2012
comment
Итак, если это локальный прокси-сервер, что мне сделать, чтобы он заработал? документация вообще не отвечает ни на один из вопросов..   -  person mahen3d    schedule 12.07.2012
comment
я не думаю, что использую прокси, я тестировал как на VPS, так и на другом совершенно другом сетевом выделенном сервере, оба выдают ту же ошибку, также помните, что эта кодировка является официальным примером от bing, я ничего там не меняю, кроме как подключение к прокси-серверу .. (оба не работают)   -  person mahen3d    schedule 12.07.2012


Ответы (4)


после нескольких дней спора с технической поддержкой Microsoft они признали, что это не сработало.

вот правильное кодирование, использующее CURL. Сделайте это в API BING, примените метод 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>
person mahen3d    schedule 18.07.2012

я должен был добавить

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

чтобы заставить его работать, по крайней мере, в моей локальной копии (WAMP).

Надеюсь, это поможет, я возился с этим весь день.

person Hernan    schedule 22.08.2012

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

Это часть проблемы

Это не даст URL-адрес, который ищет Bing

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 дня, пытаясь заставить это работать.

person greta    schedule 17.07.2012
comment
это не решение, на самом деле то, что я говорю, устанавливает URL-адрес как api.datamarket.azure.com/Bing/SearchWeb/ будет работать, и установка другого URL-адреса изображения ... и т. д. все правильно, но это все еще даже событие технической поддержки Microsoft не может понять, что отправка части заголовка не работает - person mahen3d; 18.07.2012
comment
Каков полный код для поиска изображений? /* У меня есть эта проблема прямо сейчас, и мне нужно это решение, большое время, и я не могу найти его в другом месте */ - person Mike Warren; 03.12.2014

Я только что опубликовал пример подключения к Bing/Azure API с помощью библиотеки Unirest здесь: https://stackoverflow.com/a/20096151/257815

person Websirnik    schedule 20.11.2013