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/01/31


IMAPが来ない来ないとわめいてましたが...
Gmailの言語設定画面で「English(US)」に設定したらIMAPの設定項目が現れました。
gmail_lang_en
まだかまだかとお悩みの方、一度試して見られてはどうでしょう?
gmail_setting_imap
今はGoogle独特のポートに接続出来ない環境なので実際に試せませんが、後で試してみたいと思います。
Posted at by