いろんな言語で 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を用意(名言集)
// 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する。
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を用意(名言集)
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
// 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も合わせて実施すると学習意欲が湧くかなと個人的には思います。