2010年3月アーカイブ



twitterと連携するアプリケーション作成のためのAPI群です。

 

OAuthというツイッターの認証機能を利用できる仕組みがあるので、

お手軽に、しかもユーザにとっても安心・安全に利用できる仕組みになってる。

 

OAuthを利用するためには、アプリケーションを登録しないといけないので、

http://twitter.com/apps

上記より、登録します。

 

登録すると、Consumer key、Consumer secret という情報を取得できるので、

その情報を利用して、ユーザを、twitterの認証ページに誘導し、アプリの利用の

同意を頂くと、アプリから、そのユーザができる操作を代行できるようになる。

 

今回は、好きな"お酒"のことに特化したつぶやきをするためのアプリ、

「つい飲み」というWebアプリを作成してみた。

"いまなにのんだ?"をコンセプトに、飲んだお酒と"つぶやき"を投稿するアプリ。

(また、#sake というカテゴリが自動で設定されるようになってます)

 

1.ログインボタンを押す

2.Consumer key、Consumer secretを 設定しtwitterの認証ページにリダイレクト

3.認証が成功すると、事前に設定したアプリのページに自動で戻ってくる

4.AccessTokenという、認証が成功したユーザを操作するための権限を取得する

5.AccessTokenを利用して、"つぶやく" など、必要な処理を呼び出す。

 

今回は、Java(Struts2)を利用して、Webアプリケーションを作成した。

twitter4jというOAuthも手軽に利用できるライブラリがあったので。

 

要点のコードを抜粋

//最初にtwitterのサイトへ誘導し認証させる

Twitter twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer("xxxxxxxxxx", "yyyyyyyyyy");
RequestToken token = twitter.getOAuthRequestToken();
sessionMap.put("twitter", twitter);
response.sendRedirect(token.getAuthenticationURL());

 

//次に認証が成功すると任意のページへリダイレクトされるので権限を取得

Twitter twitter = (Twitter)sessionMap.get("twitter");
if (twitter != null) {
 AccessToken token = twitter.getOAuthAccessToken();
 sessionMap.put("token", token);

}

 

//権限を利用してアプリから"つぶやき"を投稿

AccessToken token = (AccessToken)sessionMap.get("token");
if (token != null) {
 Twitter twitter = (Twitter)sessionMap.get("twitter");
 twitter.updateStatus("つぶやきを投稿");
}

 

※これでひととおりの操作が可能です。

つぶやき以外にも様々な操作がAPIで提供されてます。

 

※携帯からの利用についてですが、twitterの認証機能は、https対応ですが

携帯で表示時にtwitterの証明書ではエラーになるようです。

なので、HTTPリクエストのヘッダーで、携帯からのアクセスかを判断して、

携帯からの場合は、HTTPSを、HTTPへ書き換えてあげるとうまくいきます。

セキュリティが弱くなるけれど、twitterで通常の携帯ログインもHTTPのよう

なので、とりあえず問題はないかと...。


 とりいそぎ最低限のラインで作成してみたので、

また機能アップしていきたいと思います。

 

続 Struts 2入門

| コメント(0) | トラックバック(0)

CodeZineで、Struts2入門(1)?(8) の続編、

続 Struts 2入門が始まりました!!

 

Strutsは以前から利用しているので、Struts 2になった今後も是非とも

発展し続けていってほしいと思う。

自分自身でもStrtuts2でWebアプリケーションを作っているので、

いろいろと情報発信して、Struts2の発展に貢献できればなと思う。

 

Strutsの時よりも、情報源が少なく感じ、なかなか活用しきれていない

面があるので、こういった連載が始まるのはありがたい!!

記事を見てもらうほうが詳細に理解できますが、さわりだけわかれば

良い方は以下を参照してください。

 

続 Struts 2入門

基本機能のおさらいから2.1系で採用された機能の説明や実装例を紹介

(1)Struts 2の同期処理を手助けするExecuteAndWaitインターセプタ

 

処理に時間がかかるActionクラスの処理状況を監視し、その結果を自動的に

判断するためのExecuteAndWaitインターセプタの使用例を解説。

 

Actionクラスにはメインのロジックを記述するだけで、あとは設定のみで、

同期処理を実現することが可能になります。

 

具体的な手法としては、

ブラウザの自動リフレッシュ機能を利用し、Actionクラス内の時間の

かかる処理を、自動で途中中断して、リフレッシュを設定したページを表示。

(Actionの実行は継続されセッションに維持される)

 

再度リフレッシュしてサーバにアクセスすると、中断したActionの状況を

再度監視できるようになっている。

まだ処理中の場合は、再度リフレッシュページへ、処理が完了した場合は

完了用のページが表示されるという仕組みです。

 

これらを、上記のExecuteAndWaitインターセプタ(アノテーションの機能)

を利用することで設定をおこなうことで、簡単に利用することができます。

 

インターセプタ(汗)

まだぜんぜん利用できていないので、実用できるように勉強します。

次回もインターセプタの機能についての記事のようです。

 

業務アプリに限らず、いろいろなプログラム作成を経験していると、

タスクトレイ(通常画面右下の時計が表示される場所)へアプリケーションを

常駐させて(タスクバーに出さずに他の作業の邪魔にならないように)動かしたい

事は必ず1度や2度はあるのではないかと思う。

 

C#(.Net Framework)では、タスクトレイへアプリケーションを格納するための

クラスが標準で備わっている。それが、タイトルにもある、NotifyIconである。

使い方はいたって簡単であり、タスクトレイへの常駐だけでなく、アイコンの設定、

バルーン表示機能(吹き出しのようなメッセージが一定時間表示される機能)や、

ヒントメッセージ、コンテキストメニューの設定がとても簡単にできるが、

細かい動きを気にすると、少しテクニックが必要になるので書いておきます。

※細かい動きと言っても、常駐アプリケーションを使用する場合には大抵必要になる

だろう動きだと思うので、調べると結構同様の対応策が検索できる。

 

まずは、NotifyIconの使い方も含め、

1.NotifyIconをフォームに張り付ける。

2.NotifyIconのVisibleプロパティをtrueにし、Iconプロパティに表示したいアイコンを
  指定すると、これだけでアプリケーション実行時にタスクトレイにアイコンが表示

  される。また、タスクバーにアプリケーションのタスクを表示させないためには、

  ShowInTaskbarプロパティをflaseに設定します。

3.Titleプロパティの内容が、ヒントメッセージになり、BalloonTip?プロパティを設定

  し、ShowBalloonTipメソッドでバルーンを一定時間表示できます。

4.ここまでは、簡単な設定だけでうまくいくのですが、アプリケーションのウィンドウは

  最小化するとタスクバーには表示されないのですが、デスクトップ領域に表示されて

  しまいます。また、閉じるボタンを押した際にアプリケーションが終了するのではなく、

  画面は消えるが、タスクトレイには常駐されたままにしたいというのが一般的な機能

  でしょう。

5.結論から言うと、WndProc というメッセージの処理をつかさどるメソッドをオーバ

  ライドすると自由にアプリケーションの動作を制御することが可能なので、

  この方法がベストでしょう。ただ今回は、極力簡単で分かりやすい方法で

  できないかを探しており、少し動作的に微妙な点はあるが、メッセージを使用せず、

  WindowStateプロパティを制御するだけでもうまく動かすことはできた。

6.WndProcの制御も覚えれば簡単なので、ハードルは高くないと思われるが、今回は

  せっかくなので両方の方法のサンプルを書いておきます。

 

コードサンプル


前提条件

・フォームにNotifyIcoonコントロールを張り付ける

・NotifiIconのVisibleをtrue、ShowInTaskbarプロパティをfalse、Iconプロパティを設定

 

a)WndProcを使用する方法

    public partial class Form1 : Form
    {
        private int    WM_SYSCOMMAND = 0x112;
        private IntPtr SC_MINIMIZE   = (IntPtr)0xF020;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            //最小化されたときにフォームを非表示にする
            if ((m.Msg == WM_SYSCOMMAND) && (m.WParam == SC_MINIMIZE))
            {
                this.Hide();
            }
            //上記以外はデフォルトの処理をおこなう
            else
            {
                base.WndProc(ref m);
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            //タスクトレイのアイコンダブルクリックでフォームを表示、アクティブ化
            this.Show();
            this.Activate();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //フォームを閉じる時、タスクトレイに表示されている場合は閉じずに非表示
            if (notifyIcon1.Visible)
            {
                e.Cancel = true;
                this.Hide();
            }
        }

        //NotifyIconのコンテキストメニューに追加した「閉じる」メニュークリックイベント        
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //NotifyIconのコンテキストメニューで閉じるメニューを実行した場合
            //NotifyIconを非表示にしてアプリケーションを終了する
            notifyIcon1.Visible = false;
            Application.Exit();
        }
    }

 

b)WindowStateプロパティを使用する方法

→この方法の場合は、あくまで最小化の処理が発生していることになるので、

最小化のアニメーションが表示されてしまう、再表示する場合に、フォームの状態を

再設定するため、画面がちらつく場合があるなど微妙に動作が気になる部分も残る。

    public partial class Form1 : Form
    {
        //ウィンドウの状態を保存するためのフィールド
        private FormWindowState windowState;

        public Form1()
        {
            InitializeComponent();
            windowState = WindowState;
        }

        private void MainForm_ClientSizeChanged(object sender, EventArgs e)
        {
            //ウィンドウが最小化された場合はフォームを非表示
            if (this.WindowState == FormWindowState.Minimized)  
            {  
                this.Hide();
            }
            //最小化以外の場合はウィンドウの状態を保存しておく
            else
            {
                windowState = WindowState;
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            //ウィンドウを表示、保存しておいた状態に戻し、アクティブ化する
            this.Show();
            this.WindowState = windowState;
            this.Activate();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //フォームを閉じる時、タスクトレイに表示されている場合は閉じずに非表示
            if (notifyIcon1.Visible)
            {
                e.Cancel = true;
                this.Hide();
            }
        }

        //NotifyIconのコンテキストメニューに追加した「閉じる」メニュークリックイベント       
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //NotifyIconのコンテキストメニューで閉じるメニューを実行した場合
            //NotifyIconを非表示にしてアプリケーションを終了する
            notifyIcon1.Visible = false;
            Application.Exit();
        }
    }