簡體   English   中英

Twitter4j,搜索帶有關鍵字的推文

[英]Twitter4j , searching for tweets with keyword

我正在創建一個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數據,以便將其解析到列表中?

我試過了,如何實現異步任務?

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();
    }

正在為您發布我的實時代碼。希望它對您有用。 SearchTerm是您搜索的關鍵字.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方法:

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();
    }

實用程序:

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 = "";
}

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM