/*==================================================================================================
* このファイルの中身を EasyBotter.php の class EasyBotter 内に貼りつけてください。
* このファイルの 100 行目付近まではカスタムできる項目があります。
*
* https://github.com/wktk/markov4eb (v1.42)
* https://twitter.com/wktk
*
*_screen_name}",
// 'このように',
// 'カンマ区切りで',
// '単語を追加できます',
), '', $text); // 一致した部分を全て削除
// 正規表現を利用した削除
$text = preg_replace(array(
// @screen_name 形式の文字列
// 無効化すると通常ツイート時に @mention を飛ばすことがあります
'/(?:@|@)\w+/',
// URL
'|https?://t.co/\w+|i',
// ハッシュタグ
//'/#|#/', // ハッシュタグ化をすべて回避する場合
'/(?:#|#)\w+/', // 英語ハッシュタグのみ回避する場合
// RT, QT 以降の文字列
'/\s*[RQ]T.*$/is',
// '/このように{5,12}/',
// '/[,\s]*カンマ[^区切りで]+/',
// '/正規(?:表現|を)追加できます/',
), '', $text); // マッチした部分を全て削除
// 連続する空白をまとめる
$text = preg_replace('/(?: |\s)+/', ' ', $text);
$text = preg_replace('/^(?: |\s)|(?: |\s)$/', '', $text);
return $text;
}
// タイムラインから拾うツイートをマルコフ連鎖用に選別する関数
function _mCheckTimeline($tl) {
// 選別しない場合は次行を利用
// return $tl;
$tl_ = array();
foreach ($tl as $tweet) {
$tweet['source'] = preg_replace('/<[^>]+>/', '', $tweet['source']);
if (false
// 「拾わない」ツイートの条件を設定できます
// bot のツイート
|| $tweet['source'] == 'twittbot.net'
|| $tweet['source'] == 'EasyBotter'
|| $tweet['source'] == 'Easybotter'
|| $tweet['source'] == 'ツイ助。'
|| $tweet['source'] == 'MySweetBot'
|| $tweet['source'] == 'BotMaker'
// 鍵垢の方
|| $tweet['user']['protected'] == true
// bot 自身
|| $tweet['user']['screen_name'] == $this->_screen_name
// RT
|| preg_match('/^RT/', $tweet['text'])
// 以下は TL 選別の設定例です
// 試してないのでうまく動かないかも知れません
// @wktk のツイートは拾わない
//|| $tweet['user']['screen_name'] == 'wktk'
// プロフィールの名前が正規表現にマッチしない方
//||!preg_match('/[a-zA-Z]{5,}/', $tweet['user']['name'])
// 設定言語が日本語でない方
//||!$tweet['user']['lang'] == 'ja'
// プロフィールの紹介文に 転載 を含む方
//||stripos($tweet['user']['description'], '転載')
// デフォルトアイコン (タマゴ) の方
//|| $tweet['user']['default_profile_image'] == true
// フォロー比が高すぎる方
//|| (int)$tweet['user']['friends_count'] / ((int)$tweet['user']['followers_count'] + 1) > 10
// 画像や動画に不適切な内容を含む可能性のあるツイート
//|| $tweet['possibly_sensitive'] == true
) {}
// 他は拾う
else $tl_[] = $tweet;
}
return $tl_;
}
// マルコフ連鎖でツイートする関数
function markov($url='https://api.twitter.com/1.1/statuses/home_timeline.json?count=30') {
// タイムラインからテーブルを生成
list($table, $timeline) = $this->_mGetTableByURL($url, 'Tweet');
if (!$table) return $timeline;
// マルコフ連鎖で文をつくる
$status = $this->_mBuildSentence($table, $timeline);
// 出来た文章を表示
echo 'markov4eb (Tweet) > '. htmlspecialchars($status). "\n";
// 投稿して結果表示
$this->showResult($this->setUpdate(array('status' => $status)), $status);
}
// マルコフ連鎖でリプライする関数
function replyMarkov($cron=2, $url='https://api.twitter.com/1.1/statuses/home_timeline.json?count=30') {
// replyPatternMarkov() のパターンファイルがないものとして扱う
return $this->replyPatternMarkov($cron, '', $url);
}
// パターンにマッチしなかったらマルコフ連鎖でリプライする関数
function replyPatternMarkov($cron=2, $patternFile='reply_pattern.php', $url='https://api.twitter.com/1.1/statuses/home_timeline.json?count=30') {
// リプライを取得・選別
$response = $this->getReplies($this->_latestReply);
$response = $this->getRecentTweets($response, $cron * $this->_replyLoopLimit * 3);
$replies = $this->getRecentTweets($response, $cron);
$replies = $this->selectTweets($replies);
if (!$replies) {
$result = "markov4eb (Reply) > $cron 分以内に受け取った @ はないようです。";
echo htmlspecialchars($result). "\n";
return $result; // 以後の処理はしない
}
// ループチェック
$replyUsers = array();
foreach ($response as $r) $replyUsers[] = $r['user']['screen_name'];
$countReplyUsers = array_count_values($replyUsers);
$replies2 = array();
foreach ($replies as $reply) {
$userName = $reply['user']['screen_name'];
if ($countReplyUsers[$userName] < $this->_replyLoopLimit) $replies2[] = $reply;
}
// 古い順にする
$replies = array_reverse($replies2);
if (!$replies) {
$result = "markov4eb (Reply) > 返答する @ がないようです。";
echo htmlspecialchars($result). "\n";
return $result; // 以後の処理はしない
}
// パターンファイルの読み込み
if (empty($this->_replyPatternData[$patternFile]) && !empty($patternFile)){
$this->_replyPatternData[$patternFile] = $this->readPatternFile($patternFile);
}
$results = array();
$repliedReplies = array();
foreach ($replies as $reply) {
$status = '';
// 指定されたリプライパターンと照合
foreach ((array)$this->_replyPatternData[$patternFile] as $pattern => $res) {
if (preg_match("@{$pattern}@u", $reply['text'], $matches)) {
$status = $res[array_rand($res)];
for ($i=1; $i