Thursday, December 29, 2011
ツイッターボット 電力使用量編
何度何度も言います。Perlなんて書けませんからw
イロイロパクってなんとか動いただけです。
キット余計なモンとか入ってますよw
で。
YahooのAPIでxmlデータとってくるようになってます。
チェックした時刻の10分ぐらい前のデータが最新っぽいので、
最終更新時間は引き算してだしてます。
電力使用率84%以上で投稿を始めます。
95%以上で 電気消そう 的コメントに変更。
そんな感じです。
#!/usr/bin/env perl use strict; use warnings; use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; use Net::Twitter; use XML::Simple; use Jcode; use LWP::Simple; use POSIX qw(ceil); use Time::Local; # Twitter OAuth key and token my $consumer_key = 'my key'; my $consumer_key_secret = 'my key secret'; my $access_token = 'my token'; my $access_token_secret = 'my token secret'; # Twitter OAuth my $nt = Net::Twitter->new( traits => ['API::REST', 'OAuth'], consumer_key => $consumer_key, consumer_secret => $consumer_key_secret, ); $nt->access_token($access_token); $nt->access_token_secret($access_token_secret); # Obtain current power usage from Yahoo! # renew =1 shortest renew (about 5 min). renew = 0 renew in about an hour. my $appid = "app_id"; my $renew = "1"; my $url = "http://setsuden.yahooapis.jp/v1/Setsuden/latestPowerUsage?appid=$appid&latest=$renew"; my $data = get($url) or die("error $!"); # extract content from xml data my ($usage) = $data =~ m{<Usage.*?>(d+)</Usage>}; my ($capacity) = $data =~ m{<Capacity.*?>(d+)</Capacity>}; # calcurate some values # my $rate = sprintf("%.2g", ($usage / $capacity * 100)); my $rate = ($usage / $capacity * 100); my $rate2 = sprintf("%2.2f",$rate); my $usage2 = ceil($usage / 10000); my $capacity2 = ceil($capacity / 10000); # get applox. renewed time(about 10 mits before current time) my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon += 1; $min -= 11; my $renew_date = sprintf("%04d/%02d/%02d",$year,$mon,$mday); my $renew_time = sprintf("%02d:%02d",$hour,$min); # tweet close to Max if the rate is greater than 95% else standard tweet if ($rate2 >= "84.00" and $rate2 <= "95.00") { my $post='【東電 電力使用状況】 実績値なぁーう:' . $usage2 . '万kW' . ' 最大:' . $capacity2 . '万kW' . ' 使用率:' . $rate2 . '%' . ' 最終更新:' . $renew_date . ' ' . $renew_time . 'ごろ'; my $res = $nt->update($post); } elsif ($rate2 >= "95.01") { my $post='【東電 電力使用状況】 ヤバイ ギリギリ!! ちょっと電気消そうよなう:' . $usage2 . '万kW' . ' 最大:' . $capacity2 . '万kW' . ' 使用率:' . $rate2 . '%' . ' 最終更新:' . $renew_date . ' ' . $renew_time . 'ごろ'; my $res = $nt->update($post); } else { exit; } exit;
Monday, December 5, 2011
ツイッターボット お天気編
何度も言います。Perlとか書けませんからw
イロイロパクってなんとか動いただけです。
余計なモンとか入ってる可能性ありですw
で。。。
今日であれば最低気温は表示せず、最高気温表示のみ。
明日 or 明後日であれば最低気温と最高気温を表示。
みたいな感じになってます。
ユーザのcrontabで起動する際に エリアコード と ひにち(today/tomorrow/dayaftertomorrow) を指定します。
例) 横浜の明日の天気
tweet-weather.pl 70 tomorrow >/dev/null 2>&1
例) 東京の今日の天気
tweet-weather.pl 63 today >/dev/null 2>&1
詳細はこちらで:
お天気Webサービス仕様
ごーく マレに文字化けするときがあるのですが、
そもそものデータが地域や時間によって無い場合があるみたいで、
そういうときはウマク動きません。。。データがカラの場合の処理を入れないとダメなんでしょうね。キットw
メンドイのでとりあえずコレで。。。
2011/12/28 追記
といいつつ
カラの場合はついーとしないようにしました。
#!/usr/bin/env perl use strict; use warnings; use utf8; binmode STDIN, ":utf8"; binmode STDOUT, ":utf8"; use Net::Twitter; use LWP::UserAgent; use XML::Simple; use XML::TreePP; use Jcode; # Twitter OAuth key and token my $consumer_key = 'my key'; my $consumer_key_secret = 'my key secret'; my $access_token = 'my token'; my $access_token_secret = 'my token secret'; # Twitter OAuth my $nt = Net::Twitter->new( traits => ['API::REST', 'OAuth'], consumer_key => $consumer_key, consumer_secret => $consumer_key_secret, ); $nt->access_token($access_token); $nt->access_token_secret($access_token_secret); # URL parameters my $area = $ARGV[0]; my $day = $ARGV[1]; # Obtain weather from livedoor weather my $url = "http://weather.livedoor.com/forecast/webservice/rest/v1?city=$area&day=$day"; my $ua = LWP::UserAgent->new(); $ua->agent('Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'); $ua->timeout(10); $ua->env_proxy(); my $res2 = $ua->get($url); $res2->is_success or die 'Can't connect to weather.livedoor.com.'; my $xml = $res2->content; my $data = XMLin($xml); # get area name, weather, and temparatures my $telop=$data->{telop}; my $title=$data->{title}; my $temp_min = $data->{temperature}->{min}->{celsius}; my $temp_max = $data->{temperature}->{max}->{celsius}; # post to twitter. change parameters depending on day if ($day eq "today" and $temp_max ne "") { my $post='【天気予報】' . $title . ' ' . $telop . ' 最高 ' . $temp_max . '度'; my $res = $nt->update($post); } elsif ($day ne "today" and $temp_min ne "" and $temp_max ne "") { my $post='【天気予報】' . $title . ' ' . $telop . ' ' . $temp_min . '度/' . $temp_max . '度'; my $res = $nt->update($post); } else { exit; } exit;
ツイッターボット 切り取り線編
もちろんperlなんて書けないので、イロイロなところからパクってきただけですが、
なんとか動きましたww
これは切り取り線のボットですね。
個人的には意外と便利に思います。
#!/usr/bin/env perl use strict; use warnings; use utf8; use Net::Twitter; use Time::Piece (); use Jcode; # Twitter OAuth key and token my $consumer_key = 'my key'; my $consumer_key_secret = 'my key secret'; my $access_token = 'my token'; my $access_token_secret = 'my token secret'; # Twitter OAuth my $nt = Net::Twitter->new( traits => ['API::REST', 'OAuth'], consumer_key => $consumer_key, consumer_secret => $consumer_key_secret, ); $nt->access_token($access_token); $nt->access_token_secret($access_token_secret); my $now = Time::Piece::localtime->strftime('%H:%M'); printf $now; my $tweet = '<--------------- ' . $now . ' --------------->'; Jcode::convert($tweet, 'utf8'); my $res = $nt->update($tweet); exit;
Thursday, December 1, 2011
cpan upgrade
cpan コンソールに入ります。
$ sudo perl -MCPAN -e shell
なんかコマンドたたいてたら新バージョンがあるでっていわれました。
There's a new CPAN.pm version (v1.9800) available! [Current version is v1.7602] You might want to try install Bundle::CPAN reload cpan without quitting the current session. It should be a seamless upgrade while we are running...
なので、言われたコマンドたたいてみましたよ。
upgradeが終わったらリロード。
cpan> install Bundle::CPAN cpan> reload cpan
しばらーーく 時間がかかりましたが特に問題なくupgradeできましたよ。
終了するならquitね。
cpan> quit