はてなブックマークAtomAPIをOAuthで利用する方法(Java, oauth-signpost版)

より簡単な方法:scribe-java版

はてなブックマークAtomAPIの使い方を紹介します。2010年末にOAuthをサポートしたので、ここでもそれを試します。言語はJava、ライブラリはoauth-signpostを使います。

アプリケーションの登録

アプリケーション登録ページでアプリケーションを登録し、Consumer keyとConsumer secretを取得します。

ライブラリの準備

signpost-core-バージョン番号.jar とcommons-codec-バージョン番号.jarを使えるようにします(このあたりの詳細については、拙著『Webアプリケーション』などを参照してください)。

Access tokenとToken secretの取得

OAuthでユーザの権利を譲り受けるためのAccess tokenとToken secretを取得します。ここで紹介するコンソール上で行う方法の他に、ブラウザ上でリダイレクトを使う方法もありますが、両者の違いはTwitterの場合などと同じなので、Twitterでの方法を見れば、リダイレクトを使う方法も実現できるでしょう。

先に取得したConsumer keyとConsumer secretを下のコードに埋め込んでください。

import java.io.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;

public class HatenaTokenCreator {

  public static void main(String[] args) throws Exception {
    // プロキシサーバの設定
    //System.setProperty("http.proxyHost", "proxy.example.net");
    //System.setProperty("http.proxyPort", "3128");
    //System.setProperty("https.proxyHost", "proxy.example.net");
    //System.setProperty("https.proxyPort", "3128");

    OAuthConsumer consumer = new DefaultOAuthConsumer(
            ***** Consumer key *****,
            ***** Consumer secret *****);

    String scope = "?scope=read_public,write_public,read_private,write_private";
    OAuthProvider provider = new DefaultOAuthProvider(
            "https://www.hatena.com/oauth/initiate" + scope,
            "https://www.hatena.com/oauth/token",
            "https://www.hatena.ne.jp/oauth/authorize");

    String authUrl = provider.retrieveRequestToken(consumer, OAuth.OUT_OF_BAND);
    System.out.println("このURLにアクセスし、表示されるPINを入力してください。");
    System.out.println(authUrl);
    System.out.print("PIN:");

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String pin = br.readLine();

    provider.retrieveAccessToken(consumer, pin);
    System.out.println("Access token: " + consumer.getToken());
    System.out.println("Token secret: " + consumer.getTokenSecret());
  }
}

TwitterのOAuthと違うのは、どのような権利を求めるかを「score=...」という形で書いておくところです。上のコード実行するとURLが表示されるので、そのURLにブラウザでアクセスしてください。下のようなページが表示されます。scoreの記述によって内容は変わります。この例では、公開・非公開の両方の情報への読み書き権限を要求しています。

OAuthで許可を求められているところ

「許可」をクリックすると下のようなページが表示されるので、表示された文字列を先のコードからのプロンプトで入力してください。Access tokenとToken secretが得られます。

「許可」をクリックした結果

ブックマーク

譲り受けた権利を使って「http://b.hatena.ne.jp/atom/post」にURLをPOSTすれば、そのURLをはてなブックマークに登録できます。例として「http://www.google.com/」を登録するコードは次のようになります。先に取得したConsumer keyとConsumer secret、Access token、Token secretを埋め込んで実行してください。

import java.io.*;
import java.net.*;
import oauth.signpost.*;
import oauth.signpost.basic.*;

public class SignpostBookmark {

  public static void main(String[] args) throws Exception {
    // プロキシサーバの設定
    //System.setProperty("http.proxyHost", "proxy.example.net");
    //System.setProperty("http.proxyPort", "3128");

    // これはユーザによらない
    OAuthConsumer consumer = new DefaultOAuthConsumer(
            ***** Consumer key *****,
            ***** Consumer secret *****);

    // これはユーザごとに異なる
    consumer.setTokenWithSecret(
            ***** Access token *****,
            ***** Token secret *****);

    // ターゲット
    String target = "http://www.google.com/";
    String xml = String.format("<entry xmlns='http://purl.org/atom/ns#'>"
            + "<title>dummy</title>"
            + "<link rel='related' type='text/html' href='%s' />"
            + "<summary type='text/plain'></summary>"
            + "</entry>",
            target);

    // HTTPリクエスト
    URL url = new URL("http://b.hatena.ne.jp/atom/post");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("POST");
    connection.addRequestProperty("Content-Type", "application/octed-stream");
    consumer.sign(connection);

    // POSTによる送信
    connection.setDoOutput(true);
    OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());
    writer.write(xml);
    writer.flush();
    writer.close();

    // 結果の表示
    System.out.printf("%s %s\n", connection.getResponseCode(), connection.getResponseMessage());
    BufferedReader br = new BufferedReader(new InputStreamReader(
            connection.getResponseCode() / 100 == 2
            ? connection.getInputStream()
            : connection.getErrorStream(),
            "UTF-8"));
    String line = null;
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
  }
}

Twitterの場合との違うのは、リクエストボディにXMLを書かなければならないこと、それを送信するためにContent-Typeをapplication/octed-streamにしておくことです。

ブックマークの編集

scribe-java版で紹介した方法と同様です(手抜き)。

補足

アプリケーションに与えた許可を取り消したいときは、「Myはてな」→「ユーザ設定」→「外部アプリケーション認証」→「外部のアプリケーションから、はてなのサービスを利用する」の順にクリックしてください。「https://www.hatena.ne.jp/はてなID/config/auth/provider」にアクセスしてもいいでしょう。

OAuth認証でTwitterを利用するWebアプリケーション(PHP twitteroauthの場合)

新しい記事:OAuth認証でTwitterを利用するWebアプリケーション(PHP PECL/oauthの場合)

OAuth認証が必要なAPIでは、Twitter APIとFacebook APIが有名ですが、ちょっと仕様が違うので、使い方を簡単に紹介しようとすると、記事を分けなければなりません。さらに、JavaとPHPの両方を学べるというお得な本を書いたこともあって、その読者をサポートするために、JavaとPHPの両方で記事を書かなければなりません。都合、以下の4パターンが必要です。

今回は、「PHPでTwitter API」です。「JavaでFacebook API」はまた別の機会に。

アプリの登録

http://dev.twitter.com/appsでアプリケーションを登録し、Concumer keyとConsumer secretを取得してください。その際、クライアントアプリケーションではなくブラウザウェブアプリケーションとして登録するように注意してください。

OAuthのためのライブラリ

PHPには、標準の「PECL/oauth」や準標準と言える「Pear HTTP_OAuth」、Twitterに特化した「Pear Services_Twitter」がありますが、例によって、PECLはWindowsで使いにくいし、HTTP_OAuthはベータ版、Services_Twitterはアルファ版なので、さっさと見限って「twitteroauth」を使いましょう。

OAuth.phpとtwitteroauth.phpをダウンロードして、ウェブサーバで配信できる場所に置きます。

cURL

XAMPP

PHPでcURLを使うために、php.iniに以下のように記述して、Apacheを再起動します。

extension=php_curl.dll

Ubuntu

次のコマンドを実行してcURLモジュールをインストールしてからApacheを再起動します。

sudo apt-get install php5-curl

お約束ですが、このあたりでもうついて行けないという場合は、拙著『Webアプリケーション構築入門』などを参照してください。以下のPHPプログラミングで必要な知識も本書にまとめてあります。

OAuth認証

以下の3画面で認証することにします(oauth-start.phpとoauth-end.phpは一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。

  1. OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.php
  2. アプリケーションを許可するTwitterページ
  3. Twitterからのコールバックを受信し、access tokenとtoken secretを取得するoauth-end.php

実装

oauth-start.php

OAuth認証の入り口となるoauth-start.jspは以下のようになります。「Consumer key」や「Consumer secret」、コールバックURIの部分は、状況に合わせて書き換えてください。

<?php
require_once('twitteroauth.php');

session_start();

$_SESSION['consumer_key'] = Consumer key;
$_SESSION['consumer_secret'] = Consumer secret;
$callbackUri = 'http://localhost/twitter/oauth-end.php';

$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret']);
$request_token = $connection->getRequestToken($callbackUri);
$_SESSION['oauth_token'] = $token = $request_token['oauth_token'];
$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];

$authUrl = $connection->getAuthorizeURL($token);
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>OAuth Start</title>
  </head>
  <body>
    <p><a href="<?php echo $authUrl; ?>">Twitter OAuth認証開始</a></p>
    <p><a href="logout.php">logout</a></p>
  </body>
</html>

oauth-end.php

コールバック後の処理を実装するoauth-endは以下のようになります。

<?php
require_once('twitteroauth.php');

session_start();

$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
                $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);
$access_token = $connection->getAccessToken($_GET['oauth_verifier']);
unset($_SESSION['oauth_token']);
unset($_SESSION['oauth_token_secret']);

$_SESSION['access_token'] = $access_token;
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Twitter OAuth認証完了</title>
  </head>
  <body>
    <pre><?php print_r($access_token); ?></pre>
    <p>access_tokenをセッションに保存した</p>
    <p><a href="post.php">送信テスト</a></p>
    <p><a href="logout.php">logout</a></p>
  </body>
</html>

つぶやく

認証が終わったら、以下のようなコードでつぶやけます。

<?php

header('Content-type:text/plain; charset=utf-8');
require_once('twitteroauth.php');

session_start();

$access_token = $_SESSION['access_token'];
$connection = new TwitterOAuth($_SESSION['consumer_key'], $_SESSION['consumer_secret'],
                $access_token['oauth_token'], $access_token['oauth_token_secret']);

$message = "テスト at " . time();
$parameters = array('status' => $message);
$status = $connection->post('statuses/update', $parameters);

if (isset($status->errors)) { //エラーがある
  $errors = $status->errors;
  $error = $errors[0];
  echo $error->message."\n";
}

print_r($status);

ブラウザを再起動すればはじめに戻りますが、次のようなlogout.phpを作っておいてもいいでしょう。

<?php
session_start();
session_destroy();
?>
<!doctype html>
<html>
  <head>
    <title>Logout</title>
  </head>
  <body>
    <p><a href="oauth-start.php">start</a></p>
  </body>
</html>

OAuth認証でFacebookを利用するWebアプリケーション(PHPの場合)

OAuth認証でTwitterを利用するWebアプリケーションの作り方を以前紹介しました。OAuth認証はさまざまなサイトで使われていますが、使い方がちょっとずつ違っていたりして、プログラミングが苦手な人には敷居が高い気がします。せっかくおもしろいことを思いついても、最初の段階で躓いて挫折するのはがっかりなので、簡単なサンプルがたくさんあるといいと思います。

というわけで、PHPでFacebookのOAuth認証を利用する例を紹介しましょう。

Facebookの開発者サイトでアプリケーションを登録し、アプリケーションIDシークレットキーを取得します。

アプリケーション登録

2つのファイルでOAuth(説明用)

OAuth認証の開始ページを/facebook/oauth-start.php、終了ページを/facebook/oauth-end.phpとします。

oauth-start.phpは次のようになります。おおざっぱなTwitterと比べて、Facebookでは、OAuth認証時に認可する機能をかなり細かく設定できます。ここでは、掲示板への登録を許可するように、「scope=publish_stream」をつけておきます。他の権限については、Extended Permissionsを参照してください。

<?php
session_start();
$_SESSION['application_id'] = アプリケーションID;
$_SESSION['application_secret'] = シークレットキー;
$_SESSION['redirect_uri'] = 'http://localhost/facebook/oauth-end.php';
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF対策

$url = 'https://www.facebook.com/dialog/oauth'
        . '?client_id=' . $_SESSION['application_id']
        . '&redirect_uri=' . urlencode($_SESSION['redirect_uri'])
        . '&state=' . $_SESSION['state']
        . '&scope=publish_stream'; //投稿する場合
?>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>OAuth Start</title>
  </head>
  <body>
    <p><a href="<?php echo $url; ?>">OAuth</a></p>
  </body>
</html>

oauth-start.phpが生成するURLにアクセスすると、認証画面になります。

認証画面

「許可する」をクリックすると、oautu-start.phpで指定したリダイレクトURL(ここではhttp://localhost/facebook/oauth-end.php)にリダイレクトされます。oauth-end.phpでは、リダイレクトが伴うcodeというパラメータを利用して、認証を完了させます。(ちなみに、http://www.facebook.com/settings/?tab=applicationsで許可を取り消せます。)

<?php
session_start();
if (!isset($_SESSION['state'], $_GET['state']) || ($_SESSION['state'] !== $_GET['state'])) {
  session_destroy();
  die();
}
        
$cxContext = NULL;
//$cxContext = stream_context_create(array(//プロキシサーバを利用する場合
//    'http' => array('proxy' => 'tcp://proxy.example.net',
//        'request_fulluri' => True)));
 
$url = 'https://graph.facebook.com/oauth/access_token'
        . '?client_id=' . $_SESSION['application_id']
        . '&client_secret=' . $_SESSION['application_secret']
        . '&redirect_uri=' . $_SESSION['redirect_uri']
        . '&code=' . $_GET['code'];
$result = file_get_contents($url, False, $cxContext);
$output = null;
parse_str($result, $output);
if (!isset($output['access_token'])) {
  session_destroy();
  die();
}
$_SESSION['access_token'] = $output['access_token'];
?>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>OAuth End</title>
  </head>
  <body>
    <p>access_tokenをセッションに保存した。</p>
    <p><a href="post.php">送信テスト</a></p>
  </body>
</html>

oauth-end.phpで認証が完了したら、次のようなpost.phpで、メッセージを送信してみましょう。

<?php
session_start();
if (!isset($_SESSION['access_token'])) {
  session_destroy();
  header('Location: http://localhost/facebook/oauth-start.php');
  die();
}

//投稿
require_once 'HTTP/Request2.php';
$url = "https://graph.facebook.com/me/feed"
        . '?access_token=' . $_SESSION['access_token']
        . '&message=' . urlencode("テスト at " . time());
$request = new HTTP_Request2($url, HTTP_Request2::METHOD_POST);

if (substr(PHP_OS, 0, 3) == 'WIN') {//XAMPP(いいかげん)
  $sslCafile = 'C:/xampp/perl/vendor/lib/Mozilla/CA/cacert.pem';
} else {
  $sslCafile = '/etc/ssl/certs/ca-certificates.crt';
}
$request->setConfig(array(
    //'proxy_host' => 'proxy.example.net',//プロキシサーバを利用する場合
    //'proxy_port' => 3128,
    'ssl_cafile' => $sslCafile
));

$response = $request->send();
if ($response->getStatus() / 100 != 2) {
  echo $response->getReasonPhrase();
  die();
}
session_destroy();
?>
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Message Post</title>
  </head>
  <body>
    <p>投稿成功。</p>
    <pre><?php echo $response->getBody(); ?></pre>
    <p><a href="oauth-start.php">start</a></p>
  </body>
</html>

例によって、PHPにはいろんなHTTPクライアントがあって、あまり整理されていないのですが、ここではHTTP_Request2を使っています(HTTP_Requestはプロキシ経由のSSL通信に対応していないため、ここでは使えません)。次のようなコマンドで、HTTP_Request2をインストールしておく必要があります。XAMPP for Windowsの場合、スタートメニューのコマンドプロンプトを右クリックして管理者として実行してください。プロキシが必要な環境では、事前に「set http_proxy=http://proxy.example.net:3128/」(Windows)や「export http_proxy=http://proxy.example.net:3128/」(Windows以外)が必要です。

cd \xampp\php
pear install http_request2

SSL通信のためには、PHPでOpen SSLが有効になっていなければなりません。Open SSLが有効かどうかはphpinfo()で確認できます。「OpenSSL suppor」がenabledになっていれば大丈夫です。有効になっていない場合は、php.iniに「extension=php_openssl.dll」という行を追加してください(XAMPPの場合はc:\xampp\php\php.ini)。「extension=」という記述がたくさんある場所に書いておけばいいでしょう。php.iniを変更したら、Apacheを再起動してください。

実験時には、「'ssl_cafile' => $sslCafile」の代わりに「'ssl_verify_peer' => false」としていてもいいでしょう。

1つのファイルでOAuth+投稿

oauth-start.phpとoauth-end.php、post.phpを1つのファイル1click-post.phpにまとめると次のようになります。コールバック処理の最後で一度転送しているのは、ブラウザのアドレス欄にトークンを表示させないためです(セキュリティのためではありません)。

<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Message Post</title>
  </head>
  <body>
    <?php
    session_start();

    $application_id = アプリケーションID;
    $application_secret = シークレットキー;
    $redirect_uri = 'http://localhost/facebook/1click-post.php';

    if (!isset($_SESSION['access_token'])) {
      if (!isset($_GET['code'])) {//OAuth
        $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF対策
        $url = 'https://www.facebook.com/dialog/oauth'
                . "?client_id=$application_id"
                . '&redirect_uri=' . urlencode($redirect_uri)
                . '&state=' . $_SESSION['state']
                . '&scope=publish_stream'; //投稿する場合
        echo("<script>top.location.href='$url';</script>");
      } else if (isset($_SESSION['state'], $_GET['state']) && ($_SESSION['state'] === $_GET['state'])) {//コールバック
        $cxContext = NULL;
        //$cxContext = stream_context_create(array(//プロキシサーバを利用する場合
        //    'http' => array('proxy' => 'tcp://proxy.example.net:3128',
        //        'request_fulluri' => True,)));
        $url = 'https://graph.facebook.com/oauth/access_token'
                . "?client_id=$application_id"
                . "&client_secret=$application_secret"
                . "&redirect_uri=$redirect_uri"
                . '&code=' . $_GET['code'];
        $result = file_get_contents($url, False, $cxContext);
        $output = null;
        parse_str($result, $output);
        if (!isset($output['access_token'])) {
          session_destroy();
        } else {
          $_SESSION['access_token'] = $output['access_token'];
          header("Location: $redirect_uri"); //トークン隠すための転送(オプショナル)
        }
      }
    } else {//投稿
      require_once 'HTTP/Request2.php';
      $url = "https://graph.facebook.com/me/feed"
              . '?access_token=' . $_SESSION['access_token']
              . '&message=' . urlencode('テスト at ' . time());
      $request = new HTTP_Request2($url, HTTP_Request2::METHOD_POST);
      
      if (substr(PHP_OS, 0, 3) == 'WIN') {//XAMPP(いいかげん)
        $sslCafile = 'C:/xampp/perl/vendor/lib/Mozilla/CA/cacert.pem';
      } else {
        $sslCafile = '/etc/ssl/certs/ca-certificates.crt';
      }
      $request->setConfig(array(
          //'proxy_host' => 'proxy.example.net',//プロキシサーバを利用する場合
          //'proxy_port' => 3128,
          'ssl_cafile' => $sslCafile
      ));
      
      $response = $request->send();
      if ($response->getStatus() / 100 != 2) {
        echo $response->getReasonPhrase();
      } else {
        echo '<p>投稿成功。</p>';
        printf('<pre>%s</pre>', $response->getBody());
      }
      session_destroy();
    }
    ?>
  </body>
</html>

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。

OAuth認証でTwitterを利用するWebアプリケーション(Javaの場合)

APIのためのURLを更新しました(2013.2)。

以前、Twitter APIをOAuth認証で利用する方法(Javaの場合)を紹介しました。

ここでは、コンソール・アプリケーションではなく、WebアプリケーションでTwitterのOAuth認証を利用する方法を紹介します。

例によって、以下を確認してから先に進んでください。

  • http://dev.twitter.com/appsでアプリケーションを登録、Concumer keyとConsumer secretを取得する(クライアントアプリケーションではなくブラウザウェブアプリケーションとして登録すること。Callback URLの入力が必要です。とりあえず、「http://localhost/」などとしておけばいいでしょう。)
  • Commons Codecのcommons-codec-バージョン番号.jarを利用可能にする
  • oauth-signpostのsignpost-core-バージョン番号.jarを利用可能にする

以下の3画面で認証することにします(oauth-start.jspとoauth-end.jspは一つのファイルにまとめることもできますが、ここではわかりやすいように二つに分けています)。

  1. OAuth認証のためのURIを生成し、それにアクセスするためのリンクを表示するoauth-start.jsp
  2. アプリケーションを許可するTwitterページ
  3. Twitterからのコールバックを受信し、access tokenとtoken secretを取得するoauth-end.jsp

OAuth認証の入り口となるoauth-start.jspは以下のようになります。メソッドretrieveRequestToken()を呼び出す際に、コールバック先のURIを指定しています。このURIは自分の環境に合わせて書き換えてください。

<%@page contentType="text/html" pageEncoding="UTF-8" import="oauth.signpost.*,oauth.signpost.basic.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<%
    OAuthConsumer consumer = new DefaultOAuthConsumer(
            ***** Consumer key *****,
            ***** Consumer secret *****);
 
    OAuthProvider provider = new DefaultOAuthProvider(
            "https://api.twitter.com/oauth/request_token",
            "https://api.twitter.com/oauth/access_token",
            "https://api.twitter.com/oauth/authorize");

    session.setAttribute("consumer", consumer);
    session.setAttribute("provider", provider);
 
    String callbackUri = "http://localhost:8080/myweb/twitter/oauth-end.jsp";
    String authUrl = provider.retrieveRequestToken(consumer, callbackUri);
%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Twitter OAuth認証開始</title>
  </head>
  <body>
    <p><a href="<%=authUrl%>">Twitter OAuth認証開始</a></p>
  </body>
</html>

コールバック後の処理を実装するoauth-end.jspでは、OAuthConsumerオブジェクトとOAuthProviderオブジェクトをセッションから取り出して再利用します。

<%@page contentType="text/html" pageEncoding="UTF-8" import="oauth.signpost.*,oauth.signpost.http.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  "http://www.w3.org/TR/html4/loose.dtd">
<%
    OAuthConsumer consumer = (OAuthConsumer) session.getAttribute("consumer");
    OAuthProvider provider = (OAuthProvider) session.getAttribute("provider");
 
    String oauth_verifier = request.getParameter("oauth_verifier");
    provider.retrieveAccessToken(consumer, oauth_verifier);
    String accessToken = consumer.getToken();
    String tokenSecret = consumer.getTokenSecret();
 
    HttpParameters hp = provider.getResponseParameters();
    String user_id = hp.get("user_id").first();
    String screen_name = hp.get("screen_name").first();
%>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Twitter OAuth認証完了</title>
  </head>
  <body>
    <p>Twitter OAuth認証完了</p>
    <dl>
      <dt>Access Token</dt><dd><%=accessToken%></dd>
      <dt>Token Secret</dt><dd><%=tokenSecret%></dd>
      <dt>user_id</dt><dd><%=user_id%></dd>
      <dt>screen_name</dt><dd><%=screen_name%></dd>
    </dl>
  </body>
</html>

これで認証は終わりです。具体的につぶやく方法などは、Twitter APIをOAuth認証で利用する方法(Javaの場合)Twitter4Jでつぶやく練習を参照してください。

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。

Twitearth この星のつぶやき

宇宙からつぶやくことができるのに、つぶやきに付ける位置情報が「緯度・軽度」ではまずいだろうと思う今日この頃ですが、「緯度・軽度」の情報を持ったつぶやきが、リアルタイムに日本語に(やや無理に)訳され、表示されるようになっています。

Twitearth(Twitterのアカウントで許可してもらう必要があります。許可は、Twitterの連携アプリの確認ページで簡単に取り消せます。)

2010年6月27日(日)の夕方(日本時間)にしばらく動かすと下のようになりました。Twitterが普及していない、位置情報を付加できる端末が少ない、位置情報をつけ(たく)ない人が多い、みんな寝てる、などの理由(?)でつぶやきの少ない地域があります。

Twitearth

補足

  • 翻訳先の言語はブラウザの設定によります。例えば、ブラウザの設定をフランス語にしていれば、つぶやきはフランス語に訳されます。
  • 詳細は「Twitter とGoogleマップ, Google翻訳」を参照。
  • FirefoxやChrome、Safari、Operaで動作を確認しています。Internet Explorerでは動きません。
  • 対象にしているのはTwitterの全つぶやきのごく一部、何もせずにhttp://stream.twitter.com/1/statuses/sample.json で取得できるもののうち、位置情報がついているもののみです。
  • 非力なサーバでストリーミングをしているので、アクセスが多いときっとだめになります。
  • 「宇宙からつぶやく」という表現において、「宇宙」には大気圏内は含まれません。
  • 宇宙(というか大気圏外)からの最初のつぶやきには、位置情報は含まれていません。

3次元版Twitearth この星のつぶやき

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。