はじめに

前回は、OAuth認証を利用する方法と、Twitterのアプリを開発するための登録までを説明しました。今回は前回に続いて、Excel VBAでOAuth認証を実装する方法を説明します。 動作確認は、Windows 7、Excel 2010、VBA 7.0およびWindows XP、Excel 2007、VBA 6.5で行っています。

図1.完成サンプル

Excel VBAでWebサービス - 天気予報を取得してみよう
Excel VBAでWebサービス - MSNマネーから株価の推移を取得しよう
Excel VBAでWebサービス - Excelで書籍情報を検索・取得してみよう
Excel VBAでWebサービス - YouTube APIで動画を検索しよう
Excel VBAでWebサービス - ExcelでTwitterと連携する

OAuth認証部分の開発

Excel 2010を起動した後、以下の手順で行います。

  1. 必要な情報の格納場所を準備する
  2. VBAに必要な参照設定を行う
  3. OAuth認証を行うVBAを記述する

必要な情報の格納場所などを準備する

グローバル変数のように各種情報を格納しておくため、図2のように「Sheet1」シートの右の方(サンプルではY列)に、以下の名前を定義しておきます。アプリ登録で取得したコンシューマー・キーとコンシューマー・シークレットは入力しておいてください(その他は入力不要)。

図2.各種情報の格納場所の準備

表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)。

3.認証ボタンの準備

VBAに必要な参照設定を行う

[Alt]+[F11]キーでVBエディタを開き、メニューバーから[ツール]-[参照設定]をクリックし、「Microsoft XML, v3.0」と「Microsoft Scripting Runtime」を追加してください。

図4.参照設定の追加

「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通信を行うオブジェクトを格納する変数。