2017年6月16日金曜日

クソリプボット作りました(ツイッター)



ツイッター,続けております.

こんにちは.

あやしいおじさんでございます.




「ウーーーン」と言っている人がたまにいるんですよね.

手動で「コ」を送ったことがあります.



これをやるボットを作れないか・・・?

と思ったのがきっかけです.

(41歳・男性)






できましたのでリンク貼っておきます.

クソリプボット: @kuso_rep_bot

1日しか動かしていませんが,

反応としては・・・

・好意的: 1割程度
・ブロック( ;´Д`): 2-3割
・スルー: 6-7割

くらいですかね.

うんこ好きは日本人の1割程度と予想します.

英語バージョンも作った方がいいのだろうか・・・.

うんこは英語で何ですか?笑




ここから作り方に興味ある方,どうぞ.




・ツイッターアカウント作成とアプリ登録
・Oauth認証
・api利用で検索
・文字列チェック(最後に「うん」があること)
・「うーん」に「こ」をリプライ

で,できました.



では.順番に.

1. ツイッターアカウントとアプリ登録


Twitter REST APIの使い方を参考に作りました.
このページの「2.アクセストークン」の取得まで

2. Oauth認証の準備

2.1 はじめに


苦労しました.

google検索によって得られた情報・・・

・AbrahamさんておじさんがツイッターOauth認証のライブラリを作っていてよく使われているようだ.
・そのライブラリを使えるようにするにはcomposerというコマンドをインストールする.

です.


これにたどり着くのに1,2日かかりました.

急がば回れですかね.日本語のページはヒントにはなりましたが,結局は本家の英語のページを読むのが一番早かったかもしれません.書いてあること短いし・・・.


アブラハムおじさん.

ありがとう,アブラハム♡



まず・・・

2.2 composerのインストール


composerのダウンロードページを読みます.


% php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" 
% php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" 
% php composer-setup.php 
% php -r "unlink('composer-setup.php');"



リンク先のページにも書いてあるように上の要領でダウンロードとセットアップができました.(composer.pharができる)

あとはパスが通っているところにcomposer.pharをcomposerに変えて保存.

2.3 abraham/twitteroauthのインストール


GitHubにソースがあります.ここからファイルダウンロード♡

クリックで拡大


図の1,2の順番でzipをダウンロードです.

(2017年6月ではtwitteroauth-master.zipというファイル名です.)

サーバに置いて解凍.

場所は動作させたいボットプログラムと同じディレクトリでいいと思います.


あとは,アブラハムさんのページのとおり進めます.
(というか,コマンド1行.)


zipを置いたディレクトリで,行います.

twitteroauth-master のディレクトリではありません


% composer require abraham/twitteroauth 


と何も考えずに打ちます.


composerにパスは通っていますよね?
(hash -r しましたか?♡)



% composer require abraham/twitteroauth
PHP Warning: Module 'curl' already loaded in Unknown on line 0
Using version ^0.7.3 for abraham/twitteroauth
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Installing abraham/twitteroauth (0.7.3): Loading from cache
Writing lock file
Generating autoload files
% 
%



みたいなのがでたらOKです.

warningが出てますね・・・無視(笑)

インストールできました♡


途中でphp-extensionsのオプションがいくつか必要になり,インストールしましたが忘れました・・・.
たしかcurl,  JSON, MBSTRING, OPENSSL, ZLIBくらいだったかな?

3. phpコーディング


あとはやりたいことをphpで書きました.

私の場合は「うーん」検索と,その人に「こ」を送信.



ソース,貼っておきます.

「うーん」検索するのですが,

最後にない場合は「こ」を送っても「うんこ」にならないので,その判別を行なっています.

最後に

・うーん…
・うーんw
・うーん?

等最後に1文字付いている場合も「こ!」を返信しています.

json周りの処理はなんだか自信がありませんがなんとか動作しています.

jsonの解析は検索結果が

$tweet = $connection->get('search/tweets', ["q"=>$search_keyword, 'count' => $search_num]);

で$tweetに入りますので,

var_dump($tweet)したものをJSON Pretty Linter Ver2で整形して,要素名を目視チェックしましたw

もっといいやり方がありそうですが・・・.



consumer_keyのあたりのxxxxは各自のものを.




<?php

require_once "vendor/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

// 設定項目
$consumer_key = "xxxxxx"; // API Key
$consumer_secret = "xxxxxx"; // API Secret
$access_token = "xxxxxx";
$access_token_secret = "xxxxx";

$callback_url = "https://xxxxx.jp/kuso.php";

//connection
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $access_token, $access_token_secret);

//search...
$search_num = 20;

$search_keyword = "うーん";
search_and_rep_main($search_keyword, $search_num, $connection);

$search_keyword = "うん";
search_and_rep_main($search_keyword, $search_num, $connection);

/*==============================
* search_and_rep_main()
*=============================*/
function search_and_rep_main($search_keyword, $search_num, $connection){

  $search_keyword = mb_convert_encoding($search_keyword, "UTF-8", "EUC-JP");
  $tweet = $connection->get('search/tweets', ["q"=>$search_keyword, 'count' => $search_num]);

  $array = json_encode($tweet, false);
  $data = json_decode($array, true); //$dataに配列形式で検索結果が入る

  search_and_reply($search_num, $search_keyword, $data, $connection);
}
/*============================== 
* cut_end_word()
*=============================*/
function cut_end_word($word){

  $dest_word = mb_substr($word, -1);

  return $dest_word;
}
/*==============================
* compare_ok_char()
*=============================*/
function compare_ok_char($cut_word){

  $hit_flag = "NO";

  $ok_list = array("。", "w", "笑", "?", "?", "…", "!", "!", "っ", "ー", "☆"); 

  foreach($ok_list as $value){
    $value = mb_convert_encoding($value, "UTF-8", "EUC-JP");
    $cut_word = mb_convert_encoding($cut_word, "UTF-8");
    if(strcmp($value,$cut_word) == 0){
      $hit_flag = "YES";
    }
  }

  return $hit_flag;
}
/*==============================
* search_and_reply()
*=============================*/
function search_and_reply($search_num, $search_keyword, $data, $connection){ 

 for($i=0;$i<$search_num;$i++){
    $hit_flag = "NO";
    $tw = $data["statuses"][$i]["text"];   //検索にヒットしたツイート内容
    $user_id = $data["statuses"][$i]["user"]["screen_name"];   //ユーザid
    $tw_id = $data["statuses"][$i]["id_str"];

    $keyword_pos = mb_strpos($tw,$search_keyword);

    $all_length = mb_strlen($tw);
    $keyword_length = mb_strlen($search_keyword);

    if(($all_length - $keyword_pos) == $keyword_length){   //うーんが最後のとき
      $hit_flag = "YES";
    }
    //1文字だけ最後にあるとき
    else if(($all_length - $keyword_pos) == ($keyword_length + 1)){  
      $cut_word = cut_end_word($tw);
      $hit_flag = compare_ok_char($cut_word);
    }
    else
      $dummy = "d";


    if($hit_flag == "YES"){      //文末にうーんであれば,
      $comment = "@$user_id こ!";
      $comment = mb_convert_encoding($comment, "UTF-8", "EUC-JP");
      $result = $connection->post("statuses/update", array("status"=>$comment, "in_reply_t\o_status_id"=>$tw_id)); 
    }
  }
}
?> 



4. cronでphp実行


上のphpをcrontabに登録

0 * * * * /usr/local/bin/php $HOME/kuso_rep.php

の感じで.

これだと毎時0分実行ですね.


phpにhttpアクセスでデバッグしました.

クソリプボットの完成です.




他に面白い案ありますかね.



(2017.6.17 追記)

最後まで読んでいただきありがとうございます!!!

「ある検索ワード→ヒット→リプライ」はツイッター社により禁止されているようです.

やめましょう!!!www

クソリプボットは1日で自動投稿を制限されましたw



いやー.客観的に見て,ただのスパムボットでした.
すみません( ;´Д`)

面白いと思っていただいた方も複数いらっしゃったようで残念ですが,諦めます.



( ;´Д`)( ;´Д`)( ;´Д`)( ;´Д`)( ;´Д`)



参考・・・

自動化ルールと成功事例



今日の音符読み:46秒


2 件のコメント:

  1. あら、幻の偉業になってしまいましたか。笑
    素晴らしいbotだと思ったんですがね( ;´Д`)

    php、結構好きです( #´Д`)

    返信削除
    返信
    1. あっさり,スパム認定を受けてしまいました(笑)
      「やってはいけない」と書いてあるのそのままの行為だったようで,当たり前の結果です( ;´Д`)
      別の何か作ろうかなとも思っていますが,面白いアイデアがなかなか・・・.
      「うんこ漏らした」ツイートの統計をとったり,代表的なのをリツイート(自動RTはスパム行為になるので実際にはリンクを紹介)してみたり,とか考えましたが・・・面白いのかどうか(笑)

      php好きですか!
      文法が緩いのでとっつきやすかったです.
      仕事でも使っています( ;´Д`)

      削除