PHPで雑談対話

(1/1)
今回は、PHP で「docomo Developer support」を利用し、自然文で雑談を交わすプログラムをつくる。
なお、今回のプログラムで利用している API が 2018 年(平成 30 年)6 月末に廃止予定とのアナウンスがあった。後継API を使ったプログラムは「PHP で自然対話(知識検索・雑談対話)」を参照のこと。

サンプル・プログラム:実行例

PHPで雑談対話
最下段のテキストボックスにメッセージをし、送信ボタンを押すると docomo Developer support から応答が返ってくる。過去の雑談の流れを一覧表示できるようにしてある。

サンプル・プログラム

docomo API クラス

docomo Developer support を利用する関数群はクラス pahooDoCoMoAPI として別ファイル "pahooDoCoMoAPI.php" に定義してある。このファイルを  require_once  できるパスに配置すること。

https通信を使うため、PHP から OpenSSL を利用できるようにしておく必要がある。その手順は「PHP の https 対応」を参照のこと。

0022:     //認証用パラメータ:申請はhttps://dev.smt.docomo.ne.jp/?p=login
0023:     var $DOCOMO_API_KEY        = '***************';
0024:     var $DOCOMO_CLIENT_SECRET  = '***************';
0025:     var $DOCOMO_CLIENT_CLIENT  = '***************';

docomo Developer support を利用するには、事前にアカウント登録(無料)とアプリケーションを登録し、API キーなどを取得しておく必要がある。新規登録画面から登録しよう。

docomo Developer support:雑談対話

ユーザの自然な発話に対して幅広い会話や「しりとり」を提供する docomo Developer support である。
雑談対話 (POST)
URL
https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue

入力パラメータ
項目名 フィールド名 内  容
APIキー APIKEY string 【必須】APIにアクセスするアプリの認証に利用する。
以下,JSON形式にすること
発話 utt string 【必須】ユーザの発話を指定(255文字以下)
コンテキストID context string 【省略可能】会話(しりとり)を継続する場合は、レスポンスボディのcontextの値を指定する
ニックネーム nickname string 【省略可能】ユーザのニックネームを指定(全角10文字(半角10文字)以下
ニックネームの読み nickname_y string 【省略可能】全角20文字以下(カタカナのみ)
性別 sex string 【省略可能】男、女
血液型 bloodtype string 【省略可能】A、B、AB、O
誕生日年 birthdateY string 【省略可能】ユーザの誕生日(年)を指定(1~現在までのいずれかの整数(半角4文字以下))
誕生日月 birthdateM string 【省略可能】ユーザの誕生日(月)を指定(1~12までのいずれかの整数)
誕生日 birthdateD string 【省略可能】ユーザの誕生日(日)を指定(1~31までのいずれかの整数)
年齢 age string 【省略可能】ユーザの年齢を指定(正の整数(半角3文字以下))
星座 constellations string 【省略可能】牡羊座、牡牛座、双子座、蟹座、獅子座、乙女座、天秤座、蠍座、射手座、山羊座、水瓶座、魚座
地域情報 place string 【省略可能】
対話モード mode string 【省略時】dialog,srtr
方言 t string 20 : 関西弁キャラ
30 : 赤ちゃんキャラ
【省略時】指定なし : デフォルトキャラ
応答データ(json) utt システムからの返答 yomi 音読を間違えそうな漢字をカタカナにして返却 mode 対話モード da 対話番号 context システム付与ID

解説:雑談対話

0144: /**
0145:  * 雑談対話
0146:  * @param string $query ユーザーの発話(UTF-8限定)
0147:  * @return bool TRUE:リクエスト成功/FALSE:失敗
0148: */
0149: function dialogue($query) {
0150:     $url    = 'https://api.apigw.smt.docomo.ne.jp/dialogue/v1/dialogue';
0151:     $method = 'POST';
0152:     $option = "{ \"utt\": \"{$query}\" }";
0153: 
0154:     return $this->docomoAPI($url$method$option);
0155: }

仕様通りに雑談対話を呼び出すメソッドである。

解説:雑談対話を利用

0151: /**
0152:  * docomoAPI の雑談対話を利用する
0153:  * @param string $query  メッセージ
0154:  * @param string $answer 応答を格納する変数
0155:  * @param   string $api    利用したWebAPIのURLを格納する変数
0156:  * @return string エラーメッセージ/''
0157: */
0158: function send_dialogue($query, &$answer, &$api) {
0159:     $pda = new pahooDoCoMoAPI(); //docomoAPIクラス
0160: 
0161:     if ($query == '')              return 'メッセージがありません';
0162:     if (mb_strlen($query > 255))    return 'メッセージが長すぎます';
0163: 
0164:     //docomoAPI 雑談対話
0165:     $results = $pda->dialogue($query);
0166: 
0167:     if ($results == FALSE) {
0168:         $answer = $api = '';
0169:         return $query . ' の応答を取得できません';
0170:     } else {
0171:         $answer = $pda->responses->utt;
0172:         $api = $pda->webapi;
0173:     }
0174: 
0175:     return '';
0176: }

まず、docomo Developer support クラスを呼び出す。
質問文 $query が空だったり 255 文字を超えたらエラーを返すようにする。

続いて、前述のメソッド dialogue を呼び出す。
回答は、utt に入っているメッセージをそのまま利用する。

解説:雑談対話を利用

0263: //対話履歴を配列へ
0264: if ($dialogue != '') {
0265:     parse_str($dialogue$arr);
0266:     foreach ($arr as $key=>$val) {
0267:         if (is_int($key))   $items[] = $val;
0268:     }
0269: }

対話履歴は配列に入れてから表示しているが、応答の度に次のページに渡す必要がある。
そこで、組み込み関数  http_build_query  を使って文字列に変換する。これを配列に復元するには  parse_str  を使った。

参考サイト

(この項おわり)
header