<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OTCHY.NET &#187; twitter</title>
	<atom:link href="http://www.otchy.net/tag/twitter/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.otchy.net</link>
	<description>Otchy の技術ネタ。JavaScript 率と Twitter 率がやや高く、他にも PHP/Java/Perl などなど。共通点は Web。</description>
	<lastBuildDate>Wed, 01 Feb 2012 14:39:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>スパム報告に対応した TwitMgr Ver 2.1.0 公開</title>
		<link>http://www.otchy.net/20110926/twitmgr-210-had-released/</link>
		<comments>http://www.otchy.net/20110926/twitmgr-210-had-released/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 08:57:31 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1454</guid>
		<description><![CDATA[title 要素で「スパムフォローをまとめてブロック」と謳っているくせに、せいぜいブロック出来るだけで、アプリ上からのスパム報告に対応していなかった TwitMgr に、ようやくスパム報告機能を実装しました。
ぶっちゃけ [...]]]></description>
			<content:encoded><![CDATA[<p>title 要素で「スパムフォローをまとめてブロック」と謳っているくせに、せいぜいブロック出来るだけで、アプリ上からのスパム報告に対応していなかった <a href="/twitmgr/" target="_blank">TwitMgr</a> に、ようやくスパム報告機能を実装しました。</p>
<p>ぶっちゃけこの機能が無いせいで、作者自身いちいち公式サイトに飛んでからスパム報告してたので、今回とても便利になって嬉しいです。<br />
1時間足らずで実装出来るならさっさとやってれば良かったです…。</p>
<p>あとはあれですね、リスト登録機能が欲しいですよね。<br />
当たり前ですが、投げっぱなしで終わりのスパム報告よりもリスト周りの API の方が複雑なので、こっちはちょっと時間がかかると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20110926/twitmgr-210-had-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitMgr Ver.2.0.0 をリリース</title>
		<link>http://www.otchy.net/20110831/twitmgr-ver-200-had-released/</link>
		<comments>http://www.otchy.net/20110831/twitmgr-ver-200-had-released/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 07:57:29 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1398</guid>
		<description><![CDATA[Twitter API の仕様変更により動作しなくなっていた TwitMgr をフルスクラッチで書き直して Ver.2.0.0 としてリリースしました。
Ver.2 を名乗る割に、機能的には Ver.1 を踏襲しただけと [...]]]></description>
			<content:encoded><![CDATA[<p>Twitter API の仕様変更により動作しなくなっていた <a href="/twitmgr/" target="_blank">TwitMgr</a> をフルスクラッチで書き直して Ver.2.0.0 としてリリースしました。</p>
<p>Ver.2 を名乗る割に、機能的には Ver.1 を踏襲しただけというのが残念ではありますが、適宜先読みを行ったり、取得したデータをキャッシュする事で、従来版よりキビキビと動くようになっています。<br />
その分、メモリの消費は増えているのですが、昨今のトレンドに沿った修正ですし問題ないと思っています。</p>
<p>デザインに関しては、HTML5 / CSS3 の構成で作っています。最近、個人でサイトを作る時は全力で IE を無視するので、HTML5 / CSS3 の機能を存分に使えて気持ちいいです。</p>
<p>今回、webkit に限ってですが、transition を初めて使ってみました。これ、これまで食わず嫌いで使ってなかったのを後悔しましたよ。「あっても無くても機能には支障ないけど、あるとちょっと嬉しいワンポイントアニメ」とかが、楽に表現出来ます。<br />
散々言われていた事ですが、自分で使ってみて初めて本当に理解するっていう感じです。</p>
<p>それと、CSS3 を使い込んで頑張ってみたのがツールバー＆タブのデザイン。</p>
<p><a href="http://www.otchy.net/wp-content/uploads/2011/08/twitmgr_01.png"><img src="http://www.otchy.net/wp-content/uploads/2011/08/twitmgr_01-300x72.png" alt="" title="ツールバー" width="300" height="72" class="aligncenter size-medium wp-image-1399" /></a></p>
<p>これを画像無しに表現出来るようになるとは驚きです。<br />
ツールバー部分だけを抜き出してみれば、マークアップもシンプルです。</p>
<pre>
&lt;h3 class=&quot;tab selected&quot;&gt;フォローしている&lt;/h3&gt;
&lt;h3 class=&quot;tab &quot;&gt;フォローされている&lt;/h3&gt;
&lt;div class=&quot;toolbar&quot;&gt;&lt;/div&gt;
</pre>
<p>最近の Web デザイン系の記事に触発されて 1px のラインを入れてみたりしてます。<br />
この CSS だけ取り出しても面白いかと思うので、そこはまた別の記事におこします。</p>
<p>最後に、ソーシャル系のボタンとして、はてブ・Twitter・Facebook を付けてみました。<br />
それぞれ公式のスクリプトを生成して貼り付けた感じですが、はてブと Facebook は URL とかページタイトルの指定が固定で入るような形だったので、そこは動的に取るようにしています。</p>
<p>その点、Twitter のボタンはどんなページでも共通のスクリプトを貼り付けるだけでよいので楽ですね。一方、「このサイトのボタンは、どんなページにあってもサイトのトップに対するボタンにしたい」ってのが Twitter だとできないです。<br />
まあ、プロモーション上、サイトのトップにソーシャルのアクセスを集中させたい気持ちは分からないではないんですが、ユーザは「今見てるページ」をブクマしたかったり「いいね！」したかったりすると思うので、そういうのは避けたいです。</p>
<p>さて、せっかく TwitMgr 自体を綺麗に書き直したので、今後は少し機能拡張もやろうと思ってます。<br />
初代 TwitMgr リリース時点では機能が存在していなかったリストへの対応とスパム報告への対応が当面の目標です。<br />
この 2 つは、いま自分で TwitMgr を使うにあたって欲しいと思ってる機能なので、確実に実現させると思います。<br />
その他にも何かフィードバックがあれば、是非教えて下さい。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20110831/twitmgr-ver-200-had-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitAPI.js Ver.0.2.0 リリース／taj-proxy build5 リリース</title>
		<link>http://www.otchy.net/20110826/twitapi-js-ver-020-taj-proxy-build5/</link>
		<comments>http://www.otchy.net/20110826/twitapi-js-ver-020-taj-proxy-build5/#comments</comments>
		<pubDate>Fri, 26 Aug 2011 05:49:31 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1395</guid>
		<description><![CDATA[JavaScript から気軽に Twitter API を利用するためのライブラリ、TwitAPI.js の Ver.0.2.0 をリリースしました。
TwitAPI.js はその仕組み上、プロキシサーバを経由して T [...]]]></description>
			<content:encoded><![CDATA[<p>JavaScript から気軽に Twitter API を利用するためのライブラリ、<a href="/javascript/twit-api/">TwitAPI.js</a> の Ver.0.2.0 をリリースしました。<br />
TwitAPI.js はその仕組み上、プロキシサーバを経由して Twitter API にアクセスしているのですが、メソッドが GET で認証不要な API の場合、Twitter API を直接 JSONP で利用する事が出来るので、それを可能にするアップデートです。</p>
<p>また同時に、TwitAPI.js 用プロキシサーバである <a href="http://code.google.com/p/taj-proxy/" target="_blank">taj-proxy</a> も、build 5 を公開しています。<br />
これは、TwitAPI.js 本体の更新とは関係なくて、従来、Twitter API にアクセスする URL として固定で https://twitter.com/&#8230; となっていたのを、現在の正しいドメインである、https://api.twitter.com/&#8230; に変更したという対応です。<br />
これをしないと最新の API が利用出来ずに困った事になっていました。</p>
<p>しばらく放置していたのですが、最近ちょっと時間が出来て <a href="/twitmgr/" target="_blank">TwitMgr</a> のリライトを再開出来たので、それに合わせたアップデートになります。</p>
<p>というわけで次は TwitMgr の新バージョンを報告出来るといいのですが、それはまだ先の話。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20110826/twitapi-js-ver-020-taj-proxy-build5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter でホーム TL を汚さずに気になる人を補足する2つの方法</title>
		<link>http://www.otchy.net/20101002/twitter-list-rss-tips/</link>
		<comments>http://www.otchy.net/20101002/twitter-list-rss-tips/#comments</comments>
		<pubDate>Sat, 02 Oct 2010 02:53:13 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1177</guid>
		<description><![CDATA[Twitter をやっていると、色々なユーザをフォローするにあたって大きく 2 つの方針があるように思います。
まず 1 つ目は、フォロワの発言を基本的に全部読めるように厳選して TL を構築する方針です。Twitter [...]]]></description>
			<content:encoded><![CDATA[<p>Twitter をやっていると、色々なユーザをフォローするにあたって大きく 2 つの方針があるように思います。</p>
<p>まず 1 つ目は、フォロワの発言を基本的に全部読めるように厳選して TL を構築する方針です。Twitter を始めた当初はこういうパターンの使い方が多いのではないでしょうか？メッセンジャー的、あるいは SNS 的使い方と言えます。<br />
これを厳選 TL と呼びましょう。</p>
<p>そして 2 つ目は、もっとフォロワの範囲を拡大して、未読の発言が流れていっても気にしない方針です。フォロワが増えていくにしたがって、全部の発言を追えなくなると、どこかのタイミングでこういうターニングポイントがやってくる人が多そうです。開き直って、どんどんフォロワーを増やし続けるパターンも見受けられます。これは、ストリーミング的な使い方で、雰囲気としては TV のザッピングに似ていますね。<br />
こちらは、ストリーム TL と呼ぶことにします。</p>
<p>もちろん、厳選 TL とストリーム TL の境界は曖昧でその中間的な状態という場合も多いでしょう。</p>
<p>さて、<a href="http://wiredvision.jp/news/201010/2010100123.html" target="_blank">「知らない人をフォローすること」と独創性 | WIRED VISION</a> という記事とか、フォロワがいっぱいいて Twitter 充している人なんかを見ていると、Twitter の一番面白い使い方は、ストリーム TL ではないか、という気がしてきます。<br />
だけど、せっかく構築した自分の厳選 TL に大量のフォロワを追加して、ストリーム化させてしまうのには躊躇する人も多いのではないでしょうか？</p>
<p>自分自身、すでにある程度ストリーム化した TL にはなっていますが、ざっくりと議論を追ったりは出来る厳選 TL 的な要素も残っています。ストリーム TL の面白さを追求してみたいとは思うのですが、これ以上フォロワを増やすと厳選 TL の要素が無くなって完全なストリーム TL になってしまうので、それは避けたいという気持ちもあります。</p>
<p>ではどうすればいいでしょう？</p>
<h4>サブ垢の利用</h4>
<p>まず思いつくのは、もう1つのサブアカウントを取得して、目的別に使い分けるという事です。この方法は、厳選 TL とストリーム TL をそれぞれ綺麗に分離することが出来ます。マルチアカウントに対応したクライアントアプリを使えば、TL を見るには困らなさそうですが、ちょっとした問題があります。</p>
<p>ストリーム TL からザッピングして、ちょっと返信を付けたり、RT したりしたい時は、やはりメインのアカウントでやりたいのですが、その度にいちいちアカウントを切り替えるのは面倒です。あるいは、ストリーム TL で気に入ったユーザがいたから厳選 TL に組み込みたい時なども面倒ですね。<br />
とかく、複数のアカウントを使い分けて何かするというのは面倒になりがちなので、この方法はボツです。</p>
<h4>非フォローリストの利用</h4>
<p>これが本命です。<br />
今の Twitter には、「リスト」というユーザをグループ分けする機能があるのですが、このリストに追加するユーザについては、自分でフォローしている必要がありません。</p>
<p>そこで、フォローしないままリストにどんどんユーザを追加して、そのリストをストリーム TL として参照します。この場合、ホーム TL (＝厳選 TL) とストリーム TL が混在することなく存在し、また、自分のアカウントは 1 つなので、返信や RT を行ったり、厳選 TL に組み込んだりするのもスムーズですね。</p>
<p>さらに、リストの設定にはプライベートモード (自分以外に非公開) というものも存在するので、「フォローするまでもない」と判断したことを本人に知られたくない場合や、<del>ストーｋ</del> 恥ずかしがり屋なあなたも安心です。</p>
<p>ところで、確かに気になる発言はあるものの、Tweet の絶対数が少なくてあっさり見落としてしまうような人を、確実に補足するにはどうしたらいいのでしょうか？<br />
この場合、流し読み前提のストリーム TL は適当ではありません。</p>
<h4>ユーザ RSS の利用</h4>
<p>そこで出てくるのが ユーザ RSS です。<a href="http://www.google.com/search?aq=f&#038;sourceid=chrome&#038;ie=UTF-8&#038;q=rss%E3%81%A8%E3%81%AF" target="_blank">RSS とは</a>何かについては、ここでは言及しませんが、Twitter では一人一人のユーザごとに、そのユーザの発言だけが含まれる RSS が生成されています。<br />
具体的には、以下のような URL です。</p>
<pre>http://twitter.com/statuses/user_timeline/{userId}.rss</pre>
<p>{userId} の部分には、対象となるユーザのユーザ ID (数値) もしくはスクリーンネームが入ります。ユーザ ID はやや専門的になるので置いておいて、スクリーンネームは各ユーザのプロフィールページの URL などに含まれる、ユーザを個々に識別できる英数字の文字列のことです。</p>
<p>この RSS を任意の RSS リーダに登録して購読すれば、そのユーザの全ての発言を漏れなく拾うことが可能になります。(*1)</p>
<p>これまた本人には知られないないですし、しかも Google リーダーなどに登録してしまえば、過去の発言の検索性も上がるので、情報源として Twitter を利用したい場合は非常に助かります。<del>ストーｋ</del> 恥ずかしがり屋のあなたには、願ったり叶ったりな状況になりますね。</p>
<p>そんなわけで、新たなフォロワを増やすことなく、気になる人を補足する方法を 2 つほど紹介しました。Twitter の使い方に正解などは無いと思っていますが、自分好みの使い方をする上での一助となれば幸いです。</p>
<p>*1 厳密に言えば、RSS リーダーのクロール速度を、ユーザの発言速度が上回った場合に取りこぼしが発生する可能性があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20101002/twitter-list-rss-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Twitter4J から OAuth 認証部分だけを利用する方法</title>
		<link>http://www.otchy.net/20100912/using-twitter4j-oauth-authentication/</link>
		<comments>http://www.otchy.net/20100912/using-twitter4j-oauth-authentication/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 17:10:08 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1144</guid>
		<description><![CDATA[※前置き長いです。本題はここから。
9/6 ごろから 9/9 にかけて、TwitMgr と Splitwit の OAuth 認証が正しく動作しなくなってしまっていました。
これらは、JavaScript で Twitt [...]]]></description>
			<content:encoded><![CDATA[<p>※前置き長いです。<a href="#start_main">本題はここ</a>から。</p>
<p>9/6 ごろから 9/9 にかけて、<a href="/twitmgr/" target="_blank">TwitMgr</a> と <a href="/splitwit/" target="_blank">Splitwit</a> の OAuth 認証が正しく動作しなくなってしまっていました。<br />
これらは、JavaScript で Twitter API を扱うライブラリとして、<a href="/twit-api/">TwitAPI.js</a> を使っており、それがうまく動作していなかったのです。で、原因を追ったところ、JavaScript 側ではなく、OAuth 認証を肩代わりするプロキシサーバである <a href="http://code.google.com/p/taj-proxy/" target="_blank">taj-proxy</a> 側に問題があることがわかったので、今回はそれを直したときの話です。</p>
<p>そもそも、taj-proxy は、開発当初 GAE/j 上でうまく Twitter OAuth 認証を扱えるライブラリがなかった (と思っていた) ため、OAuth 認証部分をすべて独自実装してました。Twitter 側の何らかの実装の変更により、その独自実装がうまく動かなくなったようなのですが、ぱっと見では全然原因が分かりませんでした。(多分 Signature 周りだとは思う)<br />
それで改めて、Twitter OAuth 認証を扱えるライブラリを探したところ、<a href="http://twitter4j.org/" target="_blank">Twitter4J</a> という超メジャーなライブラリが、GAE/j に対応していることがわかり、早速使用させてもらうことにした次第です。</p>
<p>Twitter4J では、Twitter API と一対一に対応した java のメソッドが用意されており、きわめて簡単に TwitterAPI を利用することができます。(設計思想としては、初代の <a href="/twitter-api/">TwitterAPI.js</a> に似てますね。)<br />
ところが、TwitAPI.js では、将来的な TwitterAPI の拡張もにらんで、任意のパスを渡して TwitterAPI を利用することができるようになっているため、そのままでは JavaScript 側から渡されたパスを Twitter4J のメソッドに翻訳する必要が出てしまい、単に適用するだけでは済みませんでした。</p>
<p>そこで、Twitter4J の便利メソッドは使用せず、Twitter4J として用意されている各種のクラスを使用して、OAuth 部分だけを利用させてもらったので、その方法についてまとめておきます。</p>
<p><a name="start_main"></a>ここから本題です。長い前置きでした‥。</p>
<h4>リクエストトークンを取得する</h4>
<p>Twitter API を OAuth で使用する際に、開発者側で必要な ConsumerKey と ConsumerSecret はすでに取得済みなことを前提とします。もしまだでしたら、ほかの情報を当たってください。<br />
ここではまず、これから始める OAuth 認証のために必要なリクエストトークン (使い捨てパスワードのようなもの) を取得します。</p>
<p>下記の疑似コードでは捨ててますが、consumerKey と consumerSecret から、requestToken と requestTokenSecret を取得するまでがポイントです。この時点ではまだユーザには何も提示しておらず、ここで取得した requestToken を次に使います。また、requestTokenSecret も必ずペアで保持しておきます。</p>
<pre>
Configuration conf = ConfigurationContext.getInstance();
OAuthAuthorization oauth = new OAuthAuthorization(conf, <span style="color:blue;">consumerKey</span>, <span style="color:blue;">consumerSecret</span>);
HttpClientWrapper http = new HttpClientWrapper(conf);
try {
    HttpResponse res = http.post(conf.getOAuthRequestTokenURL(), oauth);
    String result = res.asString();
    if (res.getStatusCode() != 200) {
        System.out.println(result);
        return false;
    }
    Map&lt;String, String&gt; results = OAuthUtil.parseResult(result);
    String <span style="color:blue;">requestToken</span> = results.get("oauth_token");
    String <span style="color:blue;">requestTokenSecret</span> = results.get("oauth_token_secret");
} catch (TwitterException e) {
    e.printStackTrace();
    return false;
}
return true;
</pre>
<pre>
public static Map&lt;String, String&gt; parseResult(String result) {
    String[] results = result.split("&#038;");
    Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
    for (String param : results) {
        String[] kv = param.split("=");
        String key = kv[0];
        String value = kv[1];
        map.put(key, value);
    }
    return map;
}
</pre>
<h5>Twitter4J の役者たち</h5>
<dl>
<dt>Configuration クラス</dt>
<dd>Twitter4J の設定情報を保持しています。シングルトンなので、こうしてインスタンスを取得して様々に使用します。</dd>
<dt>OAuthAuthorization クラス</dt>
<dd>Twitter4J で OAuth の認証情報を扱うクラスです。この時点ではまだ consumerKey と consumerSecret しか持ちません。</dd>
<dt>HttpClientWrapper クラス</dt>
<dd>GAE/j では外部サイトに対してソケットを開くことができず、Apache Commons Http Client などの普通の HttpClient は軒並み全滅という状況の中、HttpClientWrapper は、GAE/j でも利用可能な HttpURLConnection も状況に応じて使用して GAE/j 上でもスムーズな動作を可能とした、超ナイスなクラスです。</dd>
</dl>
<h5>独自メソッド</h5>
<dl>
<dt>OAuthUtil.parseResult メソッド</dt>
<dd>HttpResponse#asString() メソッドでは、単にサーバからのリプライを文字列で返してきます。Twitter API の仕様上、OAuth 認証段階では、名前=値&#038;名前=値&#038;名前=値&#8230; という文字列が返ってくるので、それを Map にパースするだけです。</dd>
</dl>
<h4>OAuth 認証の要求</h4>
<p>単に以下の URL をユーザに表示して (通常、ブラウザであればリダイレクト) ユーザからの認証許可を待ちます。<br />
認証が許可されると、ConsumerKey を取得した際に登録したコールバック URL に結果が返ってきます。</p>
<pre>
https://twitter.com/oauth/authorize?oauth_token=<span style="color:blue;">requestToken</span>
https://twitter.com/oauth/authenticate?oauth_token=<span style="color:blue;">requestToken</span>
</pre>
<p>ここで、authorize は、必ず毎回ユーザの手動による認証が必要になります。<br />
authenticate の場合、初回のみ認証が必要なだけで、一回認証してしまえば次回からは自動的にコールバックが呼ばれるようになります。大半のウェブサービスではこちらを使ってますね。<br />
ちなみに TwitAPI.js では、その性質上<a href="/20100816/oauth-with-javascript-and-security/">簡単に認証情報を横取りすることが可能</a>なので、authorize のみ利用可能にしています。</p>
<h4>アクセストークンの取得</h4>
<p>ユーザから OAuth 認証が許可されると、コールバック URL に結果が返ってきます。その際、リクエストパラメータとして oauth_token が渡されるので、これを requestToken と見なし、ペアで保持しておいた requestTokenSecret を取り出します。</p>
<p>再度 Twitter サーバに問い合わせた結果得られる、oauth_token と oauth_token_secret が、真に重要なアクセストークンになります。これがいわば、OAuth 認証の結果得られた、対象アプリケーション専用のパスワードのようなものです。その際、各ユーザのユニークキーである user_id と表示上の名前である screen_name が得られるので、これらすべてをセットにして保持しておきます。<br />
ただ、screen_name に関してはユーザ設定で変更も可能なので、もしアプリ側でユーザごとの情報を何か保存する場合、user_id に関連づけて保存しておく必要があります。</p>
<pre>
Configuration conf = ConfigurationContext.getInstance();
AccessToken accessToken = new AccessToken(<span style="color:blue;">requestToken</span>, <span style="color:blue;">requestTokenSecret</span>);
OAuthAuthorization oauth = new OAuthAuthorization(conf, consumerKey, consumerSecret, accessToken);
HttpClientWrapper http = new HttpClientWrapper(conf);
try {
    HttpResponse res = http.post(conf.getOAuthAccessTokenURL(), oauth);
    String result = res.asString();
    if (res.getStatusCode() != 200) {
        System.out.println(result);
        return false;
    }
    Map&lt;String, String&gt; results = OAuthUtil.parseResult(result);
    String <span style="color:blue;">accessToken</span> = results.get("oauth_token");
    String <span style="color:blue;">accessTokenSecret</span> = results.get("oauth_token_secret");
    String <span style="color:blue;">userId</span> = results.get("user_id");
    String <span style="color:blue;">screenName</span> = results.get("screen_name");
} catch (TwitterException e) {
    e.printStackTrace();
    return false;
}
return true;
</pre>
<h5>Twitter4J の役者たち</h5>
<dl>
<dt>AccessToken クラス</dt>
<dd>Twitter4J で OAuth のトークン情報を扱うクラスです。この時点では一時パスワードに相当する、requestToken を保持します。</dd>
<dt>OAuthAuthorization クラス</dt>
<dd>前と違って、取得済みのリクエストトークン情報も渡します。こうすることで、先ほどユーザが OAuth 認証した結果を結びつけて Twitter 側に伝えることができます。</dd>
</dl>
<h4>Twitter API の呼び出し</h4>
<p>accessToken と accessTokenSecret が得られれば、後はそれを使って任意の Twitter API が呼び出せるようになります。<br />
Twitter API は使用する HTTP メソッドにより効果が異なるので GET/POST/DELETE に応じて、使用する Java のメソッドが異なります。</p>
<pre>
Configuration conf = ConfigurationContext.getInstance();
AccessToken accessToken = new AccessToken(<span style="color:blue;">accessToken</span>, <span style="color:blue;">accessTokenSecret</span>);
OAuthAuthorization oauth = new OAuthAuthorization(conf, consumerKey, consumerSecret, accessToken);
HttpClientWrapper http = new HttpClientWrapper(conf);
String <span style="color:blue;">url</span> = "https://twitter.com/some_api_path.json";
HttpParameter[] parameters = new HttpParameter[]{new HttpParameter(name1, value1), new HttpParameter(name2, value2)};

try {
    HttpResponse res = http.get(url, parameters, oauth);
    // HttpResponse res = http.post(url, parameters, oauth);
    // HttpResponse res = http.delete(url, parameters, oauth);
    String result = res.asString();
    if (res.getStatusCode() != 200) {
        System.out.println(result);
        return false;
    }
    // Document document = res.asDocument(); // for xml
    // JSONObject jsonObj = res.asJSONObject(); // for json object
    // JSONArray jsonArr = res.asJSONArray(); // for json array
} catch (TwitterException e) {
    e.printStackTrace();
    return false;
}
return true;
</pre>
<h5>Twitter4J の役者たち</h5>
<dl>
<dt>AccessToken クラス</dt>
<dd>前と違って、一時パスワードに当たる requestToken ではなく、認証済みの accessToken を保持します。</dd>
<dt>OAuthAuthorization クラス</dt>
<dd>認証済みのアクセストークン情報も渡すことで、任意の API を呼び出し可能になります。</dd>
<dt>url</dt>
<dd>任意の Twitter API の URL が指定可能です。Twitter API の仕様として「拡張子」に当たる部分を、json とか xml に変えると、Twitter が返す結果のフォーマットを制御できます。詳しくは、Twitter API のドキュメントを参照してください。</dd>
<dt>HttpParameter クラス</dt>
<dd>HttpClientWrapper クラスに、任意のパラメータを渡すために使います。どういったパラメータが有効に機能するかは、Twitter API のドキュメントを参照してください。</dd>
</dl>
<h4>あとがき</h4>
<p>Twitter4J を使用するほとんどの人は、最初から用意されている便利メソッドで十分事足りると思うので、OAuth 部分のみ使用するといった用途は限定的かと思います。例えば、Twitter4J 未対応の新 API を使いたい場合や、今回のケースのように独自のアプリで変わったことをしたい場合などでしょうか。<br />
ただ、そういった用途を想定したかのように、Twitter4J のクラス郡は非常によくできていて、とても使いやすいので助かりました。<br />
改めて、Twitter4J の作者様には謝辞を述べたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100912/using-twitter4j-oauth-authentication/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Splitwit Ver 1.2.0 リリース。OAuth＋逆順投稿。</title>
		<link>http://www.otchy.net/20100825/splitwit-ver-120-release/</link>
		<comments>http://www.otchy.net/20100825/splitwit-ver-120-release/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 04:50:44 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1142</guid>
		<description><![CDATA[Splitwit の Ver 1.2.0 をリリースしました。
まず、TwitMgr に引き続き、OAuth 対応を果たしました。何とか、BASIC 認証の期限に間に合って良かったです。
また、要望の多かった逆順投稿につ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/splitwit/" target="_blank">Splitwit</a> の Ver 1.2.0 をリリースしました。</p>
<p>まず、<a href="/twitmgr/" target="_blank">TwitMgr</a> に引き続き、OAuth 対応を果たしました。何とか、BASIC 認証の期限に間に合って良かったです。<br />
また、要望の多かった逆順投稿について対応しました。</p>
<p>逆順投稿については、投稿者自身のプロフィールページで見たり、普通のフォロワーの TL 上では、上から順に読めるので読みやすくなる一方、TL の流量が多い人から見ると、途中で分断されてかえって読みにくくなる事がある諸刃の剣かとは思います。<br />
まあ、Splitwit の連続投稿に割り込まれるレベルで TL の流量が多いユーザは、そんなに多くないとは思うので、実用上問題になるケースは稀少でしょう。</p>
<p>それと、ヒントの表示の仕方を今風の味付けにしました。<br />
今後、機能追加をしていくと、ヒントの行数がかさんでくるかも？という考えがあって、事前にスペースを確保したというところです。</p>
<p>他にも追加機能の要望を頂いているので、実装方法について検討してみようと思います。<br />
まずは、OAuth 対応を間に合わせることが重要だったので、いったんリリースします。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100825/splitwit-ver-120-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript による OAuth 認証とそのセキュリティ</title>
		<link>http://www.otchy.net/20100816/oauth-with-javascript-and-security/</link>
		<comments>http://www.otchy.net/20100816/oauth-with-javascript-and-security/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 04:05:33 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1136</guid>
		<description><![CDATA[TwitMgr のバージョンアップを行いました。
OAuth 対応がメインではありますが、地味に日本語の表現を修正して、初見でもやれることが分かりやすくなっているかと思います。
BASIC 認証から、OAuth 認証へ変 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/twitmgr/" target="_blank">TwitMgr</a> のバージョンアップを行いました。<br />
OAuth 対応がメインではありますが、地味に日本語の表現を修正して、初見でもやれることが分かりやすくなっているかと思います。</p>
<p>BASIC 認証から、OAuth 認証へ変更するにあたっては、どうしても使い勝手が低下してしまうのは避けようがないところで、そこが残念ではあります。<br />
どうせ OAuth 認証にするならいっそ、サーバサイドをしっかり作り込めばユーザビリティの低下を最小限に抑えられるはずなのですが、元々 JavaScript だけで作られていたものを移植するとなると、ほぼ作り直しになってしまうので、現状で出来る唯一の手段としてはこんなところです。</p>
<p>というのは前置きでして、JavaScript による OAuth 認証について突っ込んで考えたので、以下本論。</p>
<p><a href="/javascript/twitter-api2/">TwitterAPI2.js</a> (というか実質は、<a href="/javascript/twit-api/">TwitAPI.js</a>) を使った OAuth 認証では、js ファイルを読み込むたびに、毎回必ず OAuth 認証の確認画面を表示する仕様としています。<br />
プロキシサーバで OAuth 認証を行う構成なので、やろうと思えば、初回アクセス時のみ確認を取る、という事も可能なのですが、そのようにしていないのにはセキュリティ上の理由があります。</p>
<p>TwitAPI.js では、同ライブラリで公式のプロキシサーバを用意していて、公式プロキシサーバに対して許可した OAuth 認証については、その情報がプロキシサーバ側に残ります。<br />
なので、毎回、認証画面を表示するようにしないと、あるアプリ A に対して許可したつもりの OAuth 認証が、他のアプリ B からも簡単に流用できてしまうのです。<br />
毎回許可を得る形であれば、他のアプリ B から無言でいきなり OAuth 認証が悪用されることは避けられます。</p>
<p>クッキーに保存した情報を組み合わせて認証することで、あるアプリ A (ドメイン a) に対して許可した認証を別のアプリ B (ドメイン b) から利用させないようにする実装も検討しましたが、TwitAPI.js の立場から、任意のアプリ A が信用できない以上、アプリ A に XSS があれば同じ事になってしまうので、クッキーを使った実装も見送りました。</p>
<p>Twitter API を JavaScript から利用可能にするための実装は、TwitAPI.js 以外にも見かけますが、そういったセキュリティ上の対応はどうなっているんでしょうかね？調べたことはないですが興味はあります。</p>
<p>JavaScript の場合、そのソースが、設定情報も含めて全て公開されてしまうので、OAuth 認証において本来であれば秘匿すべき情報 (Consumer secret とか最たるもの) を隠すのは困難です。というか、原理的に不可能です。</p>
<p>TwitAPI.js では、プロキシサーバを経由することで、TwitAPI.js 専用のハッシュを発行して Consumer secret を秘匿していますが、専用ハッシュが漏れた場合に備え、前述の「毎回認証画面」でセキュリティを保っているという形です。(専用ハッシュが漏れなくても、TwitAPI.js では共通プロキシを使用している時点で必須です。)<br />
JavaScript で簡単に OAuth を利用したいという要求と、セキュリティを担保するという要求は相反する点が多く、現状で考え得る落としどころはそこであろうという判断です。</p>
<p>JavaScript による OAuth 認証で、初回のみ認証画面が表示されるような実装のアプリがあった場合、原理的にその OAuth 認証は、他のアプリから悪用されうるのではないかと考えています。<br />
この点、もっとスマートに解決するやり方があれば、是非、識者の意見を伺いたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100816/oauth-with-javascript-and-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitAPI.js Ver 0.1.3 / TwitterAPI2.js Ver 2.0.1 公開</title>
		<link>http://www.otchy.net/20100814/twitapi-013-twitterapi2-201-had-released/</link>
		<comments>http://www.otchy.net/20100814/twitapi-013-twitterapi2-201-had-released/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 16:08:32 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1130</guid>
		<description><![CDATA[TwitAPI.js については、Ver 0.1.2 を公開したばかりでしたが、TwitterAPI2.js の Ver 2.0.1 に合わせてバージョンがあがりました。
ぶっちゃけていうと、TwitterAPI2.js [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/javascript/twit-api/">TwitAPI.js</a> については、Ver 0.1.2 を公開したばかりでしたが、<a href="/javascript/twitter-api2/">TwitterAPI2.js</a> の Ver 2.0.1 に合わせてバージョンがあがりました。</p>
<p>ぶっちゃけていうと、TwitterAPI2.js にいろいろとバグがあって使い物にならないケースがあったので慌ててアップしたという形です。<br />
バグ以外にも、既存の TwitterAPI.js でサポートしていながら、TwitAPI.js でサポートできていなかった機能も追加して、結果的に互換性が向上しています。</p>
<p>これでようやく、TwitMgr の OAuth 対応が完了しそうな感じです。<br />
こちらも近日公開予定。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100814/twitapi-013-twitterapi2-201-had-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TwitAPI.js Ver 0.1.2 公開</title>
		<link>http://www.otchy.net/20100813/twitapi-js-010-had-published-2/</link>
		<comments>http://www.otchy.net/20100813/twitapi-js-010-had-published-2/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 04:47:48 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1122</guid>
		<description><![CDATA[ずいぶん長い間放置してしまっていましたが、OAuth 認証対応版、Twitter API 用 JS ライブラリ、TwitAPI.js の Ver 0.1.2 を公開しました。
初回認証時に、サーバからのレスポンスが遅いと [...]]]></description>
			<content:encoded><![CDATA[<p>ずいぶん長い間放置してしまっていましたが、OAuth 認証対応版、Twitter API 用 JS ライブラリ、<a href="/javascript/twit-api/">TwitAPI.js</a> の Ver 0.1.2 を公開しました。</p>
<p>初回認証時に、サーバからのレスポンスが遅いと無反応になってしまう問題に対応するため、レスポンスが返るまでの間、waiting の表示を入れるようにしました。<br />
ローディング画像風の動くテキスト表示なんかも入れたので、ユーザビリティは向上したんじゃないかと思います。</p>
<p>そろそろ Twitter API の BASIC 認証も期限切れなので、このバージョンと <a href="/javascript/twitter-api2/">TwitterAPI2.js</a> を使って <a href="/twitmgr/" target="_blank">TwitMgr</a> と <a href="/splitwit/" target="_blank">Splitwit</a> の OAuth 対応もちゃちゃっと済ませたいところですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100813/twitapi-js-010-had-published-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript で手軽に OAuth、TwitterAPI2.js 公開</title>
		<link>http://www.otchy.net/20100617/twitter-api2-js-publishe/</link>
		<comments>http://www.otchy.net/20100617/twitter-api2-js-publishe/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 17:47:50 +0000</pubDate>
		<dc:creator>Otchy</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.otchy.net/?p=1108</guid>
		<description><![CDATA[BASIC 認証で Twitter API を利用する TwitterAPI.js の後継ライブラリとして、OAuth 認証を行う TwitAPI.js はすでに公開済でしたが、後継ライブラリといってもインターフェースの [...]]]></description>
			<content:encoded><![CDATA[<p>BASIC 認証で Twitter API を利用する <a href="/javascript/twitter-api/">TwitterAPI.js</a> の後継ライブラリとして、OAuth 認証を行う <a href="/javascript/twit-api/">TwitAPI.js</a> はすでに公開済でしたが、後継ライブラリといってもインターフェースの互換が無く、TwitterAPI.js で作られたアプリケーションを OAuth 対応させるには一手間必要でした。</p>
<p>そこで、TwitAPI.js を従来と同じインターフェースで利用可能にするラッパを <a href="/javascript/twitter-api2/">TwitterAPI2.js</a> として公開しました。</p>
<p>元々 TwitterAPI.js を使っているアプリケーションであれば、読み込むライブラリを差し替えるだけで、従来と同じように使う事が出来ます。<br />
TwitMgr や Splitwit もこちらのライブラリに置き換え予定ですが、出来れば置き換え前に、TwitAPI.js に残った TODO を片づけたいですねー。</p>
<p>特に、認証用のポップアップの起動が遅いのはなんとかしたいです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.otchy.net/20100617/twitter-api2-js-publishe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

