はじめに
この記事では、Twitter4j APIを使ってTwitterアプリケーションをJavaで自作する方法を簡単に説明します。Twitter4jは、TwitterインフラストラクチャにアクセスできるAPIです。ステータスの更新、フォロワーのリストの取得など、さまざまな便利なタスクをJavaプログラムから実行できます。
以降の説明はJavaとSwing GUIの知識があることを前提に書かれています。この記事が目指しているのは、Swingをビューテクノロジとして使う簡易なデスクトップアプリケーションを作成することです。以下の機能を実装していきます。
- ポップアップを使ってログインする
- フォロワーを表示する
- 表示を更新する
- Twitter上のステータスを更新する(つぶやきを送る)
- つぶやきを検索する
- ダイレクトメッセージを送る
これは、独自のアプリケーションを作るための骨格として利用できます。想像力を駆使し、ここで作成するサンプルに自由に装飾を加えてみてください。使用できるビューテクノロジはほかにもJSPなどがありますが、Swingに決めたのは、説明の必要なトピックを増やさずに済むからです。
現在、Java Twitter APIには、Twitter4J(開発Yusuke Yamamoto氏)、Java-Twitter(同DeWitt Clinton氏)、JTwitter(同Daniel Winterstein氏)の3つがあります。この記事を書いている時点で、Twitter4Jはバージョン2.0.8、Java-Twitterはバージョン0.9、JTwitterはバージョン1.2です。今回は最も熟成が進んでいるTwitter4Jを使用します。
作業に入る前に、Twitterアカウントを取得してください。3分もあれば手続きは完了するでしょう。以降で説明する内容を理解するには、Twitterの基礎知識も必要です。つぶやき、他人をフォローする、ダイレクトメッセージを送る、こういった概念をもう一度確認してから、次に進みましょう!
Twitter4J API
Twitter4Jをhttp://repo1.maven.org/maven2/net/homeip/yusuke/twitter4j/からダウンロードします。また、非常に役に立つJavadocsも同じ場所から入手できます。いつもどおり、クラスパスを.jarファイルに設定します。以下は、Twitter4Jを使用するセッションの例です。
import twitter4j.*; public class Test { public static void main(String[] args) throws TwitterException { Twitter twitter = new Twitter("username", "password"); // サービスへログイン twitter.updateStatus("Tweeting!"); // ステータスを更新 } }
このコードでは、まずtwitter4jクラスをインポートします。main
メソッド内で、Twitterクラスのインスタンスを作成します。ユーザー名とパスワードは、文字列としてコンストラクタに渡します。ログインに成功したら、ユーザーのステータスを更新するためにupdateStatus
メソッドを呼び出します。ステータスが更新されたかは、Twitterアカウントにログインすると確認できます。
何をするにせよログインは必須なので、このアプリケーションではログイン用のデータを入力するためのダイアログを最初に表示する必要があります。このダイアログには、ユーザーの気が変わった場合にも対応するため、2つのJLabel
、1つのJTextField
、1つのJPasswordField
、1つの確認用JButton
、および1つのキャンセル用JButton
を用意します。コードをすっきりさせたいので、ログインダイアログ用のクラスを作成します。
import javax.swing.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.*; class LoginDialog extends JDialog implements ActionListener { JLabel labelName; JLabel labelPass; JTextField textName; JPasswordField passField; JButton okButton; JButton cancelButton; JDialog dialog; public LoginDialog() { JPanel panelOne = new JPanel(); labelName = new JLabel("Name"); textName = new JTextField(15); panelOne.add(labelName); panelOne.add(textName); JPanel panelTwo = new JPanel(); labelPass = new JLabel("Password"); passField = new JPasswordField(15); panelTwo.add(labelPass); panelTwo.add(passField); JPanel panelThree = new JPanel(); okButton = new JButton("OK"); cancelButton = new JButton("Cancel"); okButton.addActionListener(this); cancelButton.addActionListener(this); panelThree.add(okButton); panelThree.add(cancelButton); dialog = new JDialog(); dialog.setResizable(false); dialog.getContentPane().add(panelOne); dialog.getContentPane().add(panelTwo); dialog.getContentPane().add(panelThree); dialog.setTitle("Login in to Twitter"); dialog.getContentPane().setLayout(new FlowLayout()); dialog.setSize(350, 150); dialog.setLocationRelativeTo(null); // 画面の中央に配置 dialog.setModal(true); dialog.setVisible(true); } public void actionPerformed(ActionEvent e) { if (e.getSource() == okButton) { dialog.dispose(); } else if (e.getSource() == cancelButton) { System.exit(0); } } public String getUserName() { return textName.getText(); } public String getPassword() { return String.valueOf(passField.getPassword()); } }
ここまでは単純明快、古式ゆかしきJavaコードです。ここではFlowLayout
を使用しています。これは、JDialogを継承します。ここに実装した動作は、[OK]ボタンがクリックされたらダイアログウィンドウを閉じ、[Cancel]ボタンがクリックされたらプログラムを丸ごと終了する、というものです。getter
メソッドとして、getUserName()
とgetPassword()
の2つを使用します。[OK]ボタンがクリックされたら、getter
メソッドを通して情報を渡します。実際のログインはmainプログラムで処理され、そこにあるTwitterインスタンスが必要に応じて受け渡しされます。この仕組みをテストするには、次のようなmain
メソッドを上記のクラスに追加します。
public static void main(String[] args) throws TwitterException{ LoginDialog login = new LoginDialog(); String userName = login.getUserName(); String password = login.getPassword(); try{ Twitter twitter = new Twitter(userName, password); twitter.verifyCredentials(); JOptionPane.showMessageDialog(login, "Login successful!"); } catch(TwitterException e){ JOptionPane.showMessageDialog(login, "Unable to login"); } }
新規のTwitterインスタンスを作成してもTwitterExceptionはスローされませんが、verifyCredentials()
メソッドを呼び出すとこの例外がスローされます。正常にログインすると、図2のメッセージが表示されます。