はてな自動投げ銭スクリプトをはてなブログbetaに対応させた
スポンサードリンク
昨日書いた、
HTML::AccountAutoDiscoveryがはてなブログbetaに対応していない件
で、HTML::AccountAutoDiscoveryを使わなければよくね? 的なアプローチではてなブックマークWebHook用投げ銭スクリプトがこちらとなります。
Filename: throw.cgi
#!/usr/bin/perl # throw.cgi ブックマークしたら投げ銭します。 # 説明:http://blog.dtpwiki.jp/dtp/2009/06/web-hook-645b.html # 2009-06-07 ver 0.0.1 ファーストポスト # 2009-10-03 ver 0.0.2 最新のMechでも動くように # 2012-01-26 ver 0.0.3 はてなブログ対応 use strict; use warnings; use CGI; use Config::Pit; use Encode; use HTML::AccountAutoDiscovery; use utf8; use WWW::Mechanize; # 初期設定 my $url_sendpoint = 'https://www.hatena.ne.jp/sendpoint'; my $send_point = 10; # 送信するポイント(はてな手数料別) my $login; my $config = pit_get('hatena.ne.jp'); die "not preset account data in Pit." if !%$config; my $my_id = $config->{id } or die 'id not found.'; my $password = $config->{password} or die 'password not found.'; my $auth_key = $config->{auth_key} or die 'auth_key not found.'; my $q = CGI->new; my $mech = WWW::Mechanize->new; $mech->agent_alias('Windows IE 6'); { # メインルーチン # 認証 if ( $q->param('key') ne $auth_key ) { die "Authentication failed"; } # メソッド確認 if ( $q->param('status') eq 'add' ) { # エントリーの情報 my $req = $q->Vars(); nagesen( $req ); } # はてなブックマークWeb Hook用リザルト print $q->header('text/plain'); print 'ok'; } exit; sub nagesen { my $req = shift; my $url = $req->{url}; my @account = HTML::AccountAutoDiscovery->find( $url ); unless( @account ) { @account = find_hatenablog( $url ); } sub find_hatenablog { my $url = shift; use LWP::Simple; my @r; my $c = get( $url ); $c =~ s/.+(<html.+?>).+/$1/so; if ( $c =~ m{data-admin-domain="http://blog.hatena.ne.jp"} ) { if ( $c =~ m{data-author="(.+)"} ) { push @r,{account => $1, service => 'http://blog.hatena.ne.jp' }; } } return @r; } foreach my $item ( @account ) { my $send_id = $item->{account}; # account name send_hatenapoint( $req, $send_id ); last; # HTMLに複数のIDを埋め込んでいた場合最初の人の分 # だけ対応(同じ人がID埋め込みまくるとポイント # 送信しまくるのを防ぐ) } return; } sub login_hatenapoint { # はてなにログインします $mech->get( $url_sendpoint ); # ログインを促す画面に遷移済 $mech->follow_link( text => mech_encode('ログイン') ); # ログイン画面に遷移済 $mech->set_visible( $my_id, $password ); $mech->submit(); # ログイン済み画面に遷移済 $mech->follow_link( text => mech_encode('こちら') ); # 投げ銭画面に遷移済 $login = 1; return; } sub send_hatenapoint { # はてなポイント送信をします my $req = shift; my $send_id = shift; unless ( $login ) { login_hatenapoint(); } # ログイン済みの状態 $mech->get( $url_sendpoint ); # はてなポイント送信のページに遷移済 # ポイント送信メッセージ組み立て my $send_message = decode('utf8', $req->{title}) ."($req->{url}) をブックマークしました。投げ銭いたします。" .'投げ銭スクリプト:http://svn.coderepos.org/share/lang/' .'perl/misc/hatenabookmark_webhook_nagesen/'; # ポイント送信用パラメータ入力 $mech->set_visible( $password, $send_id, $send_point, undef, # 匿名にしたい場合は1 mech_encode( $send_message ) ); $mech->submit(); # confirm画面に遷移済 return unless $mech->title() eq mech_encode( 'はてな ポイント付きメッセージ送信確認'); # 送信確認ページ? $mech->click_button( value => mech_encode('送信する') ); #open my $fh, '>', 'log.html'; #print $fh $mech->content(); #close $fh; return; } sub mech_encode { # WWW::Mechanize 1.21_01以降の挙動に対応 my $str = shift; if ( ( $WWW::Mechanize::VERSION ) < 1.21 ) { $str = encode( 'utf8', $str ); } return $str; } __END__
2009年10月に一度改定していて、WWW::Mechanizeのバージョンによる差異を吸収していたんだけれども、
M.C.P.C.: はてな自動投げ銭スクリプトを最新WWW::Mechanizeに対応させたが、Mechの動作が変わる境目のバージョンがわからない
その分はCodeReposにコミットするの忘れていたので今回はちゃんとコミットしたよ。
http://svn.coderepos.org/share/lang/perl/misc/hatenabookmark_webhook_nagesen/
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3843
コメントする