あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Phonegap + jsOAuthで画像投稿

Phonegap + jsOAuthでハイクに画像を投げる方法を探すもなかなか見つけられず苦労していましたが、PhonegapのFileTransferと、jsOAuthにソースを加えたものでゴリ押しできました。
これでカメラから取得した画像とかをOAuth認証通してバリバリ投稿できます。
やり方を書いておきますー。
また、もっとスマートなやり方があれば誰か教えてください……。

jsOAuthに追記

jsOAuthはminではなく通常版を使用する前提です。リクエストのヘッダに必要なOAuth認証の情報を取るコードを追記します。requestのコードから必要そうな部分だけ取りました。この前後にコードを埋め込みます。
あ、GETのこと気にしてなかったです。これはひどい。

    OAuth.prototype = {
(略)
        init: function (options) {
(略)
// Start
            this.getHeader = function (options) {
                 /* Options are: url, method */
                 var method, url, urlString, headerParams, signatureMethod, signatureString, signature;
                 headerParams = {
                     'oauth_consumer_key': oauth.consumerKey,
                     'oauth_token': oauth.accessTokenKey,
                     'oauth_signature_method': oauth.signatureMethod,
                     'oauth_timestamp': getTimestamp(),
                     'oauth_nonce': getNonce(),
                     'oauth_verifier': oauth.verifier,
                     'oauth_version': OAUTH_VERSION_1_0
                 };

                 method = options.method || 'GET';
                 url = URI(options.url);
                 urlString = url.scheme + '://' + url.host + url.path;
                 signatureString = toSignatureBaseString(method, urlString, headerParams, {});
                 signatureMethod = oauth.signatureMethod;
                 signature = OAuth.signatureMethod[signatureMethod](oauth.consumerSecret, oauth.accessTokenSecret, signatureString);
                 headerParams.oauth_signature = signature;
                 if (this.realm) { headerParams['realm'] = this.realm; }

                 //'Authorization'
                 return 'OAuth ' + toHeaderString(headerParams);
            };
//End
(snip)

使い方

上記のコードを使ってOAuthの情報を引っ張ってきて、FileTransferに追加のヘッダーとして指定します。

    var postURI = 'http://h.hatena.ne.jp/api/statuses/update.json';
    var oauthHeader = oauth.getHeader({'method':'POST','url':postURI});
    params.headers = {'Authorization':oauthHeader};

んー

jsOAuthに手入れてる量が増えて微妙な気がする。