brown water

ゲームやアニメの感想とかプログラムとか

さくらのVPSに挑戦2(プログラム実行編)

前回VPSの環境を整えたので、今回は実行するプログラムを作っていきます。

作るプログラム

PHPで定期的にTwitterのトレンドを取得して、データベースに保存するプログラムです。
TwitterAPIを使うためにアカウント、アクセスキー等を取得する必要がありますが、方法は割愛します。

データベースの作成

今回はtwget_dbというデータベースを作り、twtrendというテーブルを作ってその中にデータを入れていきます。

mysql -u root -p

でログイン

create database twget_db;
grant all on twget_db.* to twuser@localhost identified by 'paSS%888';

↑twuserは適当なユーザー名、byの次の文字列はパスワード設定です。
これで、twuserがtwget_dbにアクセス出来るようになりました。
次にテーブルの作成

use twget_db
create table twtrend (
    name text,
    day datetime
);

トレンドで取得した単語と日時を格納するテーブルです。
一旦exitで抜けて、

mysql -u twuser -p twget_db

でログインします。
先ほど作ったtwuserでログイン出来ました。
後で確認するためにこれは開いたままにしておきます。

PHPの作成

TwistOAuthという、TwitterAPIから取得するために便利なライブラリを用意します。
github.com ダウンロードした中にある、「TwistOAuth.phar」というファイルを使います。

設定用の値は後で使い回すため、config.phpにまとめておきます。
CONSUMER_KEY等はTwitterで取得した値を入れます。
DB_〜は今回設定したデータベース名、ユーザー名、パスワードです。

//config.php
<?php
define('CONSUMER_KEY', 'xxxxx');
define('CONSUMER_SECRET', 'xxxxx');
define('ACCESS_TOKEN', 'xxxxx');
define('ACCESS_TOKEN_SECRET', 'xxxxx');

define('DB_DATABASE', 'twget_db');
define('DB_USERNAME', 'twuser');
define('DB_PASSWORD', 'paSS%888');
define('PDO_DSN', 'mysql:dbhost=localhost;dbname='.DB_DATABASE);
//twtrend.php
<?php
require_once('config.php');
require_once('TwistOAuth.phar');

$connection = new TwistOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

try {
    $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $params = ['id' => '1110809', 'exclude' => 'hashtags'];
    $tweets = (array) $connection->get('trends/place', $params);
    
    #日時を変換
    $day = date('Y/m/d H:i:s', strtotime($tweets[0]->created_at));
    
    foreach($tweets[0]->trends as $tweet) {
        $stmt = $db->prepare("insert into twtrend (name,day) values (?,?)");
        $stmt->execute([$tweet->name, $day]);
    }
    
} catch (PDOException $e) {
    echo $e->getMessage();
    exit;
}

APIにある「trends/place」を使って取得しています。
id 1110809は日本、exclude hashtagsはハッシュタグを除くという設定です。

syncer.jp ここのページを見ると他にも応用が出来ると思います。

ラブライブ!コラボキャンペーン

PHPからMySQLに接続するPDOに関しては、ドットインストール等を参照して下さい。
今回作成したconfig.php、twtrend.phpと、ライブラリのTwistOAuth.pharを転送ツールでアップロードします。
FileZillaというソフトを使いました。
アップロード先は/var/www/html/の中です。
アップロードしたら、ブラウザからIPアドレスを入力し、
xxx.xxx.xxx.xx/twtrend.php
でアクセスすると起動します。

今回は取得して書き込むだけのため、画面には何も表示されません。 先ほど開いておいたmysqlの画面で、

select * from twtrend;

を実行して内容が表示されれば成功です。
f:id:chaz4:20180212194401j:plain 短時間で何度もPHPを実行すると同じ内容がどんどん追加されていってしまいます。

delete from twtrend;

でテーブルの中身を空にすることが出来ます。

crontabで定期実行

トレンドを一定時間ごとに取得したいので、crontabを使います。
サーバーにログインした状態で、

crontab -e

でファイルを開き、記述していく。

*/10 * * * * /usr/bin/php /var/www/html/twtrend.php

左端が「分」で、今回は10分ごとに実行します。
phpファイルの実行には /usr/bin/php の記述が必要なようで、その後に実行したいファイル名を書いていきます。
保存して抜けた後、

service crond restart

で有効にしておきます。
これで10分ごとに先ほどのプログラムが実行されて、データベースに書き込まれるはずです。

表示用ファイルの作成

ブラウザから見るためのファイルを作っていきます。
単に全件取得してulタグの中に入れていくだけです。
そのままだと見づらいので、cssも設定してみました。

//puttrend.php
<?php
require_once('config.php');

$twdata = '';

try {
    $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $db->query("select * from twtrend");
    $twdata = $stmt->fetchAll(PDO::FETCH_ASSOC);

} catch (PDOException $e) {
    echo $e->getMessage();
    exit;
}
?>

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="utf-8">
   <title>tw trend</title>
   <link rel="stylesheet" href="tw.css">
</head>
<body>
    <ul>
        <?php
            if($twdata) {
                foreach ($twdata as $tweet) {
                    echo "<li><span class='name'>".$tweet['name']."</span><span class='day'>(".$tweet['day'].")</span></li>";
                }
            }
        ?>
    </ul>
</body>
</html>

f:id:chaz4:20180212194822j:plain

無事にブラウザからも表示することが出来ました!
今回は単にそのまま表示するだけでしたが、SQL文を変えると単語を集計して多い順に並べて表示する等も簡単に出来ます。


Amazon.co.jpアソシエイト