LoginSignup
20
24

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-04

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
24