読者です 読者をやめる 読者になる 読者になる

itochin2の日記(仮)

主に備忘録。Perl、MySQL、Unity、開発管理などについて情報を残していきたい。

perlのNet::Twitterでアイコン変更する

「木曜日はラーメンの日」って話をしてたら
「木曜日になったらtwitterのアイコンをラーメンに変えようぜ」
って言われたのでperlで作った。

Net::Twitterを使うと、恐ろしく簡単に実装できる。


OAuth認証を通すために必要な"consumer_key"とかは、アプリケーションの登録が必要。
登録は↓を見ればできる。
TwitterのOAuth認証を使う
(前にUnityとTwitterを連携した時のヤツをそのまま流用〜)


そしてモジュールの実装

#!/usr/bin/env perl

use strict;
use warnings;
use Net::Twitter;
use Data::Dumper;
use utf8;

my $nt = Net::Twitter->new(
	traits => [qw/API::RESTv1_1/],
	consumer_key => 'xxxxxxxx',
	consumer_secret => 'xxxxxxxx',
	access_token => 'xxxxxxxx-xxxxxxxx',
	access_token_secret => 'xxxxxxxx',
);
#my $result = $nt->update("twitter api test");
#my $result = $nt->update("日本語 実験");
#print Dumper $result;
#my $result = $nt->update("![*](*)!");
#print Dumper $result;
if ($ARGV[0] == 1) {
	# 木曜日の処理
	$nt->update_profile({
		name => 'itochin@今日はラーメンの日',
	});
	$nt->update_profile_image([ "./ramen.png" ]);
	#print Dumper $result;
	$nt->update("本日は合法ラーメンの日です!!");
} else {
	# 金曜日の処理
	$nt->update_profile({
		name => 'itochin',
	});
	$nt->update_profile_image([ "./normal.png" ]);
	$nt->update("合法ラーメンの日は終了しました。また来週までさようなら。");
}

ラーメンアイコンに変更して、名前を変える処理と元に戻す処理を
引数の0 or 1で雑に判断する作戦。
あと「use utf8」を付けないと、日本語が化ける。
Net::Twittertwitter APIと同じ名前のメソッドが実装されているので分かりやすい。


そして作ったモジュールをcronで動かせばいいやと思ったんだけど
ココが一番ハマった。

最初はこんな感じにcronに登録したけど、動かない。

5 0 * * 4  perl /Users/itochin/work/dev/perl/twitter_api/twitter_api.pl 1
5 0 * * 5  perl /Users/itochin/work/dev/perl/twitter_api/twitter_api.pl 0

調べた結果、cronで実行する時はperlbrewの環境変数が設定されていないらしい。
[参考サイト]
cronでperlbrewなPerlを使う際の設定メモ

「cron perl 動かない」っていう馬鹿みたいな検索ワードでググった


そして最終的にはこうなった。

5 0 * * 4 PATH="/Users/itochin/perl5/perlbrew/perls/perl-5.14.4/bin:$PATH" perl /Users/itochin/work/dev/perl/twitter_api/twitter_api.pl 1
5 0 * * 5 PATH="/Users/itochin/perl5/perlbrew/perls/perl-5.14.4/bin:$PATH" perl /Users/itochin/work/dev/perl/twitter_api/twitter_api.pl 0

これで毎週木曜日と金曜日の0:05にちゃんとスクリプトが動く。
0:05なのは、日付変更の瞬間にトラフィック増やして、万が一、
障害引き起こす原因の一つになったら非常に申し訳ないと思ったから。

次の課題は、macがスリープモードだと動かないので、そこをどうするかだなー。