2008/03/07


昨日のcurlの場合と対してやってる事は変わらない。
perlならばcpanの「Net::Google::GData」とか使った方がいいかもしれない。
ただ、まだ「Net::Google::GData」は使ったこと無い。
でも↓くらいのほうが見通し良い。

昨日のcurlの場合と同様に、GoogleLoginに使用する「auth」を取得してサービスコード「cp」に一覧を要求している。
#!/usr/bin/perl

use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(GET POST);
use URI::Escape qw(uri_escape);
use XML::LibXML;
use Data::Dumper;

my $gdata_user='your-account@gmail.com';
my $gdata_pass='your-password';

my $url = 'https://www.google.com/accounts/ClientLogin';
my %postdata = (
    Email => $gdata_user,
    Passwd => $gdata_pass,
    accountType => 'GOOGLE',
    source => 'Google-Contact-Lister',
    service => 'cp',
);
my $req = POST($url, [%postdata]);
my $ua = LWP::UserAgent->new;
my $res = $ua->request($req);

my $google_auth = (split(/\n/, $res->content))[2];
$google_auth =~ s!^Auth=!!;

$url = 'http://www.google.com/m8/feeds/contacts/' .
    uri_escape($gdata_user) . '/base';

$req = GET($url, [%postdata]);
$req->header(
    Authorization => "GoogleLogin auth=$google_auth",
);
$res = $ua->request($req);
my $x = XML::LibXML->new;
my $doc = $x->parse_string($res->content)->documentElement;
my @nodes = $doc->getElementsByTagName('entry');
for my $node (@nodes) {
    my @title = $node->getElementsByTagName('title')->[0]->getChildNodes();
    my $gd = $node->getElementsByTagName('gd:email')->[0];
    print $title[0]->toString() . "," . $gd->getAttribute('address') . "\n"
        if @title && $gd;
}
実行結果は、めちゃめちゃ非公開なものなので、出せません><
CSV形式で名前とメアドが一覧されます。

AWSWORD:perl:
Posted at by



2008/03/06


ちょっと目から鱗な物みつけた。
Google Code FAQ - Using cURL to interact with Google data services
curlを使ってコマンドラインからGDataにアクセスする方法。
濃いなぁ...苦笑。手順を追って説明してくれています。色々書かれていますが以下ではPicasaWebAlbumに画像をアップロードするまでの簡単な手順を示して行きます。
まず https://www.google.com/accounts/ClientLogin
にEmail、Passwd、accountType、source、serviceをパラメータ指定してGDataへのAuthトークンを取得しに行きます。
ここで返って来るのは3行程のデータで
SID=XXXXXX
LSID=YYYYYY
Auth=ZZZZZZ
といった物が返ってきます。
認証に必要なのは最後の「Auth」です。以降のコマンドライン操作ではこの Authorization: GoogleLogin auth=ZZZZZZ
というヘッダを加えてやれば、GDataのやり取りが出来る様になります。
まず、Authを取得する為に以下の様なコマンドを発行します。
curl -s https://www.google.com/accounts/ClientLogin \
    -d Email=xxxxx@your-google-account.com \
    -d Passwd=YoUr-GoOgLe-PaSsWoRd \
    -d accountType=GOOGLE \
    -d source=Google-Picssa-Upload \
    -d service=lh2 | grep ^Auth= | sed 's/^Auth=//'
これで上記「Auth=ZZZZZZ」でいうZZZZZZの部分が取得出来ます。lh2は「Google Code FAQ - What is the service name in ClientLogin for each Data API?」にも書いてある通りPicasaWebAlbumのサービスコードになります。
そしてPicasaへ画像をアップするには以下の様なコマンドを発行します。
curl -s http://picasaweb.google.com/data/feed/api/user/default \
    -X POST \
    --data-binary "@my_picture.jpg" \
    -H "Content-Type: image/jpg" \
    -H "Slug: my_picture.jpg" \
    -H "Authorization: GoogleLogin auth=ZZZZZZ"
Slugヘッダはファイル名を指します。
後はこれを汎用的にシェルスクリプトへ...
#!/bin/sh

# include 'GDATA_USER' and 'GDATA_PASS'.
. ~/.gdata

GDATA_AUTH=`
curl -s https://www.google.com/accounts/ClientLogin \
    -d Email=$GDATA_USER \
    -d Passwd=$GDATA_PASS \
    -d accountType=GOOGLE \
    -d source=Google-Picssa-Upload \
    -d service=lh2 | grep ^Auth= | sed 's/^Auth=//'
`
FILE=`basename $1`

curl -s http://picasaweb.google.com/data/feed/api/user/default \
    -X POST \
    --data-binary "@$1" \
    -H "Content-Type: image/jpg" \
    -H "Slug: $FILE" \
    -H "Authorization: GoogleLogin auth=$GDATA_AUTH" > /dev/null
こんな感じでしょうか...
実行には「$HOME/.gdata」に GDATA_USER=xxxxx@your-google-account.com
GDATA_PASS=YoUr-GoOgLe-PaSsWoRd
を書いておく必要があります。
パスワードが書かれていますからパーミッションに注意
これで引数に指定されたJPGファイルをPicasaWebAlbumのドロップボックスにアップロードされる様になっています。
もう少し凝れば、タグを付けたりアルバムを作ったりと出来そうです。またPicasaWebAlbumに限らずGDataを扱う物であれば、ちょっとした事にcurlを使えそうです。

色々やって見たいですが、今日はこの辺でおひらき。

なおC言語上の実装例ですが、CodeReposに上げてあるBlogWriterのコードAtomPP.cppで、Bloggerへのログインとポストしている部分も参考になるかもしれません。
「getBloggerAuth」あたり
コードめちゃめちゃ汚いですが...

Posted at by



2008/02/22


はてなスクリーンショットに微笑むblosxomプラグイン作りました。
普段は微笑みませんが、はてなスクリーンショットに「ハイ!ポーズ!」と言われるとスマイルを振りまくのです。

以下証拠写真
はてなスクリーンショット - http://mattn.kaoriya.net
で、blosxomプラグインのソース package hatenascreenshot;
use strict;

use vars qw($smile);
my $photo = '<img src="お好きな画像">';

sub start {
  $smile = $photo if ($ENV{'HTTP_USER_AGENT'} =~ /HatenaScreenshot/);
}

1;
あとはフレーバに$hatenascreenshot::smileを入れるだけ。
お好きな画像で微笑んでみてはどうでしょうか?

決してウンコとかは辞めましょう。
※まぁネタですから...
Posted at by