いろんな言語で Twitter Bot を作成する（PHP, Python, Node.js, Google Script）

#いろんな言語で Twitter Bot をつくる

## はじめに
プログラムの基礎を勉強したら、Twitter Botにつぶやいてみることを実践しています。（プログラムが動作し、成功がしっかりと実感できるから、というのが主な理由です）

【今回の対象】

- PHP
- Python
- Node.js
- Google Script

## 前提条件
Twitter App にて新規appを登録し、4つのキーを取得する。

 - Consumer Key(API Key)
 - Consumer Secret(API Secret)
 - Access Token
 - Access Token Secret

【参考】
  Twitter Developer 登録からアプリケーション作成まで〜
    https://qiita.com/kei2ro/items/17fac4502119e9918763


## やりたいこと
 - プログラムと同じフォルダ・ディレクトリにあるtxtファイルを読み取り、Twitterに投稿する
 - Cronなどにより定期的に実行する（1日1回 or 2回ほど）
 
 今回は、手元のtxtファイルを読み取る形にしているが、DB（MySQLなど）からのデータを取得後、投稿するということもできるかと思います。

【実際のTwitterアカウント】
　https://twitter.com/anotherskyjp

## 実際のもの


## PHP
 - twitteroauth を利用する。(参考：https://github.com/abraham/twitteroauth)
 - 毎日1回実行。list.txt の前5文字に日付を書いておき、今日の日付と合致した文をtweetする。
 - 下記のようなリストTEXTを用意(名言集)

![list.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/64d54a89-447b-8d9f-d104-1e2d3ab5c034.jpeg)


~~~tweet.php
// OAuthライブラリの読み込み
require "twitteroauth/autoload.php";
use Abraham\TwitterOAuth\TwitterOAuth;

//認証情報4つ
$consumerKey = "KEYを設定";
$consumerSecret = "KEYを設定";
$accessToken = "KEYを設定";
$accessTokenSecret = "KEYを設定";

//今日の日付を取得(月日)
$today = date("m/d");

//ファイルの行を抽出
$filelist = file('list.txt');

//filelistをループしながら、todayと前5桁が同じものを探し、6桁目からをmessageに格納する
$i = 0;
while ($i < 365) {

  //fileの前5桁を抜き出す
  $date1 = substr($filelist[$i], 0, 5);
  //todayと前5桁が同じ場合、メッセージを格納
  if ($today == $date1){
    $message = substr($filelist[$i], 6);
    break;
  //todayと前5桁が違う場合、次のループへ
  } else {
    $i++;
  }
}

// Twitter接続
$connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
// ツイート
$result = $connection->post("statuses/update", array("status" => $message ));
//レスポンス確認
var_dump($result);
~~~

## Python
 - Tweepy
 - python-twitter
 - TwitterAPI

などが利用可能なようだが、今回使用したのは、Tweepy。（`pip install tweepy` などでインストール可能）
data.txtを用意し、ランダムな1行を読み取り、tweetする。

~~~tweet.py
import tweepy
import random

consumer_key = 'KEYを設定'
consumer_secret = 'KEYを設定'
access_token_key = 'KEYを設定'
access_token_secret = 'KEYを設定'

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token_key, access_token_secret)
api = tweepy.API(auth)

# data.txtファイルを"読み込みモード"で開く
file_data = open("./data.txt", "r", encoding="utf-8_sig")
# それぞれの行をまとめて取得する
lines = file_data.readlines()
# 取得した行(要素)数をカウント
count = len(lines)
# 要素数の範囲内でランダムの数を設定
number = random.randrange(count)
# 開いたファイルを閉じる
file_data.close()

# ツイートする
api.update_status(lines[number])
~~~

## Node.js

 - `npm install twitter` にてインストール。
 - list.txt の前001-365の文字を書いておき、プログラムにて生成したランダム数の文をtweetする。
 - 下記のようなリストTEXTを用意(名言集)

![list2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/6f1a9e3b-93ce-e071-2064-4eb975c72247.jpeg)

~~~ tweet.js
var twitter = require('twitter');
var fs = require('fs');
var readline = require("readline");

var client = new twitter({
    consumer_key        : "Your Key",
    consumer_secret     : "Your Key",
    access_token_key    : "Your Key",
    access_token_secret : "Your Key"
});

//ランダム数字乱数の生成
var min = 001;
var max = 365;
var num = Math.floor( Math.random() * (max + 1 - min) ) + min;  //範囲内での数字をセット
var num = ('000' + num ).slice( -3 );                             //ゼロパディング

//テキストファイルの読み込み
var text = fs.readFileSync("./list.txt"); // UTF-8がデフォルトなので指定は不要
var lines = text.toString().split('\r\n');  // この区切り文字はOSによって異なるので注意

//ランダム数字の行のテキスト取得
for (var line of lines) {
  if (line.slice(0, 3) !== num) continue;
  var msg = line.slice(4,100);
}

//tweet post
client.post('statuses/update', { status: msg }, function(error, tweet, response) {
  if(error) throw error;
  console.log(tweet);     // Tweet body.
  console.log(response);  // Raw response object.
});
~~~

## Google Script

 - Google Scriptだと定期処理の設定もできる。また、スプレッドシートと連携もできるので、とても便利。
 - 下記のようなGoogle scriptを用意(名言集)し、ランダムにtweet文を取得

　【参考】
　　Google Apps Script で Twitter を使ってみる
　　　https://qiita.com/Ikanogo/items/1dce33c26559eac56a03
　　Google Apps Script で Spreadsheet にアクセスする方法まとめ
　　　https://qiita.com/negito6/items/c64a7a8589faaffcfdcf
　　google apps script + twitter api 【001】タイムラインの取得とツイート
　　　http://thetree.hatenadiary.jp/entry/google_apps_script_twitter001


![list3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167772/903b929f-6258-40a0-161f-dd9db1076c9d.jpeg)

~~~js
// OAuth1認証用インスタンス
var twitter = TwitterWebService.getInstance(
  'CONSUMER_KEYをセット',
  'CONSUMER_SECRETをセット'
);

// 認証を行う（必須）
function authorize() {
  twitter.authorize();
}

// 認証をリセット
function reset() {
  twitter.reset();
}

// 認証後のコールバック（必須）
function authCallback(request) {
  return twitter.authCallback(request);
}

// シートを取得「シート1」はシート名
var spreadsheet = SpreadsheetApp.openById('キーを設定する');
var sheet = spreadsheet.getSheetByName('シート1');

// ツイートを投稿
function postTweet() {
 var tweet = getTweet()
 var service  = twitter.getService();
 var response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
   method: 'post',
   payload: { status: tweet }
 });
}

// ツイート内容の取得(Google スプレッドシートにA1-A492にtweet文をセットしてある)
function getTweet() {
 var tweets =sheet.getRange("A1:A492").getValues();
 var tweet = tweets[Math.floor(Math.random() * tweets.length)];
 Logger.log(tweet)
 return tweet;
}
~~~

## まとめ
 - プログラムの実行環境、定期実行の実施も考慮にいれて、言語を選択するとよいかと思います。
 - プログラミング言語の基礎を学ぶとコンソールやブラウザ表示といったローカルの結果表示になりがちなので、tweetも合わせて実施すると学習意欲が湧くかなと個人的には思います。