はじめに
前回は、OAuth認証を利用する方法と、Twitterのアプリを開発するための登録までを説明しました。今回は前回に続いて、Excel VBAでOAuth認証を実装する方法を説明します。 動作確認は、Windows 7、Excel 2010、VBA 7.0およびWindows XP、Excel 2007、VBA 6.5で行っています。
Excel VBAでWebサービス - 天気予報を取得してみよう
Excel VBAでWebサービス - MSNマネーから株価の推移を取得しよう
Excel VBAでWebサービス - Excelで書籍情報を検索・取得してみよう
Excel VBAでWebサービス - YouTube APIで動画を検索しよう
Excel VBAでWebサービス - ExcelでTwitterと連携する
OAuth認証部分の開発
Excel 2010を起動した後、以下の手順で行います。
- 必要な情報の格納場所を準備する
- VBAに必要な参照設定を行う
- OAuth認証を行うVBAを記述する
必要な情報の格納場所などを準備する
グローバル変数のように各種情報を格納しておくため、図2のように「Sheet1」シートの右の方(サンプルではY列)に、以下の名前を定義しておきます。アプリ登録で取得したコンシューマー・キーとコンシューマー・シークレットは入力しておいてください(その他は入力不要)。
表1.必要な情報の格納場所
セルの名前定義 | 初期値 | 説明 |
---|---|---|
urlRequestToken | https://api.twitter.com/oauth/request_token | リクエスト・トークンの要求先URL |
urlUserAuthorize | http://twitter.com/oauth/authorize?oauth_token= | ユーザーに認証してもらうページのURL |
urlAccessToken | https://api.twitter.com/oauth/access_token | アクセス・トークンの要求先URL |
urlTweet | http://api.twitter.com/1/statuses/update.xml | ツイートの投稿先URL |
urlTimeline | http://api.twitter.com/1/statuses/home_timeline.xml | タイムラインの取得先URL |
consumer_key | 取得したコンシューマー・キーを入力 | - |
consumer_secret | 取得したコンシューマー・シークレットを入力 | - |
request_token | 不要 | 取得するリクエスト・トークンを格納する |
request_secret | 不要 | 取得するリクエスト・トークンの秘密鍵を格納する |
pinCode | 不要 | PINコードを格納する |
access_token | 不要 | 取得するアクセス・トークンを格納する |
access_secret | 不要 | 取得するアクセス・トークンの秘密鍵を格納する |
OAuthStatus | 不要 | OAuthによるHTTP通信の成否を格納する |
また、[開発]タブの[挿入]ボタンをクリックし、[ActiveXコントロール]のコマンドボタンを作成します。名前は「cbAuth」、表示名は「認証する」にします(図3)。
VBAに必要な参照設定を行う
[Alt]+[F11]キーでVBエディタを開き、メニューバーから[ツール]-[参照設定]をクリックし、「Microsoft XML, v3.0」と「Microsoft Scripting Runtime」を追加してください。
「Microsoft Scripting Runtime」を追加すると連想配列が使えるようになります。 連想配列とは、インデックスに数字でなく文字列を使える配列で、OAuthの引数名から引数値を直接参照できるので重宝します。
OAuthによるHTTP通信を行うVBAを記述する
OAuthによるHTTP通信を用いるフェーズには、以下の3つがあるのでした。
フェーズ1:リクエスト・トークンの要求
フェーズ2:アクセス・トークンの要求
フェーズ3:Webサービスへのアクセス
いずれのフェーズにおいても、以下の手順を踏む必要があります。
手順1.OAuth特有の引数を準備する
手順2.暗号化キーを使って電子署名を作成する
手順3.電子署名も含め、全ての引数を送信する
このため、まず上記の手順を実現する部分のプロシージャを記述します。
[リスト1]共通変数の準備
(略)
'OAuth関連の変数宣言
Dim timestamp As Long '1970年1月1日からの秒数を格納
Dim param As Scripting.Dictionary 'OAuth引数用の連想配列
Dim xmlhttp As MSXML2.xmlhttp 'HTTP通信用オブジェクトを格納
(略)
これらの変数は、手順1~3で共有しますので、プロシージャの外でグローバルに宣言しています。変数の役割は表2に示す通りです。
表2.グローバル変数の役割
変数名 | 役割 |
---|---|
timestamp | 1970年1月1日からの秒数を格納。HTTP通信を行うごとに増加する値を設定する必要あり。 |
param | OAuth特有の引数を格納する連想配列。 |
xmlhttp | OAuthによるHTTP通信を行うオブジェクトを格納する変数。 |