Edited at

いろんな言語で 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


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


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

// 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も合わせて実施すると学習意欲が湧くかなと個人的には思います。