2011年4月26日

Yahoo!知恵袋

Yahoo!知恵袋WebAPIを使用したQ&Aサイトの作成パート1

  • このエントリーをはてなブックマークに追加

こんにちは、R&D統括本部の望月です。
Yahoo!知恵袋に質問や回答を投稿できるAPIを公開しました」で紹介させていただきましたが、2011年2月24日よりAPIを使用してYahoo!知恵袋に質問や回答が投稿できるようになりました。

今回はYahoo!知恵袋のAPIをもっと気軽に利用していただけるように、APIを使用したサンプルコードを用い、パート1とパート2の2回に分けて質問の表示から回答の投稿までを行える簡単なQ&Aサイトを作成していきます。

パート1ではYahoo!知恵袋の新着質問リストの表示から、質問詳細情報の表示まで対象に説明します。
このたびの東日本大震災以降、Yahoo!知恵袋でも地震に関する質問が増えておりますので、
ここでは例として地震に関するQ&Aサイトを作成します。

作成するページ

作成するページは下記の2ページです。
1. Yahoo!知恵袋の地震カテゴリの新着質問リストを表示
2. 質問の詳細情報を表示

使用するAPI

使用するAPIは下記の2つです。
1. 知恵袋 - 新着質問リスト取得
2. 知恵袋 - 質問詳細

サンプル

今回はPHPを使用して作成しています。
下記の環境で動作確認しています。

構成環境:Apache-2.2.14 + PHP-5.3.1

1. 地震カテゴリの新着質問リストを取得、表示

下記のソースコードをindex.phpという名前で設置してください。

<?php

// UTF-8設定
mb_internal_encoding("UTF-8");

// 地震カテゴリのカテゴリID
$category_id = 2079877591;

// 地震カテゴリの新着質問を取得
$response = getChieListApi($category_id);

if (false !== $response) {
    if (isset($response->Result[0])) {
        $list = $response->Result;
    } else {
        $list = array($response->Result);
    }
}

/**
 * 指定カテゴリ内の新着質問リストを取得
 */
function getChieListApi($category_id)
{
    $url = 'http://chiebukuro.yahooapis.jp/Chiebukuro/V1/getNewQuestionList';

// APIへのリクエストパラメータ
    $parameters = array(
        'appid'      => '<あなたのアプリケーションID>',
        'condition'  => 'open',
        'category_id'=> $category_id,
        'results'    => 20,
    );
    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL             => $url .'?'. http_build_query($parameters, '', '&'),
        CURLOPT_RETURNTRANSFER  => true
    ));
    $xml = curl_exec($ch);
    curl_close($ch);

    if ($xml === false || $xml == '') {
        return false;
    }
    return simplexml_load_string($xml);
}


?>
<html>
<meta http-equiv=content-type content="text/html; charset=utf-8" />
<head>
<title>地震に関する質問</title>
<style type="text/css"> 
<!--
ol {
    width:800px;
}
li {
    margin:3px;
    padding:5px;
}
-->
</style></head>
<body>
<h1>地震に関する質問</h1>

<?php if (isset($response)) : ?>
<div id="content_result">
<?php   if (isset($response->Message)) : ?>
    <dl>
        <dt>エラー</dt>
        <dd><?php echo nl2br($response->Message); ?></dd>
    </dl>
<?php   elseif (isset($list)) : ?>
    <ol>
<?php       foreach ($list as $item) : ?>
        <li>
            <a href="./detail.php?question_id=<?php echo $item->QuestionId; ?>"><?php echo mb_strimwidth($item->Content, 0, 80, '...'); ?></a><br /><small>
            質問日時:<?php echo date("Y/m/d H:i:s", strtotime($item->UpdatedDate)); ?>&nbsp;
            回答数:<?php echo $item->AnsCount; ?></small>
        </li>
<?php       endforeach; ?>
    </ol>
<?php   endif; ?>
</div>
<?php else: ?>
このページは表示できません。<br />
<?php endif; ?>

<div>
<a href="http://list.chiebukuro.yahoo.co.jp/dir/list/d<?php echo $category_id; ?>/solved">[Yahoo! 知恵袋]&nbsp;地震に関する解決済みの質問を探す</a>
</div>
<hr>

<!-- Begin Yahoo! JAPAN Web Services Attribution Snippet -->
<a href="http://developer.yahoo.co.jp/about">
<img src="https://s.yimg.jp/images/yjdn/yjdn_attbtn2_105_17.gif" width="105" height="17" title="Webサービス by Yahoo! JAPAN" alt="Webサービス by Yahoo! JAPAN" border="0" style="margin:15px 15px 15px 15px"></a>
<!-- End Yahoo! JAPAN Web Services Attribution Snippet -->
</body>
</html>

新着質問リスト取得WebAPIを使用して、地震カテゴリの新着質問リストを取得、表示しています。
リクエストパラメータを変更すれば、解決済みの質問を取得したり、2ページ目を表示したりすることも可能となっています。

今回は地震カテゴリに限定して新着質問リストを取得していますが、質問検索APIなどを利用すると、指定したキーワードの検索結果をリストとして表示することもできます。
また、検索窓を設置すればサイトに訪れた人が入力したキーワードの検索結果を表示することも可能ですのでぜひお試しください。

2. 質問の詳細情報を取得、表示

下記のソースコードをdetail.phpという名前で1.で作成したindex.phpと同じディレクトリに設置してください。

<?php

// 質問ID
if (array_key_exists('question_id', $_REQUEST)) {
    $question_id = $_REQUEST['question_id'];
    $question_id = preg_replace('/[^0-9]/', '', $question_id);
    $response = getChieDetailApi($question_id);
}

/**
 * 指定された質問IDの質問詳細情報を取得
 */
function getChieDetailApi($question_id)
{
    $url = 'http://chiebukuro.yahooapis.jp/Chiebukuro/V1/detailSearch';

    // APIへのリクエストパラメータ
    $parameters = array(
        'appid'         => '<あなたのアプリケーションID>',
        'question_id'   => $question_id,
        'image_type'    => 2,
    );
    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL             => $url .'?'. http_build_query($parameters, '', '&'),
        CURLOPT_RETURNTRANSFER  => true
    ));
    $xml = curl_exec($ch);
    curl_close($ch);

    if ($xml === false || $xml == '') {
        return false;
    }
    return simplexml_load_string($xml);
}

?>
<html>
<meta http-equiv=content-type content="text/html; charset=utf-8" />
<head>
<title>地震に関する質問</title>
<style type="text/css"> 
<!--
dt,dd {
    padding:5px;
}
.question_text {
    width:800px;
    word-break: break-all;
}
-->
</style>
</head>
<body>
<a href="./index.php">&lt;&nbsp;地震に関する質問一覧</a>

<?php if (isset($response)) : ?>
<div id="content_result">
<?php   if (isset($response->Message)) : ?>
    <dl>
        <dt>エラー</dt>
        <dd><?php echo nl2br($response->Message); ?></dd>
    </dl>
<?php   else : ?>
    <dl>
        <dt>質問文</dt>
        <dd>
            <div class="question_text">
                <?php echo nl2br($response->Result->Content) . "\n"; ?>
            </div>
<?php       if (isset($response->Result->Image->Url)) : ?>
            <br />
            <img src="<?php echo $response->Result->Image->Url; ?>">
<?php       endif; ?>
        </dd>
<?php       if (isset($response->Result->SupplementContent)) : ?>
        <dt>質問補足文</dt>
        <dd>
            <div class="question_text">
                <?php echo nl2br($response->Result->SupplementContent) . "\n"; ?>
            </div>
        </dd>
<?php       endif; ?>
        <dt>質問日時</dt>
        <dd><?php echo date("Y/m/d H:i:s", strtotime($response->Result->QuestionPostDate)); ?></dd>
        <dt>回答数</dt>
        <dd><?php echo $response->Result->AnswerCount; ?></dd>
        <dt>カテゴリ</dt>
        <dd><?php echo str_replace('|', ' &gt; ', $response->Result->CategoryPath); ?></dd>
    </dl>
    <a href="<?php echo $response->Result->PcQuestionUrl; ?>">知恵袋の質問詳細ページ</a>
<?php   endif; ?>
</div>
<?php else: ?>
このページは表示できません。<br />
<?php endif; ?>
<hr>
<!-- Begin Yahoo! JAPAN Web Services Attribution Snippet -->
<a href="http://developer.yahoo.co.jp/about">
<img src="https://s.yimg.jp/images/yjdn/yjdn_attbtn2_105_17.gif" width="105" height="17" title="Webサービス by Yahoo! JAPAN" alt="Webサービス by Yahoo! JAPAN" border="0" style="margin:15px 15px 15px 15px"></a>
<!-- End Yahoo! JAPAN Web Services Attribution Snippet -->
</body>
</html>

質問詳細WebAPIを使用して、リクエストとして渡された質問IDの質問詳細情報を取得、表示しています。
サンプルに含まれる情報以外にも表示できる情報がありますので、レスポンスフィールドを参考に表示してみてください。
以上で新着質問リストを表示するページと、質問の詳細情報を表示するページが作成できました。

次回予告

次回は取得した質問に回答を投稿できるように機能を追加します。

Yahoo! JAPANでは情報技術を駆使して人々や社会の課題を一緒に解決していける方を募集しています。詳しくは採用情報をご覧ください。

  • このエントリーをはてなブックマークに追加