【2021年11月版】TwitterBotの作り方【開発編】

Twitter
スポンサーリンク

前回は、Bot開発の準備まで行いましたので、
ここからは、実際にサーバ上でBotを稼働させるまでをご紹介します。

なお、今回はすでに作成済みのBotをもとに紹介いたします。
画像が手順とは異なる場合がございますので、ご了承ください。

ユーザの作成・パーミッションの設定は、各自の環境に合わせて設定してください。

環境などはこちら

サーバCentOS Linux release 7.8
その他Node.js
Twitter APIモジュール
Postgres モジュール

環境準備

ディレクトリの作成

まずは、Bot用のディレクトリを作成しておきましょう。

mkdir /home/Twitter/

Node.js

以下のコマンドにて、Node.jsをインストール

yum install nodejs

確認方法

node -v

Twitterモジュール

ディレクトリを変更

cd /home/Twitter/

Twitterモジュールをインストール

npm install twitter

カレントディレクトリに以下が作成されていれば完了

Postgresモジュール

DBは、PostgreSQLを使用しますので、
Posgres用のモジュールもここでインストールします。

npm install pg

node_modulesディレクトリに、以下のようなpg~ディレクトリが追加されていれば完了です。

Twitter Developer Platform

Twitter Developer Platformへアクセス

Use Cases, Tutorials, & Documentation
Publish & analyze posts, optimize ads, & create unique customer experiences with the X API, X Ads API, & X Embeds.

Project & Apps → Overview より、プロジェクトを作成します。

プロジェクトの作成

プロジェクト名を入力し、

プロジェクト名

Making a bot を選択し、

Bot作成を選択

プロジェクトの説明を記入し、

プロジェクトの説明

アプリ環境を選択し、

選択
  • Development
    • For new work and in progress features
      • 新しい作業および進行中の機能の場合(開発中)
  • Staging
    • Used to test out changes
      • 変更をテストするために使用されます(テスト中)
  • Production
    • Used for live products
      • ライブ製品に使用(リリース)

アプリ名を入力し、

アプリ名

ここでAPIキーが発行されます。
それぞれわかるようにメモしておきましょう。

メモしたら、を押して完了しましょう。

続いて、AccessToken キーを取得します。

「Project & Apps」より作成したAppを選択し、下のほうにある「Access Token and Secret」項にて、 を選択し、キーを生成してください、

Generate

生成されたキーは、必ずメモしておきましょう
Botのプログラムに記述します。

開発

メインプログラム

まずは、JavaScriptファイルを用意しましょう。

vim bot.js

必要なものだけ、先に定義しておきましょう。
以下の内容をファイルに記述し、保存します。

require('dotenv').config();
const twitter = require('twitter');
const { Client } = require('pg')
const client = new twitter({
    consumer_key: process.env.CONSUMER_KEY,
    consumer_secret: process.env.CONSUMER_SECRET,
    access_token_key: process.env.ACCESS_TOKEN_KEY,
    access_token_secret: process.env.ACCESS_TOKEN_SECRET
});
function dbConnection(){
    return new Client ({
        user: "DBユーザ",
        password: "DBパスワード",
        host: "DBホスト(もしくはIPアドレス)",
        port: "DBポート",
        database: "DB名"
   });
}

以下のコマンドで保存し、Viエディタを終了しておきます。

:qw

Twitter APIキーを設定

以下のコマンドにて、.envファイルを作成します。

vim .env

上記までに取得したキーを以下の通りに設定します。

CONSUMER_KEY="API Key"
CONSUMER_SECRET="API Key Secret"
ACCESS_TOKEN_KEY="Access Token"
ACCESS_TOKEN_SECRET="Access Token Secret"

以下のコマンドで保存し、Viエディタを終了しましょう。

:qw

Tweet方法

以下がtweetするプログラムの一部になります。

var proc = async function() {
    // メッセージ生成
    var text = 'テスト Tweet';

    // ツイート
    client.post('statuses/update', { status: text },
        function(error, tweet) {
            console.log(tweet);
        }
    );
}
proc();

DBから取得した情報をtweet

var proc = async function() {
    var clientDb = dbConnection();
    clientDb.connect();
 
    // DBよりデータ取得
    var result = await selectDatabase( clientDb );
  
    // DBより取得したデータを、メッセージにセット
    var text = '';
    for( int i = 0; i < result.length; i++ ){
        text += reuslt[i].id + ":" + result[i].value + '\n';
    } 
   
    // 取得した内容をtweetする
    client.post('statuses/update', { status: text },
        function(error, tweet) {
            console.log(tweet);
        }
    );
}
procc();

/* DBよりデータ取得関数 */
async function selectDatabase( clientDb ){
    var ret_array = [];
    const query = "SELECT id, value FROM SAMPLE_TABLE";
      
    await clientDb.query(query)
    .then( res => {
        for( var i = 0; i < res.rows.length; i++ ){
            var record = {
                "id" : res.rows[i].id,
                "value" : res.rows[i].value
            }
            ret_array.push(record);
        }
    })
    .catch( e => {
         console.log("error");
         throw e;
    })
    return ret_array;
}

最終形態

require('dotenv').config();
 const twitter = require('twitter');
 const { Client } = require('pg')
 const client = new twitter({
     consumer_key: process.env.CONSUMER_KEY,
     consumer_secret: process.env.CONSUMER_SECRET,
     access_token_key: process.env.ACCESS_TOKEN_KEY,
     access_token_secret: process.env.ACCESS_TOKEN_SECRET
 });
 function dbConnection(){
     return new Client ({
         user: "DBユーザ",
         password: "DBパスワード",
         host: "DBホスト(もしくはIPアドレス)",
         port: "DBポート",
         database: "DB名"
    });
 }
 var proc = async function() {
     // DBコネクション
     var clientDb = dbConnection();
     clientDb.connect();

     // DBよりデータ取得 
     var result = await selectDatabase( clientDb );
 
     // DBより取得したデータを、メッセージにセット 
     var text = ''; 
     for( int i = 0; i < result.length; i++ ){
          text += reuslt[i].id + ":" + result[i].value + '\n';
     }

     // 取得した内容をtweetする 
     client.post('statuses/update', { status: text },
          function(error, tweet) {
             console.log(tweet);
          }
     );
 }
 procc();

 /* DBよりデータ取得関数 */
 async function selectDatabase( clientDb ){
     var ret_array = [];

     // SQL
     const query = "SELECT id, value FROM SAMPLE_TABLE";

     // SQL実行
     await clientDb.query(query) 
     .then( res => {
        // 取得分ループ
         for( var i = 0; i < res.rows.length; i++ ){
              var record = {
                   "id" : res.rows[i].id,
                   "value" : res.rows[i].valu 
              }

            // 取得データを変数へセット
              ret_array.push(record);
         }
     })
     .catch( e => {
          console.log("error");
          throw e;
     })
     return ret_array;
 }

起動設定

ログ出力

以下のコマンドで、ログディレクトリを作成しておく

mkdir log

起動シェル

起動するのが面倒なので、シェルで実行させる

vim start.sh

内容は以下の通り

#!/bin/sh
/usr/local/bin/node /home/Twitter/bot.js >> /home/Twitter/log/out.log 2>> /home/Twitter/log/error.log &

自動起動

定期的にTweetされるよう、以下のコマンドでcronへ登録する

crontab -e

設定値
(今回は、毎日18:00に起動するようセット)

0 18 * * * /home/Twitter/start.sh >> /home/Twitter/log/cron.log

以下のコマンドで保存して、cronエディタを終了する

:qw

以上で、一通りの設定が完了です。
実際にテストする際には、cronからではなく、/home/Twitter/start.sh を実行することで、
作成したアカウントでtweetされていることが確認できるかと思います。

なお、本ページで解説した内容は、実際に稼働しているものの一部を抽出し、
カスタマイズしたものになります。

これ自体での稼働確認はしておりませんので、
万が一不具合がございましたらご連絡ください。

コメント

タイトルとURLをコピーしました