OAuth認証を利用しブラウザー(ASP.NET)アプリケーションから Twitterにつぶやきを投稿する - C#

注意
この記事で紹介している方法は 2010年時点の方法です。Twitterの仕様変更等でこのコードでは動作しない可能性が高いため、ご注意ください。

はじめに

前回はベーシック認証を利用し、Twitterにつぶやきを投稿しましたが、今回はOAuth認証を利用してTwitterにつぶやきを投稿してみます。OAuth認証を用いると、Twittの下部にクライアントアプリ名が表示され、ちょっと見栄えもよくなります。また、APIの呼び出し回数の制限も緩和されるらしいです。

OAuth認証は、手間のかかる実装がいくつかあるため、今回はライブラリを使うことにします。

用意するライブラリ

の3つのライブラリを利用します。

OAuth認証のしくみ

ブラウザアプリケーションの場合のOAuth認証のしくみは以下の通りになります。
  1. Twitterのアプリケーション登録画面でアプリケーションを登録
  2. アプリケーション登録完了画面で、ConsumerKey, と ConsumerSecretを受け取る(ここまでは事前に登録しておく)
  3. ConsumerKeyとConsumerSecretを使いREQUEST_TOKEN URL( http://twitter.com/oauth/request_token)にアクセスし、アクセスキーを取得する。
  4. ConsumerKeyとConsumerSecretと先に取得したアクセスキーを用い、AUTHORIZE URL(http://twitter.com/oauth/authorize)にウェブブラウザでアクセスする。
  5. AUTHORIZE URLで、TwitterのIDとパスワードを求められる。ここでTwitterのIDとパスワードを入力する。
  6. TwitterのID、パスワードが一致した場合、「このアプリケーションを許可するか」という旨のメッセージが表示される。
  7. 「許可する」ボタンをクリックすると、アプリケーション登録時に登録したコールバックURLにリダイレクトされる。
  8. コールバックURLにリダイレクトされた際に、oauth_tokenとoauth_verifierパラメータが付与される。oauth_token,oauth_verifierパラメータの値、ConsumerKey、ConsumerSecretを用い、ACCESS_TOKEN URL(http://twitter.com/oauth/access_token)にアクセスし、AccessToken と AccessTokenSecretを取得する。
  9. 以後、アプリケーションはConsumerKey,ConsumerSecret,AccessToken, AcccessTokenSecretの4つのキーを使った署名をAPI呼び出し時に付与することで、認証されたアクセスとなる。
となります。ちなみにPINコード使用するデスクトップアプリの場合は上記と手順が変わります。デスクトップアプリについてはこちらを参照。

補足

以前はコールバックURLにリダイレクトされた際に、oauth_tokenのみを取得しACCESS_TOKEN URLへリクエストをすればアクセストークンは取得できましたが、現在はコールバックURLにリダイレクトされた際に、送られるoauth_tokenとoauth_verifierパラメータの2つを用いてACCESS_TOKEN URLへリクエストをする必要があります。

アプリケーションの登録

現在の手順

現在は,https://dev.twitter.com/ にアクセスします。
登録手順はこちらの記事を参照してください。

以前の手順

http://twitter.com/oauth_clients にアクセスします。


ユーザーIDとパスワードを聞かれますので、開発者のユーザーIDとパスワードを入れログインします。

アプリケーション一覧画面が表示されます。最初はアプリケーションがありませんので、Register a new application のリンクをクリックします。


アプリケーション登録フォームが表示されますので、情報を入力します。
Application TypeはBrowserに設定します。また、Callback URLも指定します。(CallBack URLにlocalhostは設定できません、ドメイン名を入れる必要があります。)

登録が完了すると、ConsumerKey, ConsumerSecret, 各種問い合わせURLが取得できます。

実装

OAuthToekn取得

以下のコードで、OAuthトークンを取得し、認証を経てアプリケーションの許可を取得し、コールバック画面へリダイレクトします。
  protected void Button_OAuthGet_Click(object sender, EventArgs e)
  {
    TwitterUtils tu = new TwitterUtils();
    string authurl = tu.GetOAuthToken(ConfigurationSettings.AppSettings["TwitterConsumerKey"], ConfigurationSettings.AppSettings["TwitterConsumerSecret"]);
    Response.Redirect(authurl);
  }

AccessTokenの取得

アプリケーション登録画面で設定したコールバックURLのPage_Loadイベントに以下のコードを記述します。コールバックされた際に付加されるoauth_tokenパラメータを取得し、oauth_tokenパラメータの値、ConsumerKey、ConsumerSecretを用いて、AccessTokenとAccessTokenSecretを取得します。
取得したAccessTokenとAccessTokenSecretを、Labelコントロールに表示します。
  protected void Page_Load(object sender, EventArgs e)
  {
    //OAuthからのコールバックの場合
    if (Request["oauth_token"] != null) {
      TwitterUtils tu = new TwitterUtils();
      string Token = "";
      string TokenSecret = "";
      tu.GetOAuthAccessToken(
        Request["oauth_token"], 
        ConfigurationSettings.AppSettings["TwitterConsumerKey"],
        ConfigurationSettings.AppSettings["TwitterConsumerSecret"],
        out Token, out TokenSecret);
      Label_AccessToken.Text = Token;
      Label_AccessTokenSecret.Text = TokenSecret;
    }
  }

TwitterAPIの呼び出し

TwitterAPIを呼び出します。TwitterAPIの呼び出しには、ConsumerKey,ConsumerSecret,AccessToken,AccessTokenSecretを用います。今回はマルチユーザー環境ではないWebアプリケーションであるため、AccessTokenとAccessTokenSecretはWeb.Configに埋め込んでいるコードになっていますが、マルチユーザー環境で使う場合には、AccessTokenとAccessTokenSecretをデータベースに格納する形で実装することで対応できます。
//OAuth版Twitter投稿
tu.UpdateStatusOAuth(string.Format("テストメッセージ。/{0:s}",DateTime.Now.ToString("HH:mm")), 
  ConfigurationSettings.AppSettings["TwitterConsumerKey"],
  ConfigurationSettings.AppSettings["TwitterConsumerSecret"],
  ConfigurationSettings.AppSettings["TwitterAccessToken"],
  ConfigurationSettings.AppSettings["TwitterAccessTokenSecret"]);

ブラウザアプリケーションの場合はTwitter側でアクセスURLを見ていますので、デバッグ環境(イントラネット内PCなど)でテストしても正しく動作しない可能性が高いです。インターネットサーバーにアップロードし、本番環境で動作確認する必要があります。

ライブラリ部

ライブラリは以下の通りです。
  • TwitterUtils.cs Twitterユーティリティクラス(iPentec実装)
  • oAuthTwitter.cs "Shannon Whitiley | Twitter oAuth with .NET"のライブラリに"Coding the tweet - Building a Custom Branded Twitter Application"の実装をマージ。 (// JDevlin"と書かれている部分が追加部分となります。)
  • OAuthBase.cs "Google Code - oauth"を利用。UrlEncodeメソッドをC#でOAuthにて紹介されている改良版メソッドに変更。

ライブラリのコードはこちら
httpプロトコルでのAPI呼び出し廃止、XML形式のAPI廃止,Version 1.0API廃止、に対応した新しいライブラリのコードです。

修正等

  • Twitter API 1.0廃止に伴うTwitter API 1.1への変更
  • xml形式API廃止に伴うJSON形式APIへの変更
  • httpプロトコル廃止に伴うhttpsプロトコルへの変更
  • Webアプリケーションの認証時にoauth_verifierをポストする仕様に対応

サンプルアプリケーション

ASP.NETアプリケーションを作成します。

UI

下図のUIを作成します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iPentec.Twitter;


namespace TwitterPostWeb
{
  public partial class _default : System.Web.UI.Page
  {
    string ConsumerKey = "(ConsumerKey)";
    string ConsumerSecret = "(ConsumerSecret)";

    protected void Page_Load(object sender, EventArgs e)
    {
      if (Request["oauth_token"] != null) {
        string OAuthToken = Request["oauth_token"];
        string OAuthVerifier = Request["oauth_verifier"];

        //OAuthからのコールバックの場合
        TwitterUtils tu = new TwitterUtils();
        string Token = "";
        string TokenSecret = "";
        tu.GetOAuthAccessTokenWithOAuthVerifier(OAuthVerifier, OAuthToken, ConsumerKey, ConsumerSecret, out Token, out TokenSecret);
        Label_AccessToken.Text = "AccessToken : " +Token;
        Label_AccessTokenSecret.Text = "AccessTokenSecret : " + TokenSecret;
      }

    }

    protected void Button_GetAccessToken_Click(object sender, EventArgs e)
    {
      TwitterUtils tu = new TwitterUtils();
      string authurl = tu.GetOAuthToken(ConsumerKey, ConsumerSecret);
      Response.Redirect(authurl);

    }

    protected void Button_Tweet_Click(object sender, EventArgs e)
    {
      string tweet = string.Format(TextBox_Tweet.Text+"{0:s}", DateTime.Now.ToString("HH:mm"));

      TwitterUtils tu = new TwitterUtils();
      tu.UpdateStatus(tweet,
        ConsumerKey,
        ConsumerSecret,
        TextBox_AccessToken.Text,
        TextBox_AccessTokenSecret.Text,
        false);

    }

    protected void Button_Tweet2_Click(object sender, EventArgs e)
    {
      string tweet = string.Format(TextBox_Tweet.Text + "{0:s}", DateTime.Now.ToString("HH:mm"));
      
      TwitterUtils tu = new TwitterUtils();
      tu.UpdateStatus(tweet,
        ConsumerKey,
        ConsumerSecret,
        TextBox_AccessToken.Text,
        TextBox_AccessTokenSecret.Text,
        true);
    }
  }
}

実行結果

実行前にコールバックURLがこのアプリケーションのdefault.aspxとなるように設定します。

プロジェクトを実行するかWebサーバーに配置したアプリケーションにアクセスします。下図の画面が表示されます。


画面上部の[アクセストークン取得]ボタンを押します。ページ遷移し下図のアプリケーション認証のためのログイン画面が表示されます。アプリケーションを利用するTwitterアカウントのIDとパスワードを入力し、[連携アプリを認証]ボタンを押します。


正しく認証ができると下図のアプリケーションに戻る旨の画面が表示されます。


アプリケーション設定画面で設定したコールバックURLに遷移します。アクセストークンの欄にAccessTokenとAccessTokenSecretのキーが表示されます。表示されたキーを控えておきます。


一度アプリケーションを終了するか、ブラウザを閉じて再度アプリケーションを開くかアプリケーションのURLにアクセスします。


画面下部の[AccessToken],[AccessTokenSecret]欄に先ほど控えたAccessTokenとAccessTokenSecretのキーを入力します。また、ツイートしたいテキストを[ツイート]欄のテキストボックスに入力します。入力後[ツイート]ボタンか[ツイート2]ボタンをクリックします。


Twitterでツイートがポストできたことを確認します。ツイートができています。


Webアプリからツイートができました。
著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
最終更新日: 2024-01-22
作成日: 2010-01-12
iPentec all rights reserverd.