8

新しい Bing API 用の Microsoft 独自の 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 の両方を試しましたが、これほど難しいものはありませんでした。

4

4 に答える 4

9

Microsoftテクニカルサポートとの数日間の議論の後、彼らはそれが機能しなかったことを認めました

Linux クライアントから BING サービスに正しい認証情報を渡すことができない file_get_contents の代わりに CURL メソッドを適用します。

<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>
于 2012-07-18T02:52:09.327 に答える
3

追加しなければなりませんでした

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

少なくとも私のローカルコピー(WAMP)で機能させるために。

それが役立つことを願っています、私は一日中これをいじっています。

于 2012-08-22T14:37:16.160 に答える
2
$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日間費やしました。

于 2012-07-17T21:13:27.007 に答える
0

Unirest Libraryを使用して Bing/Azure API に接続する方法の例をここに投稿しました: https://stackoverflow.com/a/20096151/257815

于 2013-11-20T12:39:40.437 に答える