Twitter4j,用关键字搜索推文

时间:2015-02-01 19:20:40

标签: android twitter twitter4j

我正在制作一个Twitter项目,用特定关键字搜索所有公开推文。 以下崩溃我的应用程序:

 private void searchTweets() {

        ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true)
                .setOAuthConsumerKey(getString(R.string.twitter_consumer_key))
                .setOAuthConsumerSecret(getString(R.string.twitter_consumer_secret))
                .setOAuthAccessToken(getString(R.string.twitter_access_token))
                .setOAuthAccessTokenSecret(getString(R.string.twitter_token_secret));

        TwitterFactory tf = new TwitterFactory(cb.build());
        Twitter twitter = tf.getInstance();


        try {
            Query query = new Query("India");
            QueryResult result;
            do {
                result = twitter.search(query);
                List<Status> tweets = result.getTweets();
                for (Status tweet : tweets) {
                   // System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText());
                    Log.e("TweetSearch",tweet.getUser().getScreenName() + " - " + tweet.getText() ) ;

                }
            } while ((query = result.nextQuery()) != null);
            System.exit(0);
        } catch (TwitterException te) {
            te.printStackTrace();
           // System.out.println("Failed to search tweets: " + te.getMessage());

            Log.e("TweetSearch", te.getMessage());
            System.exit(-1);
        }
    }

我想在列表中显示推文。我已经处理了所需的所有身份验证,并且应用程序身份验证流程也没问题。我如何知道搜索到的推文的JSON数据,以便我可以将其解析到我的列表中?

我试过这个,如何实现asyntask?

public class LimetrayTweets extends Activity {

    public static final String TAG = "TweetSearch";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_limetray_tweets);

        SearchTweet("Limetray");



    }

    public static String SearchTweet(String searchTerm) {
        HttpURLConnection httpConnection = null;
        BufferedReader bufferedReader = null;
        StringBuilder response = new StringBuilder();

        try {



            URL url = new URL(Constants.URL_SEARCH +  URLEncoder.encode("#" + searchTerm) + "&result_type=mixed&lang=en");
            Log.e(TAG, "url twitter search: " + url.toString());

            httpConnection = (HttpURLConnection) url.openConnection();
            httpConnection.setRequestMethod("GET");


            String jsonString = appAuthentication();
            JSONObject jsonObjectDocument = new JSONObject(jsonString);
            String token = jsonObjectDocument.getString("token_type") + " " +
                    jsonObjectDocument.getString("access_token");

            httpConnection.setRequestProperty("Authorization", token);
            httpConnection.setRequestProperty("Content-Type", "application/json");
            httpConnection.connect();

            bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));

            String line;
            while ((line = bufferedReader.readLine()) != null){
                response.append(line);
            }

            Log.d(TAG, "GET response code: " + String.valueOf(httpConnection.getResponseCode()));
            Log.d(TAG, "JSON response: " + response.toString());


        } catch (Exception e) {
            Log.e(TAG, "GET error: " + Log.getStackTraceString(e));

        }finally {
            if(httpConnection != null){
                httpConnection.disconnect();

            }
        }

        return response.toString();
    }

    public static String appAuthentication(){

        HttpURLConnection httpConnection = null;
        OutputStream outputStream = null;
        BufferedReader bufferedReader = null;
        StringBuilder response = null;

        try {
            URL url = new URL(Constants.URL_AUTHENTICATION);
            httpConnection = (HttpURLConnection) url.openConnection();
            httpConnection.setRequestMethod("POST");
            httpConnection.setDoOutput(true);
            httpConnection.setDoInput(true);

            String accessCredential = Constants.CONSUMER_KEY + ":" + Constants.CONSUMER_SECRET;
            String authorization = "Basic " + Base64.encodeToString(accessCredential.getBytes(), Base64.NO_WRAP);
            String param = "grant_type=client_credentials";

            httpConnection.addRequestProperty("Authorization", authorization);
            httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            httpConnection.connect();

            outputStream = httpConnection.getOutputStream();
            outputStream.write(param.getBytes());
            outputStream.flush();
            outputStream.close();
//            int statusCode = httpConnection.getResponseCode();
//            String reason =httpConnection.getResponseMessage();

            bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
            String line;
            response = new StringBuilder();

            while ((line = bufferedReader.readLine()) != null){
                response.append(line);
            }

            Log.d(TAG, "POST response code: " + String.valueOf(httpConnection.getResponseCode()));
            Log.d(TAG, "JSON response: " + response.toString());

        } catch (Exception e) {
            Log.e(TAG, "POST error: " + Log.getStackTraceString(e));

        }finally{
            if (httpConnection != null) {
                httpConnection.disconnect();
            }
        }
        return response.toString();
    }

2 个答案:

答案 0 :(得分:0)

我正在为您发布我的实时代码。希望它适合您。 SearchTerm是search.Below方法的关键字,它将在String中返回一个json响应。

如果你想要gson序列化类。我会为你提供

ProgressDialog pd;

            new DownloadTwitterTask().execute(keyword);

 private class DownloadTwitterTask extends AsyncTask<String, Void, String> {
            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                pd = ProgressDialog.show(Mainactivity.this, "",
             "Loading.....", true, false);

            }

        protected String doInBackground(String... searchTerms) {
                    String result = null;

                    if (searchTerms.length > 0) {

                        result = TwitterUtils.getTimelineForSearchTerm(searchTerms[0]);

                    }
                    return result;
                }
    @Override
            protected void onPostExecute(String result) {
    if (pd != null && pd.isShowing()) {
        pd.dismiss();
    }
                Log.e("twitter Result ", result);

       //Result contains json response. take a arraylist of objects and pass //arralist  to adpater of listview. 

    }

}

getTimelineForSearchTerm方法:

public static String getTimelineForSearchTerm(String searchTerm){
          HttpURLConnection httpConnection = null;
          BufferedReader bufferedReader = null;
          StringBuilder response = new StringBuilder();

          try {



              URL url = new URL(ConstantsUtils.URL_SEARCH +  URLEncoder.encode("#"+searchTerm) + "&result_type=mixed&lang=en");
              Log.e(TAG, "url twitter search: " + url.toString());

              httpConnection = (HttpURLConnection) url.openConnection();
              httpConnection.setRequestMethod("GET");


              String jsonString = appAuthentication();
              JSONObject jsonObjectDocument = new JSONObject(jsonString);
              String token = jsonObjectDocument.getString("token_type") + " " +
                      jsonObjectDocument.getString("access_token");

              httpConnection.setRequestProperty("Authorization", token);
              httpConnection.setRequestProperty("Content-Type", "application/json");
              httpConnection.connect();

              bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));

              String line;
              while ((line = bufferedReader.readLine()) != null){
                  response.append(line);
              }

              Log.d(TAG, "GET response code: " + String.valueOf(httpConnection.getResponseCode()));
              Log.d(TAG, "JSON response: " + response.toString());


        } catch (Exception e) {
            Log.e(TAG, "GET error: " + Log.getStackTraceString(e));

        }finally {
            if(httpConnection != null){
                httpConnection.disconnect();

            }
        }

        return response.toString();
    }   
}

appAuthentication Method:

public static final String TAG = "TwitterUtils";

    public static String appAuthentication(){

        HttpURLConnection httpConnection = null;
        OutputStream outputStream = null;
        BufferedReader bufferedReader = null;
        StringBuilder response = null;

        try {
            URL url = new URL(ConstantsUtils.URL_AUTHENTICATION);
            httpConnection = (HttpURLConnection) url.openConnection();
            httpConnection.setRequestMethod("POST");
            httpConnection.setDoOutput(true);
            httpConnection.setDoInput(true);

            String accessCredential = ConstantsUtils.CONSUMER_KEY + ":" + ConstantsUtils.CONSUMER_SECRET;
            String authorization = "Basic " + Base64.encodeToString(accessCredential.getBytes(), Base64.NO_WRAP);
            String param = "grant_type=client_credentials";

            httpConnection.addRequestProperty("Authorization", authorization);
            httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            httpConnection.connect();

            outputStream = httpConnection.getOutputStream();
            outputStream.write(param.getBytes());
            outputStream.flush();
            outputStream.close();
//            int statusCode = httpConnection.getResponseCode();
//            String reason =httpConnection.getResponseMessage();

            bufferedReader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream()));
            String line;
            response = new StringBuilder();

            while ((line = bufferedReader.readLine()) != null){
                response.append(line);
            }

            Log.d(TAG, "POST response code: " + String.valueOf(httpConnection.getResponseCode()));
            Log.d(TAG, "JSON response: " + response.toString());

        } catch (Exception e) {
            Log.e(TAG, "POST error: " + Log.getStackTraceString(e));

        }finally{
            if (httpConnection != null) {
                httpConnection.disconnect();
            }
        }
        return response.toString();
    }

Utils:

public class ConstantsUtils {

    public static final String URL_ROOT_TWITTER_API = "https://api.twitter.com";
    public static final String URL_SEARCH = URL_ROOT_TWITTER_API + "/1.1/search/tweets.json?q=";
    public static final String URL_AUTHENTICATION = URL_ROOT_TWITTER_API + "/oauth2/token";
    public static final String CONSUMER_KEY = "";
    public static final String CONSUMER_SECRET = "";
}

答案 1 :(得分:0)

Twitter4j成功实施:

@Override
protected ArrayList<String> doInBackground(String... arg0) {

    List<twitter4j.Status> tweets = new ArrayList();
    tweetTexts.clear();

    Twitter mTwitter = getTwitter();
    try {

        tweets = mTwitter.search(new Query(searchText)).getTweets();
        for (twitter4j.Status t : tweets) {
        tweetTexts.add(t.getText() + "\n\n");
        }

    } catch (Exception e) {
        Log.e("Error", "Exception");
    }



    return tweetTexts;
}