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
Perl Google::API::Client 使い方
8/4(金)にGoogle::API::Clientがインストールできた。が、どのようなメソッドがあるかはよく分からないので、まずは、cpansearch.perl.orgのサイトからGoogle::API::Clientのソースを見てみる。23行目あたりに
...'https://www.googleapis.com/discovery/v1/apis/{api}/{apiVersion}/rest'
とあるので、ブラウザで
https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest
と入力してみると、Calendar APIの仕様がJSONで返ってきた。
methodsで検索してみると、中段あたりに以下の様に表示されている。
ということは、
うえちぇこさんのブログで$service->calendarList->list->exectuteの
部分は、このmethodsの上下の部分に該当。これでなんとか、メソッドが分かったので、他のAPIでも応用がききそうです。
次回は、FusionTablesでこの方法でメソッドを利用できるか、やってみます。
参照サイト:
http://cpansearch.perl.org/src/SHIGETA/Google-API-Client-0.14/lib/Google/API/Client.pm
[perl]Google::API::Clientを使ってみた | うえちょこ@ぼろぐ
Perl module インストール 3つの解決方法
PerlでなかなかインストールがOKにならない人のために、メモ書きです。Perlのモジュールをインストールが成功するのに、とりあえず3つほど方法があります。
1つ目には、cpanmをインストールして、cpanの代わりにcpanm(cpanminus)でインストールをしてみる。(前回、記事にしたdmake.exeはcpanmに入っていたもよう)以下は、cpanmのインストール方法。
cpan App::cpanminus
2つ目は、search.cpan.orgのサイトから、前のバージョンのモジュールをダウンロードし、解凍後、「INSTALL」ファイルに従って、手動でインストールしてみる。
3つ目は、cpanmに-Fまたは--forceオプションを使用して、無理やりインストールです。
cpanm --force モジュール名
p.s.
cpanmを導入後、--forceオプションを使用して、ようやくGoogle::API::Clientモジュールのインストールに成功。
dmake インストール 解決
Perlで、モジュールをインストールしようとすると、dmakeがなく、エラーとなります。ネットで検索すると、windowsではMicrosoftから提供されているnmake.exeを使用することまでわかりましたが、すでにダウンロード先のリンクがなくなっています。
次に試したのが、cpanでのdmakeのインストール
コマンドプロンプトから、cpan install dmakeを実行したところ、なにやら成功している模様。
しかし、C:\Perl64\binとC:\Perl64\site\bin配下には、作成されず。。。
夜になって、C:\Perl64\cpan\build配下にdmake-(6文字の英数字)のディレクトリがあるのを発見。その配下にdmake.exeがありました。。。
p.s.
開発も2歩進んで、3歩下がっているようイメージです。進んで、下がっていというよりも、丘の先にさらに高い山がそびえたっていて、その前に深い谷があるような感じです。。。
暑い、暑い上に、今年はエアコンがないので、ことさら開発が進まねー。
2019/12/20追記
かなり前から、MinGWの64bit版を使用して、dmakeを含め、ビルドを行っています。
時には、Visual Studio 2019 Commnity版のBuildToolも使用しています。
Perlでの文字列の置換 暫定対処
正規表現と言ったら、いまだにsedだったりしますが、Perlの正規表現で文字列の置換(抽出)がうまく行かなったので、その例と対処方法を記しておきます。
例
文字列:2017-07-28T12:00:00Z
置換(抽出)したい文字列:2017-07-28
$data="2017-07-28T12:00:00
×
my $date=~ ($data =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})T.*/);
○
(my $date, my $temp)=~ ($data =~ /([0-9]{4}-[0-9]{2}-[0-9]{2})T(.*)/);
上記で、とりあえず日付だけ抽出することが、できました。
固定文字列なので、substr関数のほうが、記述も簡単で処理も速いのは十分、承知していますが、ここではあくまで例として。。。
my $date = substr($data,0,10);
EditTextで文字の行間を変更
文字の行間の変更とアンダーラインの削除が一度にできます。と言うよりも、デフォルトで設定されているものをクリアするイメージかも。この設定により、文字の行間が縮まります。
active_main.xmlのEditViewタグ内に以下を追記します。
android:background="@null"
もちろん、styles.xmlにも以下のようにして、記述できます。
<style name="Style1" >
<!-- Customize your theme here. -->
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:ems">4</item>
<item name="android:background">@null</item>
<item name="android:inputType">number</item>
<item name="android:padding">0sp</item>
<item name="android:textSize">16sp</item>
</style>
styles.xmlに記述する場合には、active_main.xmlのEditViewタグ内で以下のように関連付けます。
style="@style/Style1"
スマホ フリック入力でコーディング(ATOK編)
スマホで暇つぶしに普段はカレンダ、ToDoListの更新、メール、ゲーム、ブラウジングをしていますが、非効率でもなんだか無性にコーディングをしたくなる時があります。そんな時に限って、ノートPCは自宅に置いてたりします。
コーディングのためにスマホに接続可能なBluetoothのキーボードを買うのも、なんだかなー。ということで、たとえ数行でもスマホで入力しようと思いソフトキーボードを表示させて、英字キーボードで入力するも記号入力にひと手間かかり、面倒くさい。
幸い、ATOKのフリック入力設定で、1から6キーと8キーの合計7つの右キーの記号割り当ての設定変更が可能なので、以下のように右キーの割り当てを変更してみました。(7キーはs、9キーはzに割り当てなので変更不可)
1キー {(左中かっこ)
2キー [(左大かっこ)
3キー "(ダブルクォーテーション)
4キー }(右中かっこ)
5キー ](右大かっこ)
6キー =(イコール、デフォルトのまま)
8キー ;(セミコロン)
変更方法は、「設定」「言語と入力」「ATOK...」「テンキー」「フリック入力の設定」の「英字キーフリック」です。割り当てられるのは、記号のみで、リストから選択となります。
ちなみにデフォルト設定は、
1キー :(コロン)
2キー #(シャープ)
3キー _(アンダースコア)
4キー %(パーセント)
5キー &(アンパサンド)
6キー =(イコール)
8キー ~(チルダ)
p.s.
7か月ぶりにブログを更新しました。7か月の間、会社の倒産、パワハラなどで転職を3回しています。なんだかモチベーションが湧かなく、白猫ばかりやってましたが、最近、少し気持ちが復活。。。