OAuth認証を利用しクライアントアプリケーションから Twitterにつぶやきを投稿する - C#

注意
この記事で紹介している方法は 2010~2012年時点の方法です。Twitterの仕様変更等でこのコードでは動作しませんのでご注意ください。

はじめに

今回はデスクトップアプリケーションから、OAuth認証を利用してTwitterにつぶやきを投稿してみます。OAuth認証を用いると、Tweetの下部にクライアントアプリ名が表示され、ちょっと見栄えもよくなります。また、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. 「許可する」ボタンをクリックすると、8桁程度の数値からなるPINコードがブラウザに表示される。
  8. クライアントアプリケーションに、PINコードを入力する。
  9. 2.で取得したアクセスキー、入力されたPINコード、CunsumerKey、ConmsumerSecretを用い、ACCESS_TOKEN URL(http://twitter.com/oauth/access_token)にアクセスし、AccessToken と AccessTokenSecretを取得する。
  10. 以後、アプリケーションはConsumerKey,ConsumerSecret,AccessToken, AcccessTokenSecretの4つのキーを使った署名をAPI呼び出し時に付与することで、認証されたアクセスとなる。
となります。ちなみにブラウザコールバックを利用するブラウザアプリの場合は上記と手順が変わります。ブラウザアプリについてはこちらを参照。

アプリケーションの登録

現在の手順

現在は,https://dev.twitter.com/ にアクセスします。
登録手順は「Twitterに自分で作成したアプリケーションを登録する (2012年3月版)」の記事を参照してください。

以前の手順

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


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

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


アプリケーション登録フォームが表示されますので、情報を入力します。
Application TypeはClientに設定します。


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



実装

OAuthToken取得

tu.GetOAuthToken(Properties.Settings.Default.ConsumerKey, Properties.Settings.Default.ConsumerSecret);
でリクエストコードを取得し、認証URLを取得します。

Process.Start(url);

でウェブブラウザを起動し、認証URLにアクセスします。
利用者はウェブブラウザでTwitterの認証ページにパスワードIDを入力し、アプリケーションの許可ボタンを押し、PINコードを取得します。
System.Console.WriteLine("Input PIN Code:");
string PINCode = System.Console.ReadLine();
アプリケーション側はその間「INPUT PIN Code」の文字を表示しReadLine()で入力を待ちます。(今回はコンソールアプリとして実装しているため上記のロジックとなっていますが、Winformアプリの場合はアプリケーションを終了しなければ待機する処理は必要ありません。)

入力されたPINコード、リクエストコード、CoonsumerKey、ConsumerSecretを用いて、AccessKeyとAccessSecretを取得します。
static void Main(string[] args)
{
  TwitterUtils tu = new TwitterUtils();
  string url = tu.GetOAuthToken(Properties.Settings.Default.ConsumerKey, Properties.Settings.Default.ConsumerSecret);

  Process.Start(url);

  System.Console.WriteLine("Input PIN Code:");
  string PINCode = System.Console.ReadLine();

  string Token = "";
  string TokenSecret = "";
  tu.GetOAuthAccessTokenWithPIN(
    PINCode,
    Properties.Settings.Default.ConsumerKey,
    Properties.Settings.Default.ConsumerSecret,
    out Token, out TokenSecret);

  System.Console.WriteLine("AccessToken: {0:s}", Token);
  System.Console.WriteLine("AccessTokenSecret: {0:s}", TokenSecret);
  System.Console.ReadLine();
}

TwitterAPIの呼び出し

TwitterAPIを呼び出します。TwitterAPIの呼び出しには、ConsumerKey,ConsumerSecret,AccessToken,AccessTokenSecretを用います。今回はユーザーID固定型のクライアントアプリケーション(BOTなど)であるため、AccessTokenとAccessTokenSecretはSettings.Settingsに埋め込んでいる形になっていますが、第三者に利用してもらう場合には、AccessTokenとAccessTokenSecretを設定ファイルに保持する実装にすることで対応できます。
static void Main(string[] args)
{
  TwitterUtils tu = new TwitterUtils();
  tu.UpdateStatusOAuth(string.Format("テストメッセージのポスト/{0:s}",DateTime.Now.ToString("HH:mm")),
    Properties.Settings.Default.ConsumerKey,
    Properties.Settings.Default.ConsumerSecret,
    Properties.Settings.Default.AccessToken,
    Properties.Settings.Default.AccessTokenSecret);
}

その他

実際のプログラムでは -installが引数に与えられた場合は、OAuthToken取得処理をし、それ以外の場合は通常の動作(BOTのロジック)をする実装にする形にするとよいかもしれません。
    static void Main(string[] args)
    {
      bool inst = false
      if (args.Length > 0) {
        if (args[0] == "-install") {
          //OAuthToken 取得処理 
          inst= true;
        }
      }
    
      if(inst==false){
        //通常の処理(BOTのロジック)
      }
    }

ライブラリ部

ライブラリはブラウザアプリケーションと全く同じライブラリで対応できます。
ライブラリは以下の通りです。
  • 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をポストする仕様に対応
以前のバージョン
ライブラリのコードはこちら

サンプルアプリケーション:アクセストークン取得

UI

下図のUIを作成します。

コード

下記のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using iPentec.Twitter;

namespace TwitterAuth
{
  public partial class FormMain : Form
  {
    string ConsumerKey = "(ConsumerKey)";
    string ConsumerSecret = "(ConsumerSeckret)";
    TwitterUtils tu = new TwitterUtils();

    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      string url = tu.GetOAuthToken(ConsumerKey, ConsumerSecret);
      System.Diagnostics.Process.Start(url);
    }

    private void button2_Click(object sender, EventArgs e)
    {
      string PINCode = textBox_PIN.Text;
      string Token = "";
      string TokenSecret = "";

      tu.GetOAuthAccessTokenWithOAuthVerifier(
        PINCode,
        ConsumerKey,
        ConsumerSecret,
        out Token, out TokenSecret);

      textBox_Output.Text += string.Format("AccessToken: {0:s}\r\n", Token);
      textBox_Output.Text += string.Format("AccessTokenSecret: {0:s}\r\n", TokenSecret);

    }
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


ウィンドウの[認証]ボタンをクリックします。Webブラウザが起動し下図の画面が表示されます。
アクセストークンを取得する、TwitterのIDとパスワードを入力し、[連携アプリを認証]ボタンをクリックします。


正しく認証できると、PINコードが表示されます。


アプリケーションのウィンドウに戻り、[PINコード]テキストボックスに先ほどWebブラウザで表示されたPINコードを入力します。入力後[トークン取得]ボタンをクリックします。


AccessToken, AccessTokenSecretが画面に表示されます。

サンプルアプリケーション:ツイート投稿

UI

下図のUIを作成します。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using iPentec.Twitter;

namespace TwitterPost
{
  public partial class FormMain : Form
  {
    string ConsumerKey = "(ConsumerKey)";
    string ConsumerSecret = "(ConsumerSecret)";

    string AccessToken = "(先のプログラムで取得したAccessToken)";
    string AccessTokenSecret = "(先のプログラムで取得したAccessTokenSecret)";
 
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      TwitterUtils tu = new TwitterUtils();
      tu.UpdateStatus(textBox_Tweet.Text+DateTime.Now.ToShortTimeString(), 
        ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret, false);

      textBox1.Text += "ツイート完了\r\n";
      //request.Headers.Add("Authorization", GenerateAuthorizationHeader());
    }

    private void button2_Click(object sender, EventArgs e)
    {
      TwitterUtils tu = new TwitterUtils();
      tu.UpdateStatus(textBox_Tweet.Text + DateTime.Now.ToShortTimeString(),
        ConsumerKey, ConsumerSecret, AccessToken, AccessTokenSecret, true);

      textBox1.Text += "ツイート完了\r\n";
    }
  }
}

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


ツイートするテキストをテキストボックスに入力します。入力後[Tweet]ボタンをクリックします。


ツイートができると完了メッセージが表示されます。


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

著者
iPentecのプログラマー、最近はAIの積極的な活用にも取り組み中。
とっても恥ずかしがり。
掲載日: 2010-01-12
iPentec all rights reserverd.