「ver.2.0/応用/機能追加/reply」の編集履歴(バックアップ)一覧に戻る

ver.2.0/応用/機能追加/reply - (2013/08/18 (日) 23:58:15) のソース

※wikiの編集が分からなくて、追加してほしい項目がある場合はページ下の「コメント」から誰かに頼んで下さい。
#contents

*改造方法を紹介するスレにあった「単語拾い」をver.2.0で使いたい [#c1629660]
//[[フッターバグの修正案>ver.2.0*現状バグ]]を利用します → ''if(preg_match("@{.+?}@",$status) == 1){}'' を外しておく
EasyBotter.php内
 if(strpos($text,"{tweet}") !== FALSE && !empty($reply)){
    $tweet = preg_replace("@\.?\@[a-zA-Z0-9-_]+\s@u","",$reply->text);
    $text = str_replace("{tweet}",$tweet,$text);
 }
 //フッターを追加
 $text .= $this->_footer;
の直前に、以下を追記する。
 //■■ここから名詞拾い■■
 if(strpos($text,"{ran_meishi}") !== FALSE && !empty($reply)){
	//アプリケーションID
	$apiKey = "***********************";
	$apitweet = preg_replace("@\.?\@[a-zA-Z0-9-_]+\s@u","",$reply->text);
	$apiurl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid=".$apiKey."&filter=9&sentence=".$apitweet;
	$apirss = file_get_contents($apiurl);
	$apixml = simplexml_load_string($apirss);
	//配列「meishi」を作る
	$meishi = array();   
	// 特定の単語、指定字数以下の名詞を弾きながら配列に名詞を追加
	foreach($apixml->ma_result->word_list->word as $apiitem)
	{
		//拾いたくない単語
		if ((ereg("ダタラ|モスマン|モコイ", $apiitem->surface)==False) && (mb_strlen($apiitem->surface) > 3*2)){
			$meishi[]=$apiitem->surface;
		}
	}
	//リプライの中に名詞がない場合の単語をセット(複数設定可)
	if ($meishi[0] == ""){$meishi = array("<censored>","×××","■■■");}
	//名詞をランダムに選ぶ
	$ran_meishi = $meishi[array_rand($meishi)];
	//名詞を変換する
	$text = ereg_replace("{ran_meishi}", "$ran_meishi", $text);
 }
**備考 [#e06b9c91]
[[ぼっと倉庫>http://blog.livedoor.jp/bot_1go/archives/1733069.html]]がソースです。
使い方はこちらのサイトの解説をよく見ること。


*自動フォロー返しした時にリプライで知らせたい [#ycc2942f]
EasyBotter.php内
 //自動フォロー返し
 function autoFollow(){
	$response = $this->getFollowers();
	$followList = array();
	foreach($response as $user){
		$follow = (string)$user->following;
		if($follow == "false"){
			$followList[] = (string)$user->screen_name;
		}
	}
	foreach($followList as $screen_name){
		$response = $this->followUser($screen_name);
	}
 }
とある部分を探す。
 foreach($followList as $screen_name){
 $response = $this->followUser($screen_name);
 }
の直後に
 //■■フォローした時にリプライを送る■■
 foreach($followList as $rscreen_name){
	$value = array("status"=>"@{$rscreen_name} フォロー完了しました!");
	$response = $this->setUpdate($value);
	$result = $this->showResult($response);
	$results[] = $result;
 }
を入れる。
「フォロー完了しました!」は自由に変更してもOK。 
//screen_name→rscreen_name修正 4.16

*鍵付きの人へ何度も話しかけてしまう場合 [#q1c3b296]
[[BBSより転載です。>http://jbbs.livedoor.jp/bbs/read.cgi/internet/6629/1265625817/519]]
EasyBotter.php内
 //自動フォロー返し
 function autoFollow(){
 (略)
 if($follow == "false"){
を
 //自動フォロー返し
 function autoFollow(){
 (略)
 if($follow == "false" && $user->protected == "false"){
と変更する。
鍵付きの人へフォロー返しを行いません。


*正規表現を使った言葉返しで、言葉遊びをさせる(文字列の並びを変える。) [#x3c977be]
EasyBotter.php内
 //リプライを作る
 (略)
 //リプライパターンと照合
 (略)
 for($i=1;$i <count($matches);$i++){
 $p = "$".$i;
 $status = str_replace($p,$matches[$i],$status);
 }
を探す。
 $status = str_replace($p,$matches[$i],$status);
を
 //■■言葉遊びする■■
 if(preg_match("/言葉遊び/u",$status)){
	$kotoba_asobi = $this->mb_str_shuffle($matches[$i],"UTF-8");
 }else{
	$kotoba_asobi = $matches[$i];
 }
 $status = str_replace($p,$kotoba_asobi,$status);
に変更する。

EasyBotter.php内ラスト
 }
 ?>
の直前に
 function mb_str_shuffle($str,$enc){
	$buff = array();
	while ($len = mb_strlen($str,$enc)) {
		$buff[] = mb_substr($str,0,1,$enc);
		$str = mb_substr($str,1,$len,$enc);
	}
	shuffle($buff);
	return implode('',$buff);
 }
を追記する。

**備考 [#ucd102de]
mb_str_shuffle()は[[どう書く?org beta>http://ja.doukaku.org/249/nested/]]ソースです。

「言葉遊び」部分はリプライパターンに応じて変更して下さい。
この一例はリプライパターンで「『$1』…言葉遊びしてみたよ~♪」とリプライさせる時の例になります。
「『$1』…言葉遊びしてみたよ~♪」とリプライする時のみ、$1を言葉遊びさせます。
言葉遊び:$1が「あいうえお」だとすると、「あおういえ」「うえあおい」等とランダムに文字列を入れ替えます。


*自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版) [#v3f312b5]
「フォローして」「リムーブして」とリプライをした時にBOTに対象への処理を行う。
※実際は「フォローして」「リムーブして」等の簡単な言葉ではないものを推薦。「フォローして。○○○(BOTの名前)」等。
reply_pattern.php $data = array();内に
 //半自動フォロー、リムーブ
 "フォローして"=> array(
	"[[AUTOFOLLOW]]フォローしました",
	"[[AUTOFOLLOW]]フォローしたよ",
 ),
 "リムーブして"=> array(
	"[[AUTOREMOVE]]リムーブしました",
	"[[AUTOREMOVE]]リムーブしたよ",
 ),
を追記。

EasyBotter.php内
 //リプライを作る
 (略)
 //リプライパターンと照合
 (略)
 $re["status"] = "@".$reply_name." ".$status;
を探す。
 $re["status"] = "@".$reply_name." ".$status;
を
 switch(true){
	//半自動フォロー
	case stristr($status, "[[AUTOFOLLOW]]"):
	$status = str_replace("[[AUTOFOLLOW]]","",$status);
	$followreq = $this->consumer->sendRequest("http://api.twitter.com/1/friendships/create.json",array("screen_name" => $reply["user"]["screen_name"]),"POST");
	$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
	break;
 
	//半自動リムーブ
	case stristr($status, "[[AUTOREMOVE]]"):
	$status = str_replace("[[AUTOREMOVE]]","",$status);
	$removereq = $this->consumer->sendRequest("http://api.twitter.com/1/friendships/destroy.json",array("screen_name" => $reply["user"]["screen_name"]),"POST");
	$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
	break;
 
	//その他
	default:
	$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
 }
に書き換える。

**備考:フォロー告知をDMにしたい場合(リムーブは出来ません。) [#b0266ba0]
switch(true){
//半自動フォロー
case stristr($status, "[[AUTOFOLLOW]]"):
$statusxxx = str_replace("[[AUTOFOLLOW]]","",$status);
$followreq = $this->consumer->sendRequest("http://api.twitter.com/1/friendships/create.json",array("screen_name" => $reply["user"]["screen_name"]),"POST");
$followreq = $this->consumer->sendRequest("https://api.twitter.com/1/direct_messages/new.json",array("screen_name" => $reply["user"]["screen_name"],"text" => "$statusxxx"),"POST");
$re["status"] = "";
break;
(略)
}
if(stristr($status, "[[AUTOFOLLOW]]")){continue;}


*特定のリプライ反応をリプライではなくTL発言にする [#wb35bfa8]
EasyBotter.php内
 //リプライを作る
 (略)
 //リプライパターンと照合
 (略)
 $re["status"] = "@".$reply_name." ".$status;
を探す。
 $re["status"] = "@".$reply_name." ".$status;
を
 switch(true){
	//TL発言
	case stristr($status, "[[TLH]]"):
	$status = str_replace("[[TLH]]","",$status);
	$re["status"] = $status;
	$rpid = (string)$reply->id;
 	file_put_contents($this->_logDataFile,$rpid);
	break;
	//その他
	default:
	$re["status"] = "@".$reply_name." ".$status;
 }
に書き換える。

reply_pattern.php $data = array();内
 ""=> array(
	"[[TLH]]あれ…誰か呼んだ?",
	"その言葉はわからないです",
 ),
と記入。
ランダムで
 「[[TLH]]あれ…誰か呼んだ?」
が選ばれた時、リプライではなくTL上に「あれ…誰か呼んだ?」と発言する。

*一度のリプライでリプライ回数の制限する
EasyBotter.php内 
 //古い順にする
 $replies = array_reverse($replies_); 
 if(count($replies) != 0){ 
 //リプライの文章をつくる
 $replyTweets = $this->makeReplyTweets($replies, $replyFile, $replyPatternFile); 
の下に
 //リプライ回数の制限 ここから
 $reply_max = 3;//1回のreply実行でリプライできる最大数
 if(count($replyTweets) > $reply_max){//$replyTweetsが$reply_maxよりおおきかったら
 	//$replyTweetsが$reply_max件になるまで配列から要素を削除
 	while(count($replyTweets) > $reply_max){
 	array_splice($replyTweets,array_rand($replyTweets),1);//ランダムで1件削除
 	}
 }
 //リプライ回数の制限 ここまで 
を追加する

*コメント [#fd6efe73]
- &quot;特定のリプライ反応をリプライではなくTL発言にする &quot;についてなんですが、TLHとはなんでしょうか?  -- みゅ子  (2010-09-16 01:23:26)
- TL発言=TLH これに限らず分からないのならまずは検索して調べましょ  -- zero  (2010-09-16 21:05:38)
- zeroさんありがとうございます。&quot;TLH twitter&quot;で検索したのですがいまいちよく分からず;次からはもっと検索してみます。すみませんでした。 それと「特定のリプライ反応をされる単語」は何処で設定できるのでしょうか?><;  -- みゅ子  (2010-09-17 22:17:33)
- TL上の特定の単語に反応してTL発言をする、というのは可能ですか?  -- フィル  (2010-10-26 19:32:23)
- TLに反応してTL発言をするのはリプライ反応をTL発言にするの応用でできます。  -- ナナシスター  (2010-11-03 18:05:32)
- リプライに関してreply_patternにない場合にはdata.txtからランダム発言ではなく、何も返さないようにするにはどうすればよいのでしょう  -- 774  (2010-11-23 23:36:19)
- 「フォローした時にリプライを送る」で{name}を使いたいのですがうまくできません。どなたかご教授いただけませんでしょうか。自分でも調べてみたのですがわかりません。  -- りん  (2010-12-20 16:41:08)
- フォロー要請&リプライする をするとどうもエラーになるのですが・・・原因分かる方いますか?  -- なな  (2011-04-12 23:51:31)
- ↑まだ分からないならBBSのTwitterBotPHP質問スレの方へ  -- 通りすがり  (2011-04-19 00:37:45)
- [[TLH]]とリプライサンプルの「([^\s、。]+?)は好き?&quot;」「&quot;$1おいしいです&quot;」は併用できませんか?(動きませんでした)  -- なし  (2011-06-18 19:01:07)
- 「単語拾い」で、拾った発言を返す文章はdata.txtに書くのでしょうか?  -- 774  (2011-07-07 00:35:47)
- ↑reply.txt  -- 名無しさん  (2011-07-07 20:24:33)
- ↑「reply_pattern.php」ではありませんか?  --    (2011-07-08 01:02:17)
- 自動フォロー返しした時にリプライで知らせたいをDMで知らせることはできるのでしょうか。  -- 名無しさん  (2011-09-06 17:27:09)
- 非公式RTに反応させることはできないでしょうか?  -- 名無しさん  (2011-09-10 01:30:13)
- 過去ログ内で紹介されてましたけど、EasyBotter.phpの中でRTを検索するとそれらしきところが出てきます。あとは御自分でドウゾ  -- 名無しさん  (2011-09-13 20:22:51)
- 名詞拾いで、TLの名詞を拾って、その言葉を盛り込んでTLでつぶやくというのは出来ますか? 出来るのならどこをどう改編したら良いでしょうか。  -- 名無しさん  (2012-05-24 22:02:30)
- リプライをもらったツイートに対してfavをする機能はどのように実装しますか  -- 名無しさん  (2012-07-02 20:27:11)
- 特定の言葉がTL上にあるとき、favをする機能の実装はどうすればできますか  -- 名無しさん  (2012-07-02 20:30:28)
- Ver2.5を新APIにしたら半自動フォロー&リムーブが出来なくなりました…コピペしただけなので、こうなった理由が分からず困ってます;  -- 名無しさん  (2012-10-19 23:35:08)
- ↑Twitterがまた仕様変更したようですね。easybotterの作者さんが修正版を近々出すそうなので待ちましょう。  -- 名無しさん  (2012-10-20 15:07:20)
- 新APIにしてから、viaが自分の設定したのとAPIで2重反応されます。私だけでしょうか?  -- 名無しさん  (2012-11-15 16:01:40)
- バージョン2.1.1でも『特定のリプライ反応をリプライではなくTL発言にする』機能を使いたいのですが、どうすれば使えますか?  -- 七種  (2012-12-29 23:36:47)
- 2.1.2だと上記の半自動フォローが使えないと思うのですがどう修正すればいいのでしょう…リプを返す所までは修正出来ましたがフォローを返せません…  -- 名無しさん  (2013-01-31 12:13:29)
- http://badosyan3.blog84.fc2.com/blog-date-201301.html  -- 名無しさん  (2013-02-01 21:11:41)
- ↑途中送信失礼しました。「自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版) [#v3f312b5]」の部分は↑のサイトの方が参考になるかも…?  -- 名無しさん  (2013-02-01 21:12:29)
- ↑ありがとうございます、無事フォロー出来ました!  -- 名無しさん  (2013-02-02 02:53:34)
- 2.1.2で単語拾いを使うにはどうすればいいのでしょうか。エラーが出て使えません…。  -- 名無しさん  (2013-02-20 03:29:33)
- 自動フォロー返しした時にリプライで知らせたい、の通りにやるとバージョン2.1.2では動きません。どなたか分かる方いらっしゃいませんか?  -- 名無しさん  (2013-02-21 13:32:05)
- 自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版)↑の参考URLが見れません。どなたか方法わかる方いらっしゃいますでしょうか。  -- 名無しさん  (2013-06-13 15:44:15)
- ↑自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版)の参考URLが見れないのですがどなたか参考になるページを教えていただけないでしょうか。  -- 名無しさん  (2013-06-13 15:45:08)
- 名詞拾いの件ですがリプライの単語を拾うのではなくTL上の単語を拾わせるにはどこをどう変えればいいですか?  -- 名無しさん  (2013-06-21 01:19:04)
- 自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版) [#v3f312b5]と、備考:フォロー告知をDMにしたい場合(リムーブは出来ません。) [#b0266ba0]の部分について直してみました。あっているという保証はできませんが試してみてください  -- 名無しさん  (2013-08-02 16:07:13)
- 「自動フォローではなく特定のリプライを貰った時のみ対象にフォロー要請&リプライする(新API対応版) [#v3f312b5]」ですが「http://api.twitter.com/1/friendships/create.json」では動かないようです。「http://api.twitter.com/1.1/friendships/create.json」に修正したら動きました。  -- 名無しさん  (2013-08-18 10:22:38)
- 上のコメントの方へ。ここはEBの古いバージョンの記述なので、新APIはvなしのものからv1になったときの新APIのことだと思いますよ。APIv1.1のはver.2.1版に書いたほうがよかったかもしれません。  -- 名無しさん  (2013-08-18 23:58:15)
#comment
目安箱バナー