【问题标题】:Twitter4j on java - query search only gives me the 6 most recent resultsJava 上的 Twitter4j - 查询搜索只给我 6 个最近的结果
【发布时间】:2014-11-27 06:05:31
【问题描述】:

我尝试构建一种方法,可以给我在 twitter 中搜索文本的结果,但只给我 6 个最近的结果,我需要更多,50~100~200...真的...还有一些..

我尝试了很多fordo while bucles,只是为了获得更多结果。失败。

有什么方法可以做到吗?我尝试使用getMentions(),但对于错误和不良结果以及其他用途,我需要使用twitter.query(Search)

有人知道吗?

我在玩 TWITTER4J - 4.0.2 版本

这是我的代码:

List<Status> estados = new ArrayList<Status>();

    BufferedReader br = null;
    FileWriter fichero = null;
    PrintWriter pw = null;
    File file = new File("dbmenciones.txt");

    try {

        Query query = new Query();
        query.setQuery("#tits");
        query.setResultType(Query.MIXED);
        query.setCount(100);

        QueryResult qr = null;
        long lastid = Long.MAX_VALUE;

        int vv = 0;

        do {

            vv++;
            if (512 - estados.size() > 100){
                query.setCount(100);
            } else {
                query.setCount(512 - estados.size());
            }

            qr = twitter.search(query);
            estados.addAll(qr.getTweets());

            System.out.println("Obtenidos "+estados.size()+" tweets.");

            for (Status stt : estados){
                if (stt.getId()<lastid) lastid = stt.getId();
            }           



            query.setMaxId(lastid-1);

        } while (vv < 14);

        for (Status status : estados){

            System.out.println(status.getId()+" :  "+status.getText());

            System.out.printf("Publicado : %s, @%-20s ,dijo: %s\n", 
                    status.getCreatedAt().toString(), 
                    status.getUser().getScreenName(), cleanText(status.getText())); 

            listaUsuarios.add("\""+status.getUser().getId()+"\";\""+status.getUser().getScreenName()+"\";\""+status.getUser().getFollowersCount()+"\"");

            fichero = new FileWriter("C:\\Documents and Settings\\a671\\Escritorio\\"+file, true);
            pw = new PrintWriter(fichero);

            System.out.println("Added : "+listaUsuarios.get(listaUsuarios.size()-1));

            pw.println(listaUsuarios.get(listaUsuarios.size()-1));

            if (null != fichero){
                  fichero.close();
             } 
        }

        } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                   try {
                   if (null != fichero)
                      fichero.close();
                   } catch (Exception e2) {
                      e2.printStackTrace();
                   }
                   try {
                        if (br != null) br.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }

            }
}

首先我开始查询,然后我使用do while 多次获得结果。 最后,我将结果输入到 .txt 文件中。 没什么可怕的。 帮助。 谢谢。

【问题讨论】:

标签: java search twitter limit twitter4j


【解决方案1】:

我一直在玩 Twitter4Java,我简化了它。您只需要使用名为twitter4j-core-4.0.1.jar 的库。

如果你让我给你一个建议,我强烈建议你将代码拆分成类,这样代码会更容易理解。这是搜索您要查找的单词的程序,您只需将 IO 库更改为您喜欢的(或只是 System.out.println):

Main.java:

    public class Main implements Constants{

    /*Use the menu Run-> Run configurations...->Arguments -> Program arguments to give a term to be used as parameter*/
    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println(USAGE);
            System.exit(NO_OK);
        }

        TermFinder termFinder = new TermFinder(args[0]);
        new Timer(termFinder);

        String tweetQuery = "Madrid";
        ResultsAnalyzer resultsAnalyzer = new ResultsAnalyzer(tweetQuery);
        System.out.println("Tweets which contains the word "+tweetQuery+":");
        System.out.println(resultsAnalyzer.findInTweet());
        System.out.println("-----------------------------------------------");

        String usernameQuery = "@Linus__Torvalds";
        resultsAnalyzer.setQuery(usernameQuery);
        System.out.println("Searching if user "+usernameQuery+" exists:");
        System.out.println(resultsAnalyzer.findInUserName());
        System.out.println("-----------------------------------------------");

        String hashtagQuery = "#rock";
        resultsAnalyzer.setQuery(hashtagQuery);
        System.out.println(resultsAnalyzer.findInHashtag());
        System.out.println("-----------------------------------------------");

        String hashtagQuery2 = "#aupa_atleti_campeon";
        resultsAnalyzer.setQuery(hashtagQuery2);
        System.out.println(resultsAnalyzer.findInHashtag());
        System.out.println("-----------------------------------------------");
    }

}

ResultsAnalyzer.java:

import java.security.InvalidParameterException;

public class ResultsAnalyzer implements Constants{

    private String query;
    private IO io;

    public ResultsAnalyzer(String query){
        this.setQuery(query);
        this.setIo(new IO());
    }

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        if(query.length()<=TWEET_MAX_LENGTH){
            this.query = query;
        }
        else{
            System.out.println("The term can't be longer than a tweet (140 characters)");
            System.exit(NO_OK);
        }
    }

    public IO getIo() {
        return io;
    }

    public void setIo(IO io) {
        this.io = io;
    }

    /**
     * 
     * @param code: int which can be: 0 to search query in the user name, 1 for search query in tweet
     * @return coincidentData: String which will be empty if there are no matches. Otherwise, it will contain the matches
     */
    public String find(int code){
        if(code != SEARCH_ON_USERNAME && code != SEARCH_ON_TWEET){
            throw new InvalidParameterException("Code must be " + SEARCH_ON_USERNAME + " or "+ SEARCH_ON_TWEET + ".");
        }
        String results = this.getIo().in.readFile(FILE_NAME);
        String[]tweets = results.split("\n");
        if(tweets.length==0){
            return "";//No matches
        }else{
            String aux = "", coincidentData = "";
            for (String tweet : tweets) {
                aux = tweet.split(LINE_SEPARATOR)[code];
                if(aux.contains(this.getQuery())){
                    coincidentData += aux;
                }
            }
            return coincidentData;
        }
    }

    public String findInTweet(){
        String results = find(SEARCH_ON_TWEET);
        if(results.equals("")){
            return "Term \"" + this.getQuery() + "\" not found on any tweet.";
        }
        else{
            return "Term \"" + this.getQuery() + "\" found on the tweet: \""+results+"\"";
        }
    }

    public String findInUserName(){
        String results = find(SEARCH_ON_USERNAME);
        if(results.equals("")){
            return "Username \"" + this.getQuery() + "\" not found.";
        }
        else{
            return "Username \"" + this.getQuery() + "\" found.";
        }
    }

    public String findInHashtag(){
        String possibleMatches = find(SEARCH_ON_TWEET);
        if(possibleMatches.contains(LINE_HEADER)){//At least more than a tweet with the certain hashtag
            String[]tweets = possibleMatches.split(LINE_HEADER);
            String results = "";
            for (String tweet : tweets) {
                if(tweet.contains(HASHTAG + this.getQuery())){
                    results += tweet;
                }
            }
            String finalResult = "";
            if(results.equals("")){
                finalResult = "Hashtag \""+this.getQuery()+"\" not found.";
            }else{
                finalResult = "Hashtag \""+this.getQuery()+"\" found on tweet: \""+results+"\"";
            }
            return finalResult;
        }
        else{//Just one tweet contains the certain hashtag
            String finalResult = "";
            if(possibleMatches.equals("")){
                finalResult = "Hashtag \""+this.getQuery()+"\" not found.";
            }else{
                finalResult = "Hashtag \""+this.getQuery()+"\" found on tweet: \""+possibleMatches+"\"";
            }
            return finalResult;
        }

    }
}

TermFinder.java:

import twitter4j.*;
import twitter4j.auth.AccessToken;

import java.util.List;

public class TermFinder implements Constants{
    /**
     * Usage: java TermFinder [query]
     *
     * @param args: query to search
     */

    private IO io;
    private String word;

    public TermFinder(String word){
        this.setWord(word);
        this.setIo(new IO());
    }

    public IO getIo() {
        return this.io;
    }

    public void setIo(IO io) {
        this.io = io;
    }

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        if(word.length()<=TWEET_MAX_LENGTH){
            this.word = word;
        }
        else{
            System.out.println("The term can't be longer than a tweet (140 characters)");
            System.exit(NO_OK);
        }
    }

    public void find() {
        System.out.println("Starting the search of tweets with the word \""+this.getWord()+"\"...");
        Twitter twitter = new TwitterFactory().getInstance();

        twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        twitter.setOAuthAccessToken(new AccessToken(ACCESS_TOKEN, TOKEN_SECRET));

        try {
            Query query = new Query(this.getWord());
            QueryResult result;
            do {
                result = twitter.search(query);
                List<Status> tweets = result.getTweets();
                String currentTweet = "";
                for (Status tweet : tweets) {
                    System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText());
                    currentTweet += LINE_HEADER + tweet.getUser().getScreenName() + LINE_SEPARATOR + tweet.getText()+"\n";
                    this.getIo().out.writeStringOnFile(FILE_NAME, currentTweet);
                }
            } while ((query = result.nextQuery()) != null);
            System.exit(OK);
            System.out.println("End of the search");
        } catch (TwitterException te) {
            te.printStackTrace();
            System.out.println("Failed to search tweets: " + te.getMessage());
            System.exit(NO_OK);
        }
    }
}

Timer.java:

public class Timer implements Runnable, Constants{

    private Thread thread;
    private TermFinder termFinder;

    public Timer(TermFinder termFinder){
        this.termFinder = termFinder;
        this.thread = new Thread(this);
        this.thread.start();
    }

    @Override
    public void run() {
        try{
            while(true){
                this.termFinder.find();
                Thread.sleep(Constants.PERIOD);
            }
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
    }
}

常量.java:

public interface Constants {

    //OAuth fields
    public static final String CONSUMER_KEY = "XXXXXUSiC5rLRsH0eP4475MJB";
    public static final String CONSUMER_SECRET = "XXXXXBhrVFqoGCcCWjf3vJygE4gnoYuAjJtJvDAm2bLODiQaBj";
    public static final String ACCESS_TOKEN = "XXXXX21983-O92srOl4EtnwYU4bNBTSSj2Dn7tJssucyCjjwJx";
    public static final String TOKEN_SECRET = "XXXXXHFltlISnuUd4TS1q5PTKXdi9uZLEsmziUxtnA7I7";

    //Usage pattern
    public static final String USAGE = "java TermFinder [query]";

    //Results file name, format values and Twitter constants
    public static final String FILE_NAME = "results.txt";
    public static final String LINE_HEADER = "@";
    public static final String LINE_SEPARATOR = "-";
    public static final String HASHTAG = "#";

    //Numeric values and constants
    public static final int PERIOD = 3600000;//milliseconds of an hour (for class Timer)
    public static final int TWEET_MAX_LENGTH = 140;
    public static final int OK = 0;
    public static final int NO_OK = -1;
    public static final int SEARCH_ON_USERNAME = 0;
    public static final int SEARCH_ON_TWEET = 1;

}

在.java中:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class In {

    public In() {
    }

    /**
     * Tranforms the content of a file (i.e: "origin.txt") in a String
     * 
     * @param fileName: Name of the file to read
     * @return String which represents the content of the file
     */
    public String readFile(String fileName) {

        FileReader fr = null;
        try {
            fr = new FileReader(fileName);
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        BufferedReader bf = new BufferedReader(fr);

        String file = "", aux = "";
        try {
            while ((file = bf.readLine()) != null) {
                aux = aux + file + "\n";
            }
            bf.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return aux;
    }
}

Out.java:

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Out {

    public Out() {}

    /**
     * Writes on the file named as the first parameter the String which gets as second parameter.
     * 
     * @param fileName: Destiny file
     * @param message: String to write on the destiny file
     */
    public void writeStringOnFile(String fileName, String message) {
        FileWriter w = null;
        try {
            w = new FileWriter(fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedWriter bw = new BufferedWriter(w);
        PrintWriter wr = new PrintWriter(bw);

        try {
            wr.write(message);
            wr.close();
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

IO.java:

public class IO {

    public Out out;
    public In in;

    /**
     * Object which provides an equivalent use to Java 'System' class
     */
    public IO() {
        this.setIn(new In());
        this.setOut(new Out());
    }

    public void setIn(In in) {
        this.in = in;
    }

    public In getIn() {
        return this.in;
    }

    public void setOut(Out out) {
        this.out = out;
    }

    public Out getOut() {
        return this.out;
    }
}

希望对您有所帮助。如果您有任何问题,请告诉我。

克莱门西奥·莫拉莱斯·卢卡斯。

【讨论】:

  • 谢谢,但我用的是 twitter4j,你用的是什么 .JAR?
  • 我用的是同一个,你有问题吗?我可以编译这段代码并用 twitter4j 很好地执行它。
  • Api,IO 在我的 jar 中不匹配。我正在使用 4.0.2 版本:核心、异步、媒体支持、示例和流。那五个罐子。
  • @user3050751 我刚刚上传了这个link中的库。
  • 在我的工作中无法通过被阻止的站点从 Dropbox 下载。库的名称是什么?我寻找
猜你喜欢
  • 2023-03-09
  • 2023-03-20
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2016-03-11
相关资源
最近更新 更多