ニックネーム(あだ名)機能をEasyBotterに実装
EasyBotter にニックネームを覚えさせて呼んでもらう機能です。
参考にしたのは、「簡単じゃない twitter bot」 の作り方メモ のスクリプトです。
EasyBotter が 2.1.2 にバージョンアップしたので、そのままでは使えませんので改造してみました。
文章は、『「簡単じゃない twitter bot」 の作り方メモ』からの引用を編集しました。
ちなみにWEBは現在非公開となっており、閲覧請求するとみることができるようです。
ブログ内のソースは転載可ということで、管理人のINOUEさんに感謝です。
まずは新規のPHPファイルを2つ作成します。
目次 [閉じる]
1. ニックネームの設定 set_nickname.php
下記スクリプトを
http://設置URL/set_nickname.php?screen_name=スクリーンネーム&nick_name=ニックネーム
の形でアクセスすると、nicknames.txtにニックネームが設定されます。
<?php
//スクリーンネームに対するニックネームを設定する
// http://-------/set_nickname.php?screen_name=スクリーンネーム&nick_name=ニックネーム
// ニックネームはUTF-8、URLエンコードしたもの
mb_internal_encoding('UTF-8');
mb_language('Japanese');
$nicknamefile = 'nicknames.txt';
header('Content-Type: text/plain');
if (!file_exists($nicknamefile)){
touch($nicknamefile);
chmod($nicknamefile,0666);
}
if (!isset($_GET['screen_name']) || !isset($_GET['nick_name'])){
echo 'PARAM ERROR.';
exit;
}
$fs =fopen($nicknamefile,'a');//追加書き込みモード
flock($fs,LOCK_EX);//ロック
fputs($fs,$_GET['screen_name']."\t".$_GET['nick_name']."\r\n");//タブ区切りで追加
flock($fs, LOCK_UN);//ロック解除
fclose($fs);
echo 'OK.';
exit;
?>
2. ニックネームの読み込み get_nickname.php
下記スクリプトを
http://設置URL/get_nickname.php?screen_name=スクリーンネーム&user_name=ユーザー名
の形でアクセスすると、nicknames.txt に設置されたニックネームが返って来ます。
設定がなければ ユーザー名+さん
ユーザー名が無ければ スクリーンネーム+さん
で名前を返します。
<?php
//ニックネームを返す
// http://eclair.sakura.ne.jp/dora_bot/get_nickname.php?screen_name=スクリーンネーム&user_name=ユーザー名
// スクリーンネームは自分のID ニックネームは呼ばせたいニックネーム
// ユーザー名はUTF-8、URLエンコードしたもの
//戻り値
// 設定がある場合はニックネーム
// 無ければ ユーザー名+さん
// ユーザー名が無ければ スクリーンネーム+さん
error_reporting(0);//エラー抑制
mb_internal_encoding('UTF-8');
mb_language('Japanese');
$nicknamefile = 'nicknames.txt';
//設定ファイル読み込み
$fs =fopen($nicknamefile,'r');
while(!feof($fs)){
$txt = fgets($fs);
list($sn,$nn) = explode("\t",$txt);
if (trim($sn) != '' && trim($nn) != ''){
$names_array[trim($sn)] = trim($nn);
}
}
fclose($fs);
//------------- セットされるとこんな配列
//$names_array['shuzo_matsuoka'] = '修造さん';
//$names_array['shuumai'] = 'しゅうまいさん';
//$names_array['zetsu_bot'] = '先生';
//------------------------------------
if (!isset($_GET['screen_name']) || $_GET['screen_name'] == ''){
exit;
}
if (isset($names_array[$_GET['screen_name']])){
$nick_name = $names_array[$_GET['screen_name']];
}else{
if (isset($_GET['user_name']) && $_GET['user_name'] != ''){
$nick_name = $_GET['user_name'].'君';
}else{
$nick_name = $_GET['screen_name'].'君';
}
}
header('Content-Type: text/plain');
echo $nick_name;
exit;
?>
1と2で作った2つのファイル
set_nickname.php
get_nickname.php
を、 EasyBotter にアップロードして下さい。
3. 実際の使い方を EasyBotter の改造例で示します。
改造の内容は、 @xxx_bot 「ホニャララ」と呼んでください。
と言われたら、以後その人をホニャララと呼ぶようにします。
EasyBotterクラスのmakeReplyTweets関数の中、 リプライパターンと照合する処理とパターンになかった場合はランダム処理の間に、 ニックネームを設定する記述を追加します。
※ 以下のスクリプトは EasyBotter 2.1 用に改造してあります。
EasyBotter.php を編集して以下のソースを追加します。
if (preg_match("/「(.*)」.*(と|て)(呼んで|よんで)/", (string)$reply["text"], $matches)){
$result = file_get_contents('http://設置URL/set_nickname.php?screen_name='.(string)$reply["user"]["screen_name"].'&nick_name='.urlencode($matches[1]));
if (stristr($result,'OK.')){
$status = "わかりました。これからは".$matches[1]."とお呼びします。";
}else{
$status = "ごめんなさい。よくわかりませんでした。";
}
}
※ 挿入する場所を聞かれることが多いので、追記(2014年4月27日)
無改造の EasyBotter.php ver2.1.3 を参照して下さい。
上のソースは、行番号:286 の後ろに入れます。
次に、convertText関数の{name}の置換をニックネームに変更します。
if(strpos($text,"{name}") !== FALSE){
if(!empty($reply)){
$text = str_replace("{name}",file_get_contents("http://設置URL/get_nickname.php?screen_name=".(string)$reply["user"]["screen_name"]."&user_name=".urlencode((string)$reply["user"]["name"])),$text);
}else{
$randomTweet = $this->getRandomTweet();
$text = str_replace("{name}",file_get_contents("http://設置URL/get_nickname.php?screen_name=".(string)$randomTweet["user"]["screen_name"]."&user_name=".urlencode((string)$randomTweet["user"]["name"])),$text);
}
}
※ 挿入する場所を聞かれることが多いので、追記(2014年4月27日)
上のソースは、行番号:430 の後ろに入れます。
以上、EasyBotter 2.1.2 でも動くように改造終了です。
動作は確認済みですが、いつまで使えるやら(´・ω・`)
はじめまして!長らく2.1版でニックネーム機能をつける方法を探していたのでこちらのサイト様で紹介されているのを見つけたときはとても嬉しかったです。
無事に実装することができました、ありがとうございます!
実装おめでとうございます。
2.1になってから動かなくなって、改造めんどくせぇとか思ってたわけですが
BOTのDMに、また愛称呼んでくれるようにしてくださいとか要望ありまして頑張りました^^