TwitterのDMで自動応答プログラムを作成する方法

このQ&Aのポイント
  • TwitterAPI(Twitter4J)を利用してダイレクトメッセージに来た特定のコメントに対してリアルタイムで応答できるプログラムを作成する方法を紹介します。
  • Twitter4Jのサンプルプログラムを拡張して作成しようとしていますが、エラーが発生しています。どのようなソースコードを書けば問題が解決されるでしょうか。
  • TwitterのDM自動応答プログラムを作成するためには、TwitterAPIとTwitter4Jを利用し、ユーザーからのダイレクトメッセージをリアルタイムで受信し、特定のコメントに対して自動応答する機能を実装する必要があります。
回答を見る
  • ベストアンサー

TwitterのDMで自動応答プログラム

TwitterAPI(Twitter4J)を利用してダイレクトメッセージに来た特定のコメントに対してリアルタイムで 応答できるプログラムを作ろうとしています。 Twitter4JのサンプルにあったプログラムPrintUserStreamを拡張して作成しようとしていますが、 かなり初歩的なところで躓いています。アドバイスいただけると助かります。 下のプログラムではonDirectMessage内でsendDirectMessageメソッドを呼び出そうとしていますが、 twitterオブジェクトが参照できずエラーになってしまいます。 代わりにcb2の認証定義をonDirectMessage内に宣言すると随時onDirectMessageイベントが発生するたび認証してしまいよろしくありません。 どのようなソースコードを書けば問題が解決されるでしょうか。 ----------ソースサンプル---------------------------------------------- class PrintUserStream { public static void main(String[] args) throws TwitterException { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) .setOAuthConsumerKey("xxx") .setOAuthConsumerSecret("xxx") .setOAuthAccessToken("xxx") .setOAuthAccessTokenSecret("xxx"); ConfigurationBuilder cb2 = new ConfigurationBuilder(); cb2.setDebugEnabled(true) .setOAuthConsumerKey("xxx") .setOAuthConsumerSecret("xxx") .setOAuthAccessToken("xxx") .setOAuthAccessTokenSecret("xxx"); Twitter twitter = new TwitterFactory(cb2.build()).getInstance(); TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance(); twitterStream.addListener(listener); // user() method internally creates a thread which manipulates TwitterStream and calls these adequate listener methods continuously. twitterStream.user(); } public static UserStreamListener listener = new UserStreamListener() { // private DirectMessagesResources twitter; @Override public void onStatus(Status status) { System.out.println("onStatus @" + status.getUser().getScreenName() + " - " + status.getText()); } @Override public void onDirectMessage(DirectMessage directMessage) { System.out.println("onDirectMessage text:" + directMessage.getText()); System.out.println(directMessage.getSenderId()); if(directMessage.getText().contains("xxx")){ System.out.println(directMessage.getText()); twitter.sendDirectMessage(ID, "コメント"); } } }; }

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

TwitterAPIを使用したことはありません。 解決方法は2つ。 その1.Twitter twitterをfinal Twitter twitterにする。 その2.UserStreamListenerを無名クラスにするのをやめて、クラスを定義し、twitterの参照を渡す。

関連するQ&A

  • プログラムの組み合わせ方

    java初心者です。 2つのプログラムを組み合わせて1つのプログラムにしたいんですが、イマイチ分かりません。 このプログラムと、 import java.io.*; class Hello2 {  public static void main(String[] args) throws IOException {   System.out.println("名前を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   System.out.println(str + "さん、こんにちは!");  } } このプログラムを、 import java.io.*; class Sanbai{  public static void main(String[] args) throws IOException {   System.out.println("好きな数を入力してください");   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   String str = br.readLine();   int x;   x = Integer.parseInt(str);   System.out.println("あなたの入力した数:" + x);   System.out.println("その3倍の数:" + (x*3));  } } 組み合わせて1つのプログラムにするにはどうしたらいいですか?(>_<)

    • ベストアンサー
    • Java
  • throw文について

    上と下のソースプログラムがよく似ているのにもかかわらず上記のプログラムでコンパイルエラー発生する理由がわかりません。 解決方法はpublic static void badMethod()throws IOException{に書き換えるということが分かっていますがイマイチ理屈が分からない次第であります。 たぶん、上記のプログラムはimport文があるからだと思うのですが回答のほどよろしくお願い致します。 (コンパイルエラー) import java.io.IOException; class TryCatch{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(IOException ex){ System.out.println("B"); } catch(Exception e){ System.out.println("C"); } System.out.println("E"); } public static void badMethod(){ throw new IOException(); } } (コンパイル正常) public class X{ public static void main(String args[]){ try{ badMethod(); System.out.println("A"); } catch(Exception ex){ System.out.println("B"); } finally{ System.out.println("C"); } System.out.println("D"); } public static void badMethod(){ throw new RuntimeException(); } }

  • javaプログラムのクラス図など

    「下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。」 の部分が3週間自分なりに調べたりしたのですが全く分からなく このように質問している恥ずかしい状況です(>_<) 正直言って、明日までの課題です。。。 人生がかかっている言うと大袈裟に聞こえるかもしれないんですが 正直その通りなんです。。。 お力添えしていただける方を探しています。 どうか、お助けください。。。。。。 問題 オブジェクト指向の三大要素についてまとめなさい。次に、下記のプログラム例のクラス図を描き、プログラム例にはクラス図に対応するブロックにブロックコメントを挿入しなさい。最後にプログラム例でオブジェクト指向の三大要素がどのように実現されているかを説明してください。 Animalインタフェース public interface Animal { public abstract void bark(); } ーーーーーーーーーーーーーーー Petインタフェース public interface Pet extends Animal { public String getName(); } ーーーーーーーーーーーーーーー Catクラス class Cat implements Pet { private String name; public Cat(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("ね こ:ニャー"); } } ーーーーーーーーーーーーーーー Dogクラス class Dog implements Pet { private String name; public Dog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("い ぬ:ワン"); } } ーーーーーーーーーーーーーーーー Duckクラス class Duck implements Pet { private String name; public Duck(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("あひる:ガーガー"); } } ーーーーーーーーーーーーーーーー Frogクラス class Frog implements Pet { private String name; public Frog(String name) { this.name = name; } @Override public String getName() { return name; } @Override public void bark() { System.out.println("かえる:ケロケロ"); } } ーーーーーーーーーーーーーーーー PetTestクラス public class PetTest { public static void main (String[] args) { Pet[] pets = {new Cat("タロー"), new Dog("ミケ"), new Frog("ケロ"), new Duck("ドナルド") }; System.out.println(); for(Pet pet: pets) { System.out.printf("\t%8s\t", pet.getName()); pet.bark(); } System.out.println(); } } ーーーーーーーーーーーーーーーーーー 実行結果がこうなります D:\Work >java PetTest タロー ね こ:ニャー ミケ い ぬ:ワン ケロ かえる:ケロケロ ドナルド あひる:ガーガー -- Press any key to exit (Input "c" to continue) -- 上の問題なのですが もし解くことができる方がいましたら お願いします_(._.)_

  • java iを1づつ増やすプログラムと2づつ増やすプログラム

    次のようにすればiを1づつ増やして表示されます。 class Calc{   int i=1;   int add(){     return i++;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 1 i = 2 i = 3 しかし次のように2づつ増やそうとすると、 class Calc{   int i=1;   int add(){     return i+2;   } } class Count{   public static void main(String[] args){     Calc calc = new Calc();     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());     System.out.println("i = " + calc.add());   } } 実行結果 i = 3 i = 3 i = 3 このようになってしまいます。どこがおかしいのでしょうか?

    • ベストアンサー
    • Java
  • Javaプログラムの間違いを見つけてください

    下記のプログラムをマニュアル通りに入力したのですが、おそらくマニュアルにミスがあったのでしょう。どこが間違っているのか教えてください。よろしくお願いしますm_ _m class kadai1710 { public static void main (String args []) { System.out.println(args[0]); if(Integer.parselnt(args[0]) == 1) System.out.println("男性"); else System.out.println("女性"); } }

    • ベストアンサー
    • Java
  • javaプログラムのファイル書き出しについて

    以前はファイルに書き出すためのパスが違っており、書き出せずにいるところをアドバイスいただきありがとうございます。 プロフィールを書くプログラムを組んでいます。 打ち込んだプロフィールを画面に表示すると同時に、ファイルにも結果を書き出したいのですが、書き出せれる内容が、打ち込んだ内容ではなく、 プルグラムの書き込み欄に例として表示される用に書いている、 下の内容が書き出されてしまいます。 「name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30);」 テキストファイルに書き出される内容です。 「名前:名前 生年月日:生年月日 住所:住所 mail:mail 電話:電話番号」 打ち込んだ内容がテキストファイルに書き出すにはどうすればいいでしょうか? 下がソースコードです。 よろしくお願いします。 import java.io.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; class Sample extends JFrame implements ActionListener{ /** * */ private static final long serialVersionUID = 1L; static JTextField name; static JTextField birth; static JTextField address; static JTextField mail; static JTextField number; JLabel label; public static void main(String args[]){ Sample frame = new Sample("profile"); frame.setVisible(true); } Sample(String title){ setTitle(title); setBounds(100, 100, 500, 300); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); name = new JTextField("名前", 20); birth = new JTextField("生年月日", 20); address = new JTextField("住所", 40); mail = new JTextField("mail", 40); number= new JTextField("電話番号", 30); JButton button = new JButton("取得"); button.addActionListener(this); label = new JLabel(); p.add(name); p.add(birth); p.add(address); p.add(mail); p.add(number); p.add(button); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); contentPane.add(label, BorderLayout.SOUTH); try{ File file = new File("C:\\Users\\mattun\\Documents\\sample.txt"); if (checkBeforeWritefile(file)){ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file))); //ファイルに書き込む内容 pw.println("名前:"+name.getText()); pw.println("生年月日:"+birth.getText()); pw.println("住所:"+address.getText()); pw.println("mail:"+mail.getText()); pw.println("電話:"+number.getText()); pw.close();//ファイルを閉じる }else{ System.out.println("ファイルに書き込めません");//書き込み出来ない場合 } }catch(IOException e){ System.out.println(e); } } public void actionPerformed(ActionEvent e){ label.setText("<html>"+"名前:"+name.getText()+"<br>"+"生年月日:"+birth.getText()+"<br>"+"住所:"+address.getText()+ "<br>"+"mail:"+mail.getText()+"<br>"+"電話:"+number.getText()+"</html>"); } private static boolean checkBeforeWritefile(File file){ if (file.exists()){ if (file.isFile() && file.canWrite()){ return true; } } return false; } }

    • ベストアンサー
    • Java
  • ifを使った判断プログラムです(おそらく簡単)

    以下のプログラムをコンパイルしたいのですが、8行目のシンボル:変数readerが見つからないと表示されます。 いくら見直しても改善方法がわからないので、質問しました。 おそらく簡単な問題であると思うのですがわからなくて・・・ それともreader.readLine();がコマンドプロントンでは反応できないものなのでしょうか。 教えてください。よろしくお願いします。 import java.io.*; public class Kasa1{ public static void main(String[] args){ BufferedReader br = new BufferedReader(new InputStreamReader(System.in),1); try{ System.out.println("降水確率を入力してください。"); String line = reader.readLine(); int n = Integer.parseInt(line); System.out.println("降水確率は" + n + "%です。"); if(n >= 50){ System.out.println("傘を忘れずにね。"); } else { System.out.println("傘はいりません。"); } System.out.println("いってらっしゃい。"); } catch(IOException e){ System.out.println(e); } catch(NumberFormatException e){ System.out.println("数字の形式が正しくありません。"); } } }

    • ベストアンサー
    • Java
  • 下記のようなjavaのプログラムで、* や / を入力しても,

    下記のようなjavaのプログラムで、* や / を入力しても, 必ず判定がfalseのほうになるんですけど、どうすれば良いですか? あまりjavaには詳しくないので、分かりやすく教えていただければ幸いです。お願いします。 import java.io.*; public class test{ public static void main(String[] args) throws IOException{ BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String a; a = input.readLine(); if((a == "*") ^ (a == "/")){ System.out.println("OK"); }else{ System.out.println("エラー"); } } }

    • ベストアンサー
    • Java
  • この2つのプログラムは全く同じものでしょうか?

    class Base{ protected int x; Base() { this.x=0;} Base(int x) {this.x=x;} void print(){ System.out.println("Base.x="+x);} } class Derived extends Base{ int x; Derived(int x1,int x2){ super(x1); this.x=x2;} void print(){ super.print(); System.out.println("Derived.x="+x);} } public class SuperTester{ public static void main(String[] args){ Base a =new Base(10); System.out.println("----a----"); a.print(); Derived b=new Derived(20,30); System.out.println("----b----"); b.print(); } } このプログラムと、 このプログラムのDerivedクラスのコンストラクタの部分を Derived(int x1,int x2){ super.x=x1; this.x=x2;} に変えたプログラムです。 かなりややこしいのですが、この2つのプログラムはソースは一部違いますが、 意味するものは全く同じでしょうか? ちなみにこの2つは実行結果は同じになります。 【実行結果】 ----a---- Base.x=10 ----b---- Base.x=20 Derived.x=30 つまり、Derivedクラスでint x;を書かず、 よろしくお願いします。

    • ベストアンサー
    • Java
  • JAVAプログラムで質問です

    下のように作動するJAVAプログラムを作成して欲しいと言われたのですが、私には良く分かりませんでした。 プログラムについて分かる方!是非、このプログラムを下のように動くように改良していただけないでしょうか? 宜しくお願い致します。 今の状態は、 --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 やまもと←入力してエンター やまもとさん。よろしく。 --- となりますが、10秒間、入力しない場合には、 >>の部分が何度も繰り返されるようにしたいのですがどのようなプログラムになりますか? --- こんにちは。私はコンピュータです。 あなたの名前を入力してください。 >>まだ~。早く入力して~。 >>あなたの名前を入力してください。 --- import java.io.*; class Hello2 { public static void main(String[] args) throws Exception { System.out.println("こんにちは。私はコンピュータです。"); System.out.println("あなたの名前を入力してください。"); String name; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); name = br.readLine(); System.out.println(name + "さん。よろしく。"); br.close(); } }

    • ベストアンサー
    • Java