【コード公開】BOT TREE for MEDIAを使ってLedgeをbotにしてみた

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

おはようございます。小野寺です。

TechCrunchが記事配信botを作ったことが少し前に話題になりましたよね。使いやすさは置いといて、「新しいメディアの形としてのbot」も今後注目する必要がありそうです。

日本でも、記事を配信してくれるbotを自社メディアで作れちゃう制作ツール「BOT TREE for MEDIA」がZEALSから先日公開されました。

今はまだβ版なのですが、Ledgeの記事を紹介してくれるbotを早速作ってみたので、作る過程と感想などなど紹介していきます。

BOT TREE for MEDIAってなに?

zeals1

BOT TREE for MEDIAは、「インターネットメディアに特化したBOT開発用のツール」です。コーディング無しでもbotを作れるのも特徴の1つなんだとか。

これを使えば、ユーザーの興味関心を会話の中から判断して「この記事がおすすめ!」とレコメンドしてくれるbotが作れます。

自社メディアの記事配信をbotという形で提供することで、ユーザーと双方向のコミュニケーションを取ることが出来るので、ユーザーがどんな記事を読みたがっているか?など、いままで取りにくかった情報がとれるかもしれません。

ユーザーとの距離が狭まることで、よりユーザーの意見を反映したメディア設計ができるようになるはずです。

今回はLINE上で動くように連携させて作ってみます。以下の手順で作成しました。

  • LINE Business Accountの作成
  • BOT TREE for MEDIAのアカウント作成と設定
  • LINEアカウントとBOT TREE for MEDIAの連携

それぞれ説明します。

LINE Business Accountの作成

LINE botをつくるために必要なアカウントですが、作り方などは他にも記事が公開されているので今回は省略しちゃいます。

以前Ledgeでも記事を書いたのでそちらを参考にしてください。>> なるほどこうなっているのか。今話題のLINEbotを (勢いだけで)作ってみた

IDとSecretKeyとMIDはのちのち使うのでメモしておきます。

BOT TREE for MEDIAアカウントの作成と設定

まずは、BOT TREE for MEDIAのサイトでアカウントを作ります。登録するとメールがくるので、記載されているapiコードは忘れずメモしておきましょう。

アカウントを作成したら、やるべき設定は2つです。

  • 記事と関連キーワードの登録
  • ユーザーとの初期会話の設定

記事と関連キーワードの登録

botからレコメンドさせたい記事をBOT TREE for MEDIAに登録します。メディアのすべての記事を登録してもいいですし、一部でも構いません。

ここで必要な情報は、

  • 公開日時
  • タイトル
  • URL
  • 関連キーワード

です。

ZEALS①

キーワードは記事をレコメンドするときに使います。記事にあったキーワードを自分で考えましょう。

ユーザーとの初期会話の設定

次に、最初にユーザーと会話する内容を決めていきます。

ここではニックネームや性別、年齢などの質問を必要に応じて設定できます。今回はほとんどデフォルトのままです。
ZEALS-5

質問から得た情報はBOT TREE上で確認できるようになっているので、後々「メディアの読者層はこのぐらいの年齢の人が多いんだなー」とかも調べることができますね。

ちなみに特別な設定をしなくても雑談機能がデフォルトで搭載されているため、キーワードと関係のない言葉にもそれなりに対応することができます。

BOT TREE for MEDIAとLINEをつなげる

あとはBOT TREEとLINEを接続すれば使えるようになります。

これにはサーバーが必要ですが、ちょっと使うだけであれば無料のHerokuで問題ありません。

Herokuとの連携でもこちらを参考に >> なるほどこうなってるのか。今話題のLINE botを(勢いだけで)作ってみた

しっかり考えるとめんどくさいのでindex.phpに以下のコード(ZEALSの方から頂きました!)をコピペでオッケーです。

コード内27,64~66行目のxxxxxxxxxxxの部分にメモしていた情報を記載します。

[code]<?php
ini_set("display_errors", On);
error_reporting(E_ALL);
error_log("callback start.");
$json_string = file_get_contents(‘php://input’);
$jsonObj = json_decode($json_string);
$to = $jsonObj->{"result"}[0]->{"content"}->{"from"};
$text = $jsonObj->{"result"}[0]->{"content"}->{"text"};

$response_arrays = chat($to, $text);

foreach ($response_arrays as $response_array){
$response_text[]=$response_array[‘content’];
}

// toChannelとeventTypeは固定値なので、変更不要。
$post_data = ["to"=>[$to],"toChannel"=>"1383378250","eventType"=>"138311608800106203","content"=>$response_format_text];

foreach($response_text as $val){
$response_format_text = [‘contentType’=>1,"toType"=>1,"text"=>$val];
line($to,$post_data,$response_format_text);
}

function chat($to, $send_message) {
// ジールスが発行したAPIKeyを入力(11桁)
$api_key = ‘xxxxxxxxxxx’;
$api_url = ‘https://bottree.tokyo’;
$req_body = array(
‘api’ => $api_key,
‘content’ => $content,
);
$req_body[‘content’] = array(
‘userid’ => $to,
‘text’ => $send_message
);
$headers = array(
‘Content-Type: application/json; charset=UTF-8’,
);
$options = array(
‘http’=>array(
‘method’ => ‘POST’,
‘header’ => implode("\r\n", $headers),
‘content’ => json_encode($req_body),
)
);
$stream = stream_context_create($options);
$res = json_decode(file_get_contents($api_url, false, $stream),true);
return $res[‘contents’];
}

function line($to,$post_data,$response_format_text){
// toChannelとeventTypeは固定値なので、変更不要。
error_log("line called");
$post_data = ["to"=>[$to],"toChannel"=>"1383378250","eventType"=>"138311608800106203","content"=>$response_format_text];
$ch = curl_init("https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, ‘POST’);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data));
//LINE設定画面に表示されているものに書き換え
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
‘Content-Type: application/json; charser=UTF-8’,
‘X-Line-ChannelID: xxxxxxxxxxx’,
‘X-Line-ChannelSecret: xxxxxxxxxxx’,
‘X-Line-Trusted-User-With-ACL: xxxxxxxxxxx’
));
$result = curl_exec($ch);
$debug = json_encode($post_data);
error_log("have posted");
error_log($debug);
error_log($result);
curl_close($ch);
}

?>
[/code]

これで設定は終了です。なんだかんだサーバーの設定なども含めると30~60分ほどかかってしまいました。

早速作成したbotを使ってみます。

Ledgebotを使ってみる

Ledgebotは最初に、

  • ニックネーム
  • 年齢
  • 性別
  • 職業

を聞く仕様になっています。自分で作っておいてめんどくさいですが、答えていきます。

ZEALSBOT_LINE

あとは、どんな記事が読みたいかチャットするだけです。

例えば、人工知能とチャットボットに関する記事を聞いてみると、登録したキーワードと照合して記事を紹介してくれます。

ZEALSBOT_LINE

こんな感じで「人工知能」と「チャットボット」というキーワードが登録されていた記事をレコメンドしてくれました。

誰がどんな会話をしたか、という情報は全てBOT TREE側で確認することができます。ニックネーム、名前、職業など自分で設定した必要な情報の他に、会話ログも見れますよ。

ZEALS-2

この記事で作成したLINEbotのQRコードは以下です。是非是非つかってみてください。

chatbot_url

ちなみにこちらからもいけます。

まだまだ使いづらさが残る点も……

個人的に改善が必要だなーって感じた点を上げてみると、

  • 1記事ずつの紹介。複数記事一気には紹介してくれない
  • ニックネームや性別などを間違えて回答しても、あとから修正できない
  • プログラミング無しではできない。コーディングの知識がいる
  • 設定したキーワードを伝えても、正しく動作しない時がある
  • 記事の登録、記事のキーワード登録を自分でしないといけない
  • 最初入力させる情報をレコメンドのルールに使えない
  • デフォルトで搭載されている雑談の返答が軽すぎる。お堅いメディアでは使えない

などなど。このあたりはまだ正式版じゃないので、これからの開発に期待です。

最後に

botからの記事配信は、まだまだ課題がありそう。正直、現段階ではwebメディアでの体験/ユーザビリティを超えないのかなーと。

ただbotにしておくことで、他のサービスとの連携や、パーソナライズ対応など、これから次々と出てくるであろう技術と組み合わせることができますし、横目で追っておいた方がいい気がします。

賢くなれば、本当にドンピシャの記事をレコメンドしてくれそうですしね。それにめちゃくちゃ記事数が多くなってくれば、自分で記事を探すよりも効果がありそうです。

今後の展開が楽しみですね。

では、小野寺でしたー。