ラベル Twitter の投稿を表示しています。 すべての投稿を表示
ラベル Twitter の投稿を表示しています。 すべての投稿を表示
2014/01/11

[Android]TwitterのOAuth認証を行う

Android で Twitter の OAuth って前は WebView で行うのが一般的だった気がします。

でもアプリ内の WebView で実装した場合は、
ユーザー側にはそれが本物なのかフィッシングなのか区別できません。

OAuthの認証にWebViewを使うのはやめよう - Shogo's Blog
アプリ内でWebViewを使うとURLが表示されません. つまり 本当にツイッターにアクセスしているかわからない のです. もし,表示されるのが偽の認証画面だったら,アプリから簡単にパスワードがわかってしまいます.

じゃあ,URL を表示させればいいかというとそういうわけでもありません. 画面上のURL表示なんて簡単に偽装できてしまいます. どんな工夫をしても アプリがパスワードの要求をしていることには変わりありません . アプリはパスワードを簡単に取得できます.

アプリのユーザはTwitterに限らずSNSへのログイン時にブラウザを開かないアプリは信用しないようにしましょう. どこかでパスワードの抜かれている可能性があります. (ただし,公式アプリは除く.公式アプリが信用できないならそもそもサービスを利用できないもんね.)

じゃあ外部のブラウザアプリを開いて、
カスタム URL スキームを Intent Filter で拾うよ。

外部のブラウザアプリなら普段ユーザーが使っているし、アプリ側から偽装はできないよね?
本物かどうか区別できるから安全だよね?ってコードがこちらです。
public class TwitterAuthActivity extends FragmentActivity {

    private AsyncTwitter mTwitter;
    private static final String CONSUMER_KEY = "Your CONSUMER_KEY";
    private static final String CONSUMER_SECRET = "your CONSUMER_SECRET";
    private static final String CALLBACK_URL = "yourapp://twitter_callback/";
    private RequestToken mRequestToken;

    private TwitterListener mTwitterListener = new TwitterAdapter(){
        @Override
        public void gotOAuthRequestToken(RequestToken token){
            mRequestToken = token;
            final Intent intent = IntentUtils.createOpenBrowserIntent(mRequestToken.getAuthorizationURL());
            startActivity(intent);
        }

        @Override
        public void gotOAuthAccessToken(AccessToken token){
            // save access token
            finish();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        mTwitter = new AsyncTwitterFactory().getInstance();
        mTwitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        mTwitter.addListener(mTwitterListener);
        mTwitter.getOAuthRequestTokenAsync(CALLBACK_URL);
    }

    @Override
    protected void onNewIntent(Intent intent){
        super.onNewIntent(intent);
        Uri uri = intent.getData();
        if(uri != null && uri.toString().startsWith(CALLBACK_URL)){
            String verifier = uri.getQueryParameter("oauth_verifier");
            if(verifier != null){
                LogUtils.d(verifier);
                mTwitter.getOAuthAccessTokenAsync(mRequestToken, verifier);
            }else{
                // User canceled!
                finish();
            }
        }else{
            // other
            finish();
        }
    }

}
<activity
    android:name=".TwitterAuthActivity"
    android:launchMode="singleTask" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="twitter_callback"
            android:scheme="yourapp" />
    </intent-filter>
</activity>
OAuthの認証にWebViewを使うのはやめよう - Shogo's Blog
ポイントは以下の点です。
  • Twitter へのアプリケーション登録時に Callback URL にテキトーなURLを入れておく
  • 独自スキーマを定義して,受け取れるようにしておく
  • getOAuthRequestToken 呼び出し時に,Callback URL を明示的に渡す
  • アクティビティの多重起動を防止しておく
確認すべきはカスタム URL スキーマが被った(被せられた)場合に
AccessToken を奪われる可能性があるけど大丈夫?という点。
特定条件下におけるOAuth 2.0の認可応答を奪取されるリスクとその対策について - r-weblife
今回は、「ネイティブアプリケーションからOAuth 2.0を使うとき、特定の条件下において、正規のClientではない悪意のある第3者に認可応答を持って行かれて、その結果Access Tokenを取得できちゃうリスクがあるよね。どうしようか。」っていう話です。

条件っていうのは、

OAuth 2.0のClientはネイティブアプリケーションであり、Client Credential(client_id/client_secret)を安全に管理できない
Clientは外部のブラウザを立ち上げ、ユーザーは認可要求のURLにアクセスする。この時にいわゆるImplicit GrantやAuthorization Code Grantを使う
ユーザーがリソースアクセスを許可した後、認可応答はカスタムURIスキームでClientに渡る
というところです。

なんでこれで認可応答を持って行かれるかというと、カスタムURIスキームの扱いです。

認可要求を送ったClientに認可応答が戻ってくれればよいのですが、カスタムURIスキームを被せてきた(たまたま一緒だっただけかもしれない)別のアプリケーションに認可応答が渡る可能性があると。

で、このあたりのルールが”アプリを選択させる”、“先にインストールした方が優先”、“後にインストールした方が優先”、とかOSに依存するので悩ましい。
Android アプリである限り ConsumerKey/ConsumerSecret は漏れる。
たぶんリバースエンジニアリングとかで。詳しい手法は知らない。
同様にして AndroidManifest.xml の Intent Filter で受け取るカスタム URL スキーマもわかるんじゃないかな?
ということで カスタム URL スキームを Intent Filter で拾う手法は
狙われたらアウト、狙われなければセーフ的なギリギリのラインで危険で安全な手法。非推奨
上のコードで実装して何かあっても責任取れませんってやつです。

カスタム URL スキームが被る(被せられる)から問題なんだよね?
じゃあ動的に生成すれば被せられることはないんじゃない?

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_VIEW);
    filter.addCategory(Intent.CATEGORY_BROWSABLE);
    filter.addCategory(Intent.CATEGORY_DEFAULT);
    filter.addDataScheme("http"); // http じゃないとブラウザからレシーブできない
    filter.addDataAuthority(RandomStringUtils.randomAlphanumeric(20), null);
    registerReceiver(mIntentReceiver, filter);
}

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver(){
    @Override
    public void onReceive(Context context, Intent intent){
        Uri uri = intent.getData(); // ドメイン部分しか取れない
    }
};
コメントに書いてある通り無理だった…。
<activity
    android:name=".TwitterAuthActivity"
    android:launchMode="singleTask" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data
            android:host="twitter_callback"
            android:pathPattern=".*"
            android:scheme="yourapp" />
    </intent-filter>
</activity>
    private static final String CALLBACK_URL = "yourapp://twitter_callback/" + RandomStringUtils.randomAlphanumeric(20);
より複雑にしてみたらどうだろうと思ったけどシンプルな方でも拾えるので意味がなかった。

ということでカスタム URL スキームを Intent Filter で受け取る手法を安全にするのは難しそうです。

ではどうすればいい?

OAuthの認証にWebViewを使うのはやめよう - Shogo's Blog
PIN コードを利用

一つ目の方法はPC版クライアントでよく使われる方法. 認証後にPINコードと呼ばれる数字が表示されるので,それをアプリに入力します. twiccaなんかでも使われてますね. Twitter へのアプリケーション登録のときにコールバックURLを入力しないとこの認証方式になります.
ユーザーが自分でアプリに戻ってきて PIN を入力してくれれば
他のアプリに認証情報を取られるということがないという原始的な安全性の担保方法です。
原始的だからこそ付け込む隙がなくて安全なわけですね。

PIN コードさえ利用すれば安全?

いまさらブログ: Androidの脆弱性(まとめ版)
WebViewの addJavascriptInterface()の危険性(参考)が、Android 3.x/4.0/4.1 ではWebViewそのものに存在する。
このためWebViewをそのまま使っているアプリや、WebViewのラッパにすぎない標準ブラウザに同様の脆弱性がある。(Android版ChromeはWebViewを使っていないので問題ないです)

(中略)

Android 標準ブラウザや WebView クラスを利用しているアプリで、細工されたウェブページを閲覧した際に、ユーザの意図に反して Android OS の機能を起動されたり、任意のコードを実行されたりする可能性があります。
Android 4.2 未満の標準ブラウザや WebView では、
入力してアプリに保存した ID とパスワードを読み取られる可能性があります。
PIN コードを利用しようが、カスタム URL スキームを Intent Filter で受け取ろうが
Android 4.2 未満の標準ブラウザや WebView を利用した時点で安全とは言い切れなくなります。
しかも自分のアプリで気をつけていても他のアプリに問題があれば
自分のアプリの保存した ID とパスワードを読み取られる可能性があるようです。
参考
Androidアプリセキュリティ〜WebViewの注意点(1)〜 | Android | Developers AppKitBox
Androidアプリセキュリティ〜WebViewの注意点(2)〜 | Android | Developers AppKitBox

どんなに頑張っても危険があってツラい…

iOS みたいに端末に設定したアカウントを使えるとか何か良い方法ないんですかね?

参考にしたサイトまとめ

OAuthの認証にWebViewを使うのはやめよう - Shogo's Blog
TwitterのOAuthの問題まとめ
TwitterのOAuthの問題の補足とか
特定条件下におけるOAuth 2.0の認可応答を奪取されるリスクとその対策について - r-weblife
いまさらブログ: Androidの脆弱性(まとめ版)
Androidアプリセキュリティ〜WebViewの注意点(1)〜 | Android | Developers AppKitBox
Androidアプリセキュリティ〜WebViewの注意点(2)〜 | Android | Developers AppKitBox
2013/03/31

画像の重ね方メイキング ~ HTML5validなOGPとかTwitterCardsとかjQueryUIとかTwitterBootstrapとかgoogle-code-prettifyとか

HTML/CSS/JavaScriptを駆使した画像の重ね方 | DevAchieveで制作した
サンプルページ「Way to cover an image with another image」で
色々普段使わないものを使ったので忘れないようにメモしておく。

HTML5validなOGP設定

後述の Twitter Cards が HTML5invalid だよーというのを聞いて
バリデーションにかけてみたら見事にエラーが出てきた。
xmlns 属性による指定ではなく、 prefix 属性で指定しなさいということらしい。
<html lang="ja" prefix="og: http://ogp.me/ns#">
関連
The W3C Markup Validation Service
OGPの記述後もValidなHTML5文書にするマークアップ方法のメモ|Blog|Skyward Design
The Open Graph protocol

Twitter Cards

Twitter Cards を指定すれば Web でツイートを開いた時にサイトの情報を表示できるので指定してみた。
Way to cover an image with another imageの指定で言えば以下のような感じ。
<meta name="twitter:card" content="summary">
<meta name="twitter:url" content="http://wada811.github.com/sample/imageCover/index.html">
<meta name="twitter:title" content="Way to cover an image with another image">
<meta name="twitter:description" content="HTML/CSS/JavaScriptを駆使した画像を重ねる方法のまとめ。HTML5(Canvas)/CSS3もあるよ!画像は@kazoo04氏のアイコン素材を使わせて頂きました!ありがとうございます!">
<meta name="twitter:image" content="http://wada811.github.com/sample/imageCover/img/kazoo04-background.png">
<meta name="twitter:site" content="@wada811">
<meta name="twitter:creator" content="@wada811">
しかし、これは HTML5invalid である。name 属性に知らない値が設定されているのでエラーになる。
Twitter Cards meta - HTML5 Validation issue | Twitter Developersのコメントには
name を property に変えれば良いと書かれている。
試しに以下のプレビューツールで確認すると問題なく表示されることがわかる。
Preview your Twitter Card | Twitter Developers
ちなみにキャッシュがあるようで適当な指定でツイートしてしまうと
その後、指定を変えてもしばらくは反映されないので注意。
無用なトラブルを避けるために確認はプレビューツールでしよう。
関連
Twitter Cards | Twitter Developers

jQueryUI で リッチなタブ UI を作る

適当にソースコードを載せたらコレ以上に縦長になってしまうし、jsdo.itみたいな表示がしたかったので
探したらjQuery UIのタブが良さそうだった。
実装も簡単だし、他の UI も便利そうだったから色々使っていきたい。
関連
Tabs | jQuery UI

Twitter Bootstrap

Twitter Bootstrap は前にも使ったことあるけど一応。
Canvas で合成した画像を作成するときのボタン用に。
あとソースコード表示にも使った。
関連
Buttons | Base CSS | Bootstrap

google-code-prettify

Twitter Bootstrap のソースコード表示に使われている google-code-prettify を今回は使った。
Twitter Bootstrap と組み合わさった時の表示がいまいちだったのでスタイルをいじった。
.prettyprint {
    margin: 0 !important; /* Twitter Bootstrap が pre.prettyprint に margin-bottom をつけるため */
    overflow-x: scroll;
}
関連
Bootstrap:google-code-prettify

Canvas で複数枚の画像を描画、合成する

先人のおかげでほとんど苦労せずに描画することができた。
Canvas ってサイズ指定を CSS でできない?気のせいか効かなかったので JavaScript で指定した。
参考
Canvasに画像を複数枚重ねて描画するには » RIAxDNP
sinatra + html5_canvas + jquery 画像ドラッグドロップでファイル保存 - 麺処 まつば
2012/09/08

Twitter API が v1.1 になったから Overview を訳してみた

Current status: API v1.1 | Twitter Developers
結構早かったですね。
Overview: Version 1.1 of the Twitter API | Twitter Developersを意訳しました。

Twitter API v1.1はローンチ以来、初めてのAPIアップデートです。
我々はそれが開発者にとって何を意味するのか興奮しているし、
ここにすべての意味のある変更を補足したので
どんな小さなことも見逃さないでください。
  1. 改良されたレートリミット
  2. JSONのみのサポート
  3. すべてのエンドポイントで認証は必須
  4. 開発者ルールのアップデート
  5. 開発者ディスプレイ要件
  6. 新しいTwitterクライアントポリシー
  7. entities と retweets のデフォルト化
  8. API v1.0 の廃止
  9. dev.twitter.com のアップデート
  10. フィードバックと次のステップ

改良されたレートリミット

我々は、エンドポイント毎に15分のスパンにレートリミットのウインドウ(?)を分割して、
ほとんどの個々の呼び出しはそれぞれのウインドウで15リクエストを可能にしている。
(訳注※ほとんどの API は15分に15回のリクエストが可能)
ほとんどの場合、あなたは以前より多くのエンドポイント毎の API 呼び出しができるでしょう。
他の幅広く使われている API は、ウインドウ毎に 180 回の呼び出しができます。
これは GET statuses/show/:id, GET users/lookup, GET search/tweets や他の呼び出しを
行うアプリケーションに特に有利になります。
API v1.1のレートリミットのドキュメントを読むだけでなく、
ここで各エンドポイントごとのレートリミットを確認してください。

JSONのみのサポート

API v1.1 は JSON のみをサポートします。
我々は、まずストリーミング API 、より最近にトレンド API の XML サポートをやめ、
しばらくのあいだ、これをほのめかしてきました。
我々は、プラットフォーム間で共有される JSON フォーマットを支持することを選びました。
したがって、我々は今日使われるのは稀な XML, Atom, RSS のサポートを中止することを決定しました。
歴史的な文脈のため、我々が API を構築した時に、すべての主要な言語は
JSON をサポートする高性能な、よく銀にされたライブラリを持っていませんでした。
しかし、今日ではそれを持っています。

すべてのエンドポイントで認証は必須

v1.1では、我々はアプリケーションにすべてのリクエストは OAuth 1.0a で認証することを要求している。
現在、この(Twitterにとっての)可視性は(Twitterに対する)虐待的な行為を防止できるだけでなく、
アプリケーションのカテゴリによってどのような API を使っているのかを一層理解するのに役立ちます。
より開発者のニーズを満たせるようにその理解を利用して、我々はプラットフォームを進化させ続けます。
この時点で、すべての認証はユーザーのコンテキストを必要としますが、
今後数週間のうちにユーザーのコンテキストを必要としない認証のフォームのサポートを出します。

開発者ルールのアップデート

我々は開発者ルールをアップデートました。
また、あなたが知っておくべき最も重要なポリシーのコンセプトの概要を作成しました。

開発者ディスプレイ要件

我々の以前のディスプレイガイドラインは更新され、現在のディスプレイ要件だと考えられています。
あなたがWebやモバイルのコンテキストでツイートやタイムラインをレンダリングしている場合は
これらの新しいDeveloper Display Requirementsを確認したいと思う。
(訳注※よくわからないけど読んどけよーくらい?ガチガチに強制しているようではない?)

新しいTwitterクライアントポリシー

コアの Twitter 体験を再現するすべてのアプリケーションは、通常"クライアント"と呼ばれ、
10万ユーザートークン制限を含む、いくつかの新しい制限がかけられることになります。
明確にするために、10万ユーザートークン制限はコアの Twitter 体験を複製する少数のクライアントに
適用され、より広いエコシステムの他のアプリケーションの大部分には適用されません。

これらの新しい条項は、我々の更新されたDeveloper Rules of the Roadで詳細に説明されています。

entities と retweets のデフォルト化

該当する場合には、entities やリツイートは現在の v1.1 でデフォルトで返されます。
include_entities が false にされていない限り、Entities が Tweet オブジェクトの一部として返されます。
include_rts が false にされていない限り、公式リツイートがタイムラインに含まれることになります。

API v1.0 の廃止

ほとんどの開発者は v1.0 から v1.1 への移行ですべきことはほとんど何もありませんが、
我々は移行作業をする十分な時間があることを確認したい。
我々は v1.0 をオフにする前に6ヶ月の猶予を提供する予定です。
2013年3月5日以降、v1.0 のエンドポイントは使用できなくなります。

dev.twitter.com のアップデート

dev.twitter.comのドキュメントは API v1.1 での最新の変更と利用可能なメソッドを反映しています。
あなたが v1.0 と v1.1 のどちらのドキュメントを閲覧しているかより区別しやすくするために
各エンドポイントのドキュメントの上にバージョンを示す新しい青い錠剤に気づくでしょう。

フィードバックと次のステップ

あなたが API の新しいバージョンで問題を発見した場合、
気づいたことを報告するために Issue Tracker を使ってください。
最後に、我々は最も一般的な質問に答えるために、v1.1 に関するFAQを作成しました。
あなたがそこで答えを見つけられなかった場合は、
常に我々が利用でき、あなたのフィードバックのすべてをアクティブに聞くことのできる
API v1.1 専用のディスカッションスレッドにいつもポストできます。
我々は v1.1 への進化の過程を通してあなたと働くことを楽しみにしていて、
みんなが構築するものを見るために待つことができない。
今何かと叩かれてる感じあるけど期待してる。
2012/08/19

Twitter API v1.1 変更点まとめ

2012/08/17(金)にTwitter API v1.1についてTwitter開発ブログの記事などが公開されました。
Changes coming in Version 1.1 of the Twitter API | Twitter Developers
Twitterブログ: Twitter API v1.1でのAPI利用ルールの変更について
誤解した人が多かったのか悲観的な声をよく聞いたような気がします。
誤解のないようにまとめておきたいと思います。間違いのないように努めますが本家の情報も見ておいたほうがいいと思います。

大きな変更点は3つ

  1. 全てのAPIエンドポイントに認証が必要になる
  2. 新しいエンドポイント毎のレートリミット方式
  3. デベロッパールールの変更(特に従来のTwitterクライアントのアプリ周り)
※エンドポイント: 簡単に言えばAPIの種類…だと思います。

1.認証が必須に

今までTwitter APIにはSearch APIなど認証が必要でないものがありましたが
v1.1からは全APIエンドポイントが認証必須になります。
認証なしのAPIは誰にでも使えていましたが、
そのため非常に高いレートでAPIを叩くなどAPIの不正利用があったようです。
それを防止し、開発者のニーズを満たすよう進化するためには
どのようなAPIにアクセスしてるかを明確にすることが重要なため認証が必要だそうです。

既にOAuthを使用している開発者のために認証トークンはv1.1への移行でもシームレスに引き継がれます。
認証の必要のないAPIを使用している場合は2013年3月前までにOAuth認証するように更新が必要になります。

2.エンドポイント毎のレートリミット

TwitterのREST APIは現在APIの種類に関係なく350回/時でしたが、v1.1ではエンドポイント毎に60回/時になります。
数字上減ったように見えますが、APIエンドポイント(種類)毎のレートリミットになっているため
ツイートしすぎてふぁぼれないということなどがないので改良だと思います。
60回/時はTwitter APIの利用状況を分析して設定されたもので、ほとんどのアプリケーションのニースを超えるそうです。

また、ツイート表示、プロフィール表示、ユーザーの検索などの大量のエンドポイントを必要とするアプリケーションは
720回/時までのレートリミットが適用されるようです。
詳しくはv1.1のリリースで公開されるドキュメントに記載されるようです。

3.デベロッパールールの変更

  1. Display Guidelinesが表示の必要条件に
  2. プリインストールのクライアントアプリケーションはTwitterによる認定が必要に
  3. 大量のユーザートークンを必要とする場合は開発者は直接Twitterに連絡が必要に

3-1.Display Guidelinesを守る

ツイートについて同一のユーザー体験(@usernameをクリックしたらプロフィールが表示されるなど)が大切だということです。
まともな開発者ならユーザーが期待する動作を作ると思うので問題ないでしょう。

3-2.プリインストールのクライアントアプリケーションはTwitterによる認定が必要

モバイルデバイスやSIMカード、チップセットなどにプリインストールするの場合は、Twitterの承認が必要となります。

3-3.大量のユーザートークンを必要とする場合は開発者は直接Twitterに連絡が必要に

One of the key things we've learned over the past few years is that when developers begin to demand an increasingly high volume of API calls, we can guide them toward areas of value for users and their businesses.
ちょっと意味が良くかわからなかったんだけども連絡してくれたら良い感じにしてくれるのでしょうか。
ユーザートークン数が10万になったら許可が必要になるようです。
もう既に10万ユーザーに達している場合は現在のユーザートークン数の200%までの増加が認められています。
それに達した場合もTwitterに許可が必要になります。

詳しいことが書かれていないので連絡をとったら許可が貰えるのかなどはよくわかりません。
取らぬ狸の皮算用で騒いでも仕方ないので詳しい情報が出るまで静観しておくのが良さそうです。

Twitter API v1.1への移行期間

v1.1がリリースされると同時にv1.0の廃止がアナウンスされます。
リリース後6ヶ月は移行期間となります。
OAuth認証が必須になるので認証するようにアップデートし、
新しいレートリミットでのアプリケーションの挙動をテストするだけの比較的簡単な移行になるでしょう。

今日のTwitterのエコシステム

Twitter Ecosystem
今回のAPIの変更は左上、左下、右下の活動を推奨し、右上の特定のユースケースの制限をしようとするものです。

右上にはツイートキュレーションサービスやツイート発見サイトfavstar.fmなどがありますが、
制限の対象となるのは単に模倣や再現をした従来のツイッタークライアントのようです。
18ヶ月前にもアナウンスしているようですし、新しい価値を提供できないTwitterクライアントはもういらないということでしょう。

近く、v1.1に関する追加情報があるようですのでTwitter開発者ブログをチェックしておいた方が良さそうです。

おまけ

Twitter API ポケットリファレンス (POCKET REFERENCE)Twitter API ポケットリファレンス (POCKET REFERENCE)
今回のAPIのバージョンアップはそれほど影響のあるものではないので
Twitter API ポケットリファレンスはまだまだ使えそうです!
Twitter APIを叩くなら持っておきたいですね。
2012/08/03

Twitter 勉強会 #twtr_hack に行ってきた ~ 懇親会なんてなかった

ReverseAuthとサーバサイドのOAuth ~ そして勉強会へ | DevAchieveで書いた通り、参加してきました。
流れとか内容とかはこっち。

今思えばフラグ



事前にGoogleMapで調べると全然違うビルに目的地マークが。正解は右。
詰んだかと思ったけど駅方向に戻りながら探したら何とか見つけて受付で参加費と懇親会費を先払い。
名刺代わりに胸にTwitterプロフィールのシール貼って近くの人と自己紹介した。名刺持ってなかったから良かった。

主にこの発表を聞きに来てたけど他の発表も良かった。色々勉強になりました。
iOSのTwitterFrameworkを使ってみたら #twtr_hack
seancook/TWiOS5ReverseAuthExample
技術的な話も良かったし、作ったアプリも良かった。Androidユーザーだけど欲しくなった。
@i2key iOSのTwitterFrameworkを 使ってみたら... #twtr_hack - YouTube
そして発表中に再生したのはわたしです/(^o^)\本当に申し訳ありませんでした\(^o^)/

勉強会も終わり、懇親会へ

初参加で知ってる人居ない&行きで迷った&ケータイの電池切れてるという
死亡フラグがビンビンの状況で一人で行動するのはさすがにヤバイと感じた子羊@wada811は
頑張ってコミュ力発揮してついていくために当たりの様子をうかがった!

後ろにフォローしている@sakura_bird1さんらしき人と愉快な仲間たち(ボクの知らない人)がいたけど
顔見知りな雰囲気のところに突っ込んでいく勇気がなかったので
懇親会に参加するという前の人に話しかけてついていくメソッドを実行することにした!

いしき たかい がくせい が あらわれた !

話しかけようかというところで話しかけられた。
流れで会場を出つつ、アプリやってるんですかー?アプリ作りたくてーTwitterでー世界の食をーとか(もはや覚えてない)
教えてくださいーとか夏に自由参加な感じの開発キャンプがあるーとか話しかけられて(勧誘されて?)
良い感じにいたいけな子羊を群れからはぐれさせておいて自分ら懇親会参加しないんでメソッドを発動された!

え?参加しないの?オレ詰みじゃね?ってソワソワしながら別れを告げたら他の参加者の姿はもう無かった…。
うろ覚えのルートで懇親会の会場へ向かうもケータイの電池切れてるしMacを開いても電波ないから辿り着くのは無理ゲー。
連絡手段すら無い状況でフラフラ夜の御茶ノ水をさまよっても無理ゲーすぎるので一旦デジハリに戻ってみることに。
あわよくば他の参加者にすれ違わないかなーとかまだデジハリに居ないかなーとか思ったけど流石にそんなことはなかった。

懇親会なんてなかったんや!そう諦めて帰路に着くことに…。
駅に向かっているとロッテリアのガラスにau Wifiのステッカーが!コレで勝つる!
とりあえず絶品チーズバーガー食べながらMacを開く。
au Wifiは鍵付き。softbankもあったけど契約者のみ…。クソ電波飛ばしてんじゃねー!
再び希望から絶望への相転移を味わいながらポテトをかじっていると
勉強会の途中で懇親会の会場のGoogleMapを開いた記憶が蘇ってきた!ブラウザのキャッシュ!コレで勝つる!
Cmd+Shift+Tで閉じたタブを復元しまくった!

拡大縮小はできなかったけど位置関係からなんとか特定できそうだったので
絶品チーズバーガーのセットでお腹いっぱいだったけど向かってみた!

ルートの周りが懇親会が行われそうな雰囲気の場所ではなかったけど目印見つけてなんとかたどり着いた!

勝った!第三部完!

諦めなければなんとかなるもんだなーと、ビルの扉を開いてみると、ゴッっと鈍い音が。鍵がかかっている…。
隣の扉を試してもダメ、押してもダメ…。張り紙を読んでみると21時で施錠…・
「…の際には右のボタンを押して開けて下さい」という文章をパッと見て、右を見るも何もなし。
よく読んでみると「退場の際には~」だった…。

もうやめて!@wada811のソウルジェムは真っ黒よ!

何か方法はないかと色々見てみるも見えたのはガラスに反射した胸のTwitterプロフィールのシールだけ…。
どうやら夜の御茶ノ水をTwitterアカウント晒しながら歩いていたらしい。なんかもうアレ。
連絡手段もなく、誰かが降りてくるまで待ち続けられるほどの元気がなくなっていたので諦めて帰宅しました…。

こうして@wada811の初めての勉強会は終わったのでした。本当にありがとうございました。
懇親会費は返金してくださるそうです。@yusukeさんにはお手数をお掛けして申し訳ありません…。

2012/07/29

ReverseAuthとサーバサイドのOAuth ~ そして勉強会へ

iOS5から搭載されたiOS Twitter frameworkでは
端末に紐付けたTwitterアカウントを簡単に取ってこれるので
サーバサイドのようにOAuthしなくてもいい。
しかし、iOSだけでなくサーバ側でもTwitterのAPIを叩きたい時に
サーバ側でも認証させなくてはならない。

iOS Twitter frameworkでは通常、AccessTokenが取れないらしいのだが、
iOS Twitter frameworkからReverse AuthすればAccessTokenが取れるらしい。

Using Reverse Auth | Twitter Developers
ReverseAuthするには申請メール送って何やら色々やったりする必要がある。
申請には20日程かかるらしい。ReverseAuthの申請について - Google グループ

また、iOSだけでなくマルチプラットフォーム化するならAccessTokenを取るのは一回に済ませたい。

ということでこの発表がやりたいことに近いようなので発表に期待。

8月1日(水) - Twitter 勉強会 #twtr_hack @デジタルハリウッド東京本校(@dh_tokyo) 【社会人枠】 on Zusaar
8月1日(水) - Twitter 勉強会 #twtr_hack @デジタルハリウッド東京本校(@dh_tokyo) 【学生枠】 on Zusaar

MacBookAirも、持ち運べるカバンも買ったから俺は勉強会に(初)参加するぞー!
2012/04/25

[Twitter][API]改訂で2012年5月14日までに開発者がするべきこと

0.まずTwitter API ポケットリファレンスを買います

以下の該当する項目を修正する

Twitter APIの改訂 - 2012年5月14日 - Google グループ
# https://dev.twitter.com/blog/api-housekeeping の抄訳です
...
1. バージョン抜き、サブドメイン抜きのAPIエンドポイントはサポートされなくなる
例)
http://twitter.com/statuses/user_timeline.xml
のかわりに今後は
https://api.twitter.com/1/statuses/user_timeline.xml
を使用(httpはサポートされますが、httpsの利用を推奨しています)

またOAuth関連も同様 http://twitter.com ではなくhttps://api.twitter.com/oauth/* を利用してください

2. 非推奨としてアナウンスされてきたエンドポイントは廃止
非推奨(廃止される)エンドポイントのリストは以下のページにあります。
https://dev.twitter.com/docs/deprecations/spring-2012
特に古くからあった statuses/public_timeline も廃止されることに注意してください。
public_timelineのかわりにはストリーミングAPIの sample.json を使えます。

3. Atomは廃止
Atomはほとんど利用されていません。RSSのサポートは継続します。

4. ツイートエンティティをサポートするエンドポイントはinclude_entitiesパラメータの有無に関わらずエンティティを返す

5. since_idやmax_idをサポートするエンドポイントはpageパラメータによるページングを廃止

6.REST API Resources | Twitter DevelopersのDeprecatedをチェックする


Twitter API ポケットリファレンス (POCKET REFERENCE)Twitter API ポケットリファレンスを持っていれば、
将来的に include_entities と include_rts は
常に含むようになると書いてあるのでうろたえることはない。
本のサンプルはJSONの取得だからAtom廃止は関係ない。

出版されてからのAPI変更はハマると怖いのでメモ。
retweet_count が100以上で100+と返ってくるというのが、
API改訂で数値で返ってくるようになったのは把握している。
他は良くわからないのでTwitter API ポケットリファレンス
改訂版が出ると良いですね。現状でもほとんど正確ですが。

今使ってますが凄く役に立っています!!!!
山本 裕介 @yusukey さん ありがとうございます!!!
2012/02/26

ツイートボタンをカスタマイズして「@~さんから」を非公式RT形式にする

きっとこの記事を見る人は記事のTweetボタンからツイートした時に表示されている「@~さんから」というのは
画像がなくても伝わると思うので、細かいことは抜きに改善方法だけを載せておきます。

元のコードはDevAchieve: Bloggerの記事フッターに各種ソーシャルボタンを設置する方法にある通り。
<a class='twitter-share-button' data-via='null' data-count='horizontal' data-lang='ja' expr:data-text='data:blog.title + ": "+ data:post.title' expr:data-url='data:post.url' href='http://twitter.com/share'>Tweet</a>
<a class='twitter-share-button' data-count='horizontal' data-lang='ja' expr:data-text='" RT @null "+ data:blog.title + ": "+ data:post.title' expr:data-url='data:post.url' href='http://twitter.com/share'>Tweet</a>
変更点は data-via='wada811' の削除と、
expr:data-text への " RT @wada811 "+ の追加です。
自分であまり使わないから気にしてなかったんですが、
ちょうど下の記事を見たのでウチでも直しておきました。
Happy-Go-Lucky: Bloggerで"ブログ内ツイートボタンをカスタマイズして
Twitterアカウント名をイイ感じに表示してみた"

この記事の新規性は無いけど
情報源は多いほうが良いということで。(俺が発掘するの面倒だし)
2012/02/20

Twitter Webで引用ツイートするためのChrome拡張機能「Quote Tweet」

Chrome ウェブストア - Quote Tweet
新Twitter WebでツイートURLをつぶやくと詳細表示時に下の画像のようにツイートをインラインで開けるようになりました。
そこで手軽に引用ツイートができるようにGoogle Chromeの拡張機能を開発、公開しました。

使い方は下の画像のようにツイートの詳細を開いた時に↑の「QT」マークが出るのでコレをクリック。
「 QT (引用するツイートのURL)」と入力済みのつぶやきウインドウが表示されるからツイートしよう!

GitHubにソースコードを公開しました。
wada811/QuoteTweet - GitHub https://github.com/wada811/QuoteTweet
jQuery使ったことない、Chrome拡張開発したことない、で変なことしてないと良いんですが…。
変なところを見つけたらそっとpull requestしてください(*´Д`)

追記(2012/02/21):ショートカットキー"q"で開いているツイートをまとめて引用できるようにしました(ver.1.1.0)
追記(2012/02/23):窓の杜に掲載されました!
窓の杜 - 【REVIEW】TwitterのURLの貼り付けによる引用をサポートするChrome拡張「Quote Tweet」
追記(2012/05/04):一昨日辺り?からのTwitterWebのTLの内部的な変更に対応しました。
"QT"をクリックした場合はリプライが入るようになりました。
引用元ツイートのハッシュタグを追加されるようになりました。(ver1.2.0)
2012/01/17

Bloggerの人気の投稿にTweet&はてブカウンターを表示させる方法

右の画像のように人気の投稿にTweetカウンターと
はてブカウンターが表示されていたら、
どれくらい人気なのかわかりやすくていいですね。
見に来てくれた人も人気の具合がわかって便利ですし、
凄く人気ならその記事に興味を示してくれるかもしれません。

ということでBloggerの人気の投稿をカスタマイズしましょう。

Blogger設定画面

テンプレート

HTMLの編集

ウィジェットのテンプレートを展開にチェック

エディタなどで popular-posts を検索

人気の投稿で選択されている設定によって4パターンに分かれます。
  1. 抜粋/サムネイルなし
  2. 抜粋のみ
  3. サムネイルのみ
  4. 抜粋/サムネイル両方
しかし、やることは基本的には全て同じです。
自分の設定に当てはまるパターンを探して、このリンクタグを見つけます。
<a expr:href='data:post.href'><data:post.title/></a>
上のリンクタグの直後に以下のコードを追加します。
<div class='item-counter'>
<a expr:href='"http://tweetbuzz.jp/redirect?url=" + data:post.href'><img expr:src='"http://tools.tweetbuzz.jp/imgcount?url=" + data:post.href'/></a>
<a expr:href='"http://b.hatena.ne.jp/entry/" + data:post.href'> <img alt='はてブ' expr:src='"http://b.hatena.ne.jp/entry/image/" + data:post.href'/></a>
</div>
後はお好みで item-counter クラスのCSSを指定してください。

関連リンク
TweetBuzz - Tweetカウンター
はてなブックマーク > ヘルプ > 自分のブログに「○○users」を表示する
2012/01/16

Bloggerの記事フッターに各種ソーシャルボタンを設置する方法

はてなブックマーク、Facebook、Twitter、Google +1のボタンを設置したいと思います。

Blogger設定画面→テンプレート→HTMLの編集→ウィジェットのテンプレートを展開にチェック
まずははてなブックマーク、Twitter、Google +1のScriptタグを</body>の直前に置きましょう。
コードの部分をダブルクリックすると全選択できるのでコピーして下さい。
<script async='async' charset='utf-8' src='http://b.st-hatena.com/js/bookmark_button.js' type='text/javascript'/>
<script src='http://platform.twitter.com/widgets.js' type='text/javascript'/>
<script src='https://apis.google.com/js/plusone.js' type='text/javascript'>{lang: 'ja'} </script>
...
</body>

次に記事フッター(post-fotter)の下辺りに以下のソースを追加しましょう。
<div class='post-footer'>
...
<a class='hatena-bookmark-button' data-hatena-bookmark-layout='standard' expr:data-hatena-bookmark-title='data:blog.title + ": " + data:post.title' expr:href='"http://b.hatena.ne.jp/entry/" + data:post.url' title='このエントリーをはてなブックマークに追加'><img alt='このエントリーをはてなブックマークに追加' height='20' src='http://b.st-hatena.com/images/entry-button/button-only.gif' width='20'/></a>
<iframe allowTransparency='true' expr:src='"http://www.facebook.com/plugins/like.php?href=" + data:post.url + "&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;height=21"' frameborder='0' scrolling='no' style='border:none; overflow:hidden; width:100px; height:21px;'/>
<a class='twitter-share-button' data-via='' data-count='horizontal' data-lang='ja' expr:data-text='data:blog.title + ": "+ data:post.title' expr:data-url='data:post.url' href='http://twitter.com/share'>Tweet</a>
<g:plusone expr:href='data:post.url' size='medium' />
一行目:はてなブックマーク(はてなブックマークボタンの作成・設置について)
二行目:Facebook(Like Button - Facebook開発者)
三行目:Twitter(data-viaをあなたのアカウントに設定する必要がある)(Twitter / Twitterボタン)
四行目:Google +1(+1 ボタン)

関連:DevAchieve: ツイートボタンをカスタマイズして「@~さんから」を非公式RT形式にする

タグ(RSS)