Perlの最近のブログ記事

ついこの間作ったGoogleWebmasterツールのレポートを定期的に取得するPlaggerプラグインを、ちゃんとデータセンターのホストでcronで動かし、かつレポートの先もサーバー上のDBとか静的ファイルに書き出しておくのが良かろう(将来的にも)、と思って作業してた。

普通に、そのホストにPlaggerを入れて、テキトーなRSSをgmailに送って、というテストに成功したまでは良かったんだけど、いざ動かしてみるとまったく動かない。
あれ、おかしいと思って普通のperlスクリプト版の方で試してみたらこちらも動かない。

follow_link(): Can't call method "url"

こんなエラーが出て、途中で処理が止まる。

「は。何これ?」

仕方がないのでエラーメッセージでググったら、既にバグレポートが上がってたんだけど、

http://code.google.com/p/www-mechanize/issues/detail?id=113

This will be fixed in 1.62.

ちょっwww
まじっすかwwww

WWW::Mechanizeの最新版は1.60。Plagger入れる時に依存関係のあったモジュールもCPANでアップデートしたので、そのまま何の疑いも持たずに1.60をいれたけどダメだったんですね。
ちなみに僕が作業で使っていたマシンにインストールしてあったバージョンは1.34。
なので、とりあえずMechanizeの古めのものを使えばよさげな感じ。


と、ここまで突き止めて今日は時間切れ。
一旦は確実に動作する(はず)の1.34を入れてみて、1.60との差分を見ながら「動くはず」のバージョンを試すってのが良いのかな?

Googleウェブマスターツールが提供してくれる情報を、いちいち管理ツールにログインすることなく、定期的に自動取得したいのでPerlでこんなコードを書いてテストしてみた。

#!/usr/bin/env perl

use strict;
use WWW::Mechanize;
use Data::Dumper;
use FileHandle;
use Net::SMTP::OneLiner;

$Data::Dumper::Indent = 1;

my $url = 'https://www.google.com/accounts/ServiceLogin?service=sitemaps&passive=true&nui=1&continue=https%3A%2F%2Fwww.google.com%2Fwebmasters%2Ftools%2F&followup=https%3A%2F%2Fwww.google.com%2Fwebmasters%2Ftools%2F&hl=ja';
my $user_id = 'MY_GOOGLE_ACCOUNT';
my $user_password = 'PASSWORD';

sub message { print @_; }
sub abort { &message(@_); exit 8; }

# get top page
my $mech = WWW::Mechanize->new();
$mech->agent_alias( 'Mac Mozilla' );

my $response = $mech->get($url);
&abort(Dumper($response)) unless ($mech->success);


#login
$mech->form_number(1);
$mech->set_fields('Email' => $user_id, 'Passwd' => $user_password);
$response = $mech->submit;
&abort(Dumper($response)) unless ($mech->success);


# move to the page
$response = $mech->follow_link(text => 'blog.somethingnew2.com');
&abort(Dumper($response)) unless ($mech->success);


# move to detail page
$response = $mech->follow_link(url_regex => qr/top-search-queries/i);
&abort(Dumper($response)) unless ($mech->success);


# get top-search-queries-csv
$response = $mech->follow_link(url_regex => qr/top-search-queries-dl/i);
&abort(Dumper($response)) unless ($mech->success);

print ("$response\n");

詳細ページの表示は問題なし。CSVのデータもダウンロードできそうだ。

TODO:
Plaggerのプラグインにして、メール送信はP::P::P::Gmailとかで送るようにする。
→ ウォッチ対象のURLと、レポートの送り先をPlaggerの設定ファイル(.yaml)で管理するようにしたい
プラグインにするベースは AmazonAssociateReportJP.pm あたりを参考にすれば案外簡単にできそうだ。
Yahoo!サイトエクスプローラーのデータも自動取得するものも作らないと。
うごいた。
#!/usr/bin/perl
use WWW::Google::PageRank;
use Net::SMTP::OneLiner;

$PROXY = 'http://example.com:8080';
$Net::SMTP::OneLiner::HOSTNAME = "smtp.example.com";
$target_file = './pagerank_target.txt';
$mail_body = "URL\tPageRank\n";

$pr = WWW::Google::PageRank->new(proxy => $PROXY);

open IN, $target_file or die 'Open failed!';
while ($input = ){
    chomp($input);
    $result = scalar($pr->get($input));
    sleep(5);
    $mail_body .= $input . "\t" . $result . "\n"
}
close IN;

send_mail('me@example.com', 'you@example.com', "Google PageRank", $mail_body);


とりあえずデスクに置いてあるマシンでスケジューラーに登録しておこう。
送信頻度は嫌がらせのように毎週とかでいいかな?

【追記】
ドメインをexample.comに修正した
そんなに毎日変動するものではないので、Google Tool Barをインストールしたブラウザで定期的にヲチしりゃいいんじゃね?
とか思うけど、まぁそこはオトナの事情で(以下ry
面倒なのでperlでスクリプト書いてしまってcronに登録してしまい、月曜日の朝にメールで送るとかにしてみよう。
CPAN探したら、そのものずばりのモジュールが有ったので、これで仕事の8割は完了したも同然。
cpanのシェルを起動して
install WWW::Google::Pagerank
で一発でインストールできたよ。
インスタンス作る時にプロキシの設定ができるようなので、こんなコードを書いたらランクが取得できた。
% cat ./pagerank.pl
use WWW::Google::PageRank;
my $pr = WWW::Google::PageRank->new(proxy => 'http://proxy.mycompany.co.jp:8080/');
print scalar($pr->get('http://blog.somethingnew2.com')), "\n";
この結果と対象URLをタブ区切りとかにして、Net::SMTP::OneLinerで送ればOKそう。
やってみよう。

Google検索したら自分のblogがヒットして、記憶力の足りなさを痛感した。

サーバーの管理権限(Linuxの場合はroot権限)があれば、セットアップスクリプトのconfigure.plがよろしく取り計らってくれるので、AWStatsは簡単にセットアップできる。設定ファイルも/etc/以下に配置されるファイルをviとかで編集すればいいので、これまた特に難しいこともない。

逆にroot権限がないと、デフォルトの場所に配置できなかったり、設定ファイルを配置する場所への書き込み権限がなかったりしてちょいと面倒。うぎゃー。
しかも、かなりの数のドメインのログを集計しないといけないので、設定ファイルの管理が煩雑になりそうだ。

awstats.plと同じ階層に設定ファイルを置いておく、といくのもアリだけど、それもまたビミョーだったので
・awstats.plはWEBから見れるディレクトリ(DocumentRoot/cgi-bin)に配置、.htaccessを編集して.plにCGI実行属性をつける
・設定ファイルはWEBから見えない場所($HOME/statsconf.dとか)に配置
ってな具合で運用してみることにした。

AWStatsは、実行時に設定ファイルを
・awstats.plと同じディレクトリ
・/usr/local/etc/awstats
・/etc
・/etc/awstats
・/etc/opt/awstats
このディレクトリから探すので、これを定義している配列 @PossibleConfigDir に$HOME/statsconf.dを追加したら動くようだ。
# AWStats-6.9の1644行目

@PossibleConfigDir = (
"$DIR", "/etc/awstats",
"/usr/local/etc/awstats", "/etc",
"/etc/opt/awstats",
"/home/hoge/statsconf.d" # ←追加
);

うーん、これもびみょーかなぁ。。。
もうちょっとエレガントに管理する方法はないものだろうか・・・。

2008年12月に参加させてもらったLenovo ideapad タッチ&トライブロガーイベントで触ったLenovoIdeaPad、モニター機が手元に届きました。

手元に到着したのは2/14ですけど、週明けの月曜日からまともに試用し始めました。
レビューの機会をご提供いただいたLenovoさん、アジャイルメディアネットワークスさん、どうもありがとうございます。

PlaggerにはCustomFeed::SVNLogというモジュールが付属しているので、ありがたく使わせてもらおうと思ったら、perlモジュールのSVN::Coreが足りない、とエラーになった・・・。

% plagger -c ./svn2twitter.yaml
Can't locate SVN/Core.pm in @INC

なのでCPANからSVN::Coreをインストールしようと思ったが、SVN::CoreはCPANには登録されていないそうなので、インストールは少々やっかい
(参考:ぶらぶら日記: SVN::Core をインストールする

さらに僕がPlaggerを動かしているのはDreamhostだったりするので、SVN::Core dreamhostでぐぐったInstalling SVK on Dreamhost - Dev411: The Code Wikiというドキュメントも発見!(英文です)

参考にさせてもらいながら早速作業をしたので、メモ。


まずは大前提として、DreamhostでちゃんとCPANが使えるようになっていること。これはPlaggerを入れた時点でクリアしているはずなんだけど、今一度コチラのページを確認しておくと良いです。
特にPERL5LIBを正しく設定してexportされていること、また$HOME/local/share/perl/ディレクトリが存在していて、ちゃんとPERL5LIBに含まれていることが超重要です。


以下、SVN::Coreを入れるための方法。

(1-1) swigの取得、configure
Dreamhostにはデフォルトで/usr/bin/swigにswigが入っているが、最初っからインストールされている/usr/bin/perlを使うように設定されているっぽい。DreamhostにPlaggerをインストールする時点で$HOME/local/bin/perlに5.8.8を入れているので、そちらを見てくれるようにswigも新規に$HOME/local/にインストールする。

一応、元々入っているswigとバージョンを合わせる為に1.3.24にしてみた。
(最新版は1.3.33)

% wget http://downloads.sourceforge.net/swig/swig-1.3.24.tar.gz
% tar zxf ./swig-1.3.24.tar.gz
% cd ./SWIG-1.3.24
% ./configure --prefix=$HOME/local \
--with-perl5=$HOME/local/bin/perl


(1-2) configure したらインストール
make && make install でオK
ここは特に問題ないはず。$HOME/local/bin/swigができる。

タイトルのまんま。
前回、しょこたん☆ぶろぐの更新情報をGoogle Calendarに入れるってのができたので、今回はTV番組情報をLivedoor番組表から取得して、Google Calendar APIで更新かけてみる。

アイディアソースは [Plagger] テレビ番組表を Plagger で #2 - Bulknews::Subtech - subtech

結論から言うと、コアの部分はサクッとできた。

けど、今のやりかたじゃぁ色んな所が決定的にダメ。あー、ダメなんじゃなくて、需要を満たせてない、が正しいか。
いずれにしても対応するのには今の僕の知識と技術では結構時間がかかりそう。
すぐできると思ったんだけどなぁ。。。誰かいいアイディア・方法を教えてplease...(突っ込みコメント、TB歓迎!!)

ということで、ここまでのやり方と対応詳細は以下の通り。

コメントで「翻訳して」と言われたので、モジュール書いた。
ファイルをダウンロード


言うまでもなく100%ネタなので、動作確認とか一切してません。ご利用は自己責任で。

オリジナルは↓これ。
http://plagger.org/trac/browser/trunk/plagger/lib/Plagger/Plugin/Filter/Kansai.pm

自作しちゃったプラグインでしょこたん☆ぶろぐGoogle CalendarにPOSTするテストですが、PlaggerSubversionリポジトリにあがってるGoogleCalendar.pmモジュールでも動く、ってのを確認しました。

一応yamlだけ貼っておきます。
ファイルをダウンロード

自作プラグインで動作していたものを、リポジトリ上のものに置き換えたので以下を直そうかと。
・予定のタイトルにいちいちfeed titleが入るのは邪魔じゃ → 消す
・終了時刻をなんとかして渡せるようにする
この修正したら、Livedoor番組表からの情報をGoogle Calendarに差し込んでみたい。

さて、寝るか。

このアーカイブについて

このページには、過去に書かれた記事のうちPerlカテゴリに属しているものが含まれています。

前のカテゴリはpalmです。

次のカテゴリはphoneです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 6.1.2