[英]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.