gaggitのブログ

コーディング、ガジェット、TIPS関連、FX

Perl でFusiontablesに自動アクセス

Perlを使用して、ようやくFusiontablesへの自動接続に成功しました。下記が、サンプルコードです。前提条件としては、なんらかのWebサーバのアプリをインストールする必要があります。

サンプルコード

use utf8;
use Encode;
use JSON;
use Time::Local;
use IO::Handle;
#Oauth2
use Google::API::Client;
use Google::API::OAuth2::Client;
use WWW::Scripter;

open(FD,"> D:\\temp\\log.txt");
# OAuth generate uri
my $auth = Google::API::OAuth2::Client->new({
auth_uri => "https://accounts.google.com/o/oauth2/auth",
token_uri => "https://accounts.google.com/o/oauth2/token",
client_id => "Google APIのクライアントID",
client_secret => "Google APIのクライアント シークレット",
redirect_uri => "http://127.0.0.1:8080",
auth_doc => {
oauth2 => {
scopes => {
"https://www.googleapis.com/auth/fusiontables"
}
}
}
});
# Oauth2 execute
my $mech = WWW::Scripter->new(
autocheck=>1,
show_progress=>1 # prints to stderr
);
$mech->get($auth->authorize_uri);
print(FD "mech->content1=".$mech->content."\r\n");
$mech->submit_form(
fields=>{
Email=> 'Emailアドレス'
}
);
print(FD "mech->content2=".$mech->content."\r\n");
$mech->submit_form(
fields=>{
Passwd=> 'Emailアドレスのパスワード'
}
);
$mech->follow_link(
n=>1
);

# browser
$uri=$mech->uri;
$option=" -new-tab \"$uri\"";
system('"C:\\Program Files\\Mozilla Firefox\\firefox.exe "', $option);

sleep 30;
open(FDL,"< "webサーバのログファイル名を指定");
my ($sentence, $temp, $code);
while($sentence = <FDL>){
($temp,$code) = ($sentence =~ /^(.*code=)(.*)/);
}
if (substr($code,-1,1) ne "#"){
$code = $code."#";
}
$auth->exchange($code);
# Service
my $client = Google::API::Client->new;
my $service = $client->build('fusiontables', 'v2');
my $body = {
'tableId' => 'fusiontablesのId'
};
my $res = $service->column->list(body=>$body)->execute({
"auth_driver" => $auth});
my @column_list;
for $item (@{$res->{items}}){
push @column_list, $item;
}
for my $column (@column_list){
$column_name=$column->{name};
print(FD "column_name=$column_name\r\n");
}

 

簡単にコードの説明をすると、Google::API::OAuth2::Clientで認証URLを作成しています。

次にWWW::Scripterで認証URLを実行し、Emailアドレス認証画面(submit_form)でEmailアドレスを自動入力、follow_linkでhtmlのhrefが記述されているURLを取得しています。

3番目に先ほどのURLを引数に指定してブラウザ(Firefox)を起動します。

4番目にWebサーバーのログを取得し、アクセストークン用のcodeを取得しています。

最後にGoogle::API::Clientを使用して、Fusiontablesをアクセスし、カラム名を表示しています。

 

p.s.

Webを操作するのに当初、WWW::Mechanizeのモジュールを使用していましたが、JavaScriptが記述されているhtmlでは動作しないことが判明し、次にWWW::Mechanize::Firefoxで試行しました。このモジュールはMechanizeから派生したモジュールですが、単体では動作せず、FirefoxにMozReplプラグインをインストールし、さらにメニュー「ツール」「MozRepl」「start」を実行しないと動作しないので、プログラミングを途中で断念しました。

次にWWW::Scripterモジュールで試行し、とりあえずFusiontablesにアクセスするのに成功しました。このモジュールもMechanizeから派生したモジュールです。

最後に2,3日前に見つけたモジュールNet::Google::DataAPI::Auth::OAuth2を使用すると、認証URLの作成からアクセストークンの取得まで簡単にやってくれそうです。時間があったら、こちらも試したいと思います。

 

参照サイト

Net::Google::DataAPI::Auth::OAuth2 - search.cpan.org