2010-11-11 125 views
21

我需要使用哪個API來獲取特定用戶的最近推文與公共賬戶的關係?Twitter API以獲取特定用戶的最近推文

+2

您使用的是哪種語言? – Tim 2010-11-11 09:22:19

+0

原來我可以直接通過http調用來獲取此信息。 http://api.twitter.com/1/statuses/user_timeline.json?screen_name=noradio&count=5 – user330973 2010-11-11 17:20:12

+1

下面是一個鏈接,您可以在其中找到使用twitter 1.1 API http:// stackoverflow選擇推文的代碼。com/questions/12916539 /最簡單的php例子檢索用戶時間軸與twitter-api版本1-1 – lackovic10 2012-12-22 23:24:59

回答

14

要從特定用戶獲取推文,您需要使用GET statuses/user_timeline API方法。

+9

@AdamSack此方法尚未被棄用。 – abraham 2013-06-28 17:45:18

+3

只需在端點末尾添加'?screen_name = USERNAME'。 – 2013-12-27 18:46:45

6

最新的5條推特與PHP代碼。

$tweets_result=file_get_contents("https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=username&count=5"); 
$data=json_decode($tweets_result); 
print_r($data); 
+12

注意:由於OAuth和v1.1 API,這不再有效。 – Jimbo 2013-06-06 13:31:00

13

由於2013年5月7日的,Twitter的已經過時V1.0被退役和v1.1是訪問API,使用通過OAuth認證請求的唯一方法。

v1.0 deprecated

這意味着你不會能夠使用PHP的file_get_contents()完全依靠它自己抓住這樣的事情 - 你需要編寫利用OAuth的Twitter的和V1.1 API的腳本。

I recently wrote a Stack Overflow answer幫助新手進入twitter v1.1 API,我寫了一個類來讓你更容易。

您需要創建一個開發人員帳戶,獲取一組開發人員密鑰以在您的應用程序中使用,並使用OAuth進行身份驗證請求。如果您閱讀上面的帖子,您會看到我創建了一個simple class以允許您執行此操作。

TLDR:不能使用任何1.0以上,使用1.1和這個類簡單:https://github.com/J7mbo/twitter-api-php

+0

您*可以*在OAuth中使用file_get_contents。 – hakre 2013-04-29 14:38:24

+0

@hakre固定:) – Jimbo 2013-04-29 14:39:24

+0

缺點也在你的課上Github上。愚蠢捲曲你混蛋不需要,如果file_get_contents在那裏;)(首先解決這個錯誤消息到一些有用的東西我會說) – hakre 2013-04-29 14:40:15

0

我們可以使用Twitter REST API來獲得特定用戶的tweet。您可以下載Display Tweets of a particular user in an Android

activity_main.xml中的源

<RelativeLayout android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android" > 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="40dp" 
     android:id="@+id/rl_menu" 
     android:background="@color/colorPrimaryDark"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Twitter Tweets" 
      android:textColor="#ffffff" 
      android:textSize="15dp" 
      android:layout_centerInParent="true"/> 
    </RelativeLayout> 

    <ListView 
     android:layout_width="match_parent" 
     android:id="@+id/lv_list" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/rl_menu"></ListView> 

    </RelativeLayout> 

MainActivity.java

package com.gettweets; 

import android.app.Activity; 
import android.app.ListActivity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Base64; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.Toast; 

import com.google.gson.Gson; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.methods.HttpRequestBase; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.params.BasicHttpParams; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import java.io.*; 
import java.net.URLEncoder; 
import java.util.ArrayList; 

/** 
* Demonstrates how to use a twitter application keys to access a user's timeline 
*/ 
public class MainActivity extends Activity { 

    final static String ScreenName = "Deepshikhapuri"; 
    final static String LOG_TAG = "rnc"; 
    ListView lv_list; 
    ArrayList<String> al_text = new ArrayList<>(); 
    Adapter obj_adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv_list = (ListView)findViewById(R.id.lv_list); 

     downloadTweets(); 
    } 

    // download twitter timeline after first checking to see if there is a network connection 
    public void downloadTweets() { 
     ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

     if (networkInfo != null && networkInfo.isConnected()) { 
      new DownloadTwitterTask().execute(ScreenName); 
     } else { 
      Toast.makeText(getApplicationContext(),"Please check your internet connection",Toast.LENGTH_SHORT).show(); 
     } 
    } 

    // Uses an AsyncTask to download a Twitter user's timeline 
    private class DownloadTwitterTask extends AsyncTask<String, Void, String> { 
     final static String CONSUMER_KEY = "nW88XLuFSI9DEfHOX2tpleHbR"; 
     final static String CONSUMER_SECRET = "hCg3QClZ1iLR13D3IeMvebESKmakIelp4vwFUICuj6HAfNNCer"; 
     final static String TwitterTokenURL = "https://api.twitter.com/oauth2/token"; 
     final static String TwitterStreamURL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name="; 
     final ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      dialog.setTitle("Loading"); 
      dialog.setMessage("Please wait"); 
      dialog.show(); 

     } 

     @Override 
     protected String doInBackground(String... screenNames) { 
      String result = null; 

      if (screenNames.length > 0) { 
       result = getTwitterStream(screenNames[0]); 
      } 
      return result; 
     } 

     // onPostExecute convert the JSON results into a Twitter object (which is an Array list of tweets 
     @Override 
     protected void onPostExecute(String result) { 
      Log.e("result",result); 
      dialog.dismiss(); 

      try { 
       JSONArray jsonArray_data = new JSONArray(result); 
       al_text.clear(); 
       for (int i=0; i<jsonArray_data.length();i++){ 

        JSONObject jsonObject = jsonArray_data.getJSONObject(i); 
        al_text.add(jsonObject.getString("text")); 

       } 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 



      // send the tweets to the adapter for rendering 
      obj_adapter= new Adapter(getApplicationContext(), al_text); 
      lv_list.setAdapter(obj_adapter); 
     } 


     // convert a JSON authentication object into an Authenticated object 
     private Authenticated jsonToAuthenticated(String rawAuthorization) { 
      Authenticated auth = null; 
      if (rawAuthorization != null && rawAuthorization.length() > 0) { 
       try { 
        Gson gson = new Gson(); 
        auth = gson.fromJson(rawAuthorization, Authenticated.class); 
       } catch (IllegalStateException ex) { 
        // just eat the exception 
       } 
      } 
      return auth; 
     } 

     private String getResponseBody(HttpRequestBase request) { 
      StringBuilder sb = new StringBuilder(); 
      try { 

       DefaultHttpClient httpClient = new DefaultHttpClient(new BasicHttpParams()); 
       HttpResponse response = httpClient.execute(request); 
       int statusCode = response.getStatusLine().getStatusCode(); 
       String reason = response.getStatusLine().getReasonPhrase(); 

       if (statusCode == 200) { 

        HttpEntity entity = response.getEntity(); 
        InputStream inputStream = entity.getContent(); 

        BufferedReader bReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
        String line = null; 
        while ((line = bReader.readLine()) != null) { 
         sb.append(line); 
        } 
       } else { 
        sb.append(reason); 
       } 
      } catch (UnsupportedEncodingException ex) { 
      } catch (ClientProtocolException ex1) { 
      } catch (IOException ex2) { 
      } 
      return sb.toString(); 
     } 

     private String getTwitterStream(String screenName) { 
      String results = null; 

      // Step 1: Encode consumer key and secret 
      try { 
       // URL encode the consumer key and secret 
       String urlApiKey = URLEncoder.encode(CONSUMER_KEY, "UTF-8"); 
       String urlApiSecret = URLEncoder.encode(CONSUMER_SECRET, "UTF-8"); 

       // Concatenate the encoded consumer key, a colon character, and the 
       // encoded consumer secret 
       String combined = urlApiKey + ":" + urlApiSecret; 

       // Base64 encode the string 
       String base64Encoded = Base64.encodeToString(combined.getBytes(), Base64.NO_WRAP); 

       // Step 2: Obtain a bearer token 
       HttpPost httpPost = new HttpPost(TwitterTokenURL); 
       httpPost.setHeader("Authorization", "Basic " + base64Encoded); 
       httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); 
       httpPost.setEntity(new StringEntity("grant_type=client_credentials")); 
       String rawAuthorization = getResponseBody(httpPost); 
       Authenticated auth = jsonToAuthenticated(rawAuthorization); 

       // Applications should verify that the value associated with the 
       // token_type key of the returned object is bearer 
       if (auth != null && auth.token_type.equals("bearer")) { 

        // Step 3: Authenticate API requests with bearer token 
        HttpGet httpGet = new HttpGet(TwitterStreamURL + screenName); 

        // construct a normal HTTPS request and include an Authorization 
        // header with the value of Bearer <> 
        httpGet.setHeader("Authorization", "Bearer " + auth.access_token); 
        httpGet.setHeader("Content-Type", "application/json"); 
        // update the results with the body of the response 
        results = getResponseBody(httpGet); 
       } 
      } catch (UnsupportedEncodingException ex) { 
      } catch (IllegalStateException ex1) { 
      } 
      return results; 
     } 
    } 
} 

Authenticated.java 包com.gettweets;

public class Authenticated { 
    String token_type; 
    String access_token; 
} 

adapter_layout.xml

<RelativeLayout android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 


    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/tv_text" 
     android:textSize="18dp" 
     android:layout_margin="10dp" 
     android:textColor="#000000"/> 

    </RelativeLayout> 

Adapter.java

package com.gettweets; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Calendar; 
import java.util.Date; 



public class Adapter extends ArrayAdapter<String> { 

    Context context; 
    ViewHolder viewHolder; 
    ArrayList<String> al_newslist=new ArrayList<>(); 

    public Adapter(Context context, ArrayList<String> al_newslist) { 
     super(context, R.layout.adapter_layout, al_newslist); 
     this.al_newslist=al_newslist; 
     this.context=context; 



    } 

    @Override 
    public int getCount() { 

     Log.e("ADAPTER LIST SIZE",al_newslist.size()+""); 
     return al_newslist.size(); 
    } 
    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     if (al_newslist.size() > 0) { 
      return al_newslist.size(); 
     } else { 
      return 1; 
     } 
    } 
    @Override 
    public long getItemId(int position) { 
     return position; 
    } 



    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 

      viewHolder = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.adapter_layout, parent, false); 
      viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_text); 



      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 


     viewHolder.tv_name.setText(al_newslist.get(position)); 


     return convertView; 

    } 

    private static class ViewHolder { 
     TextView tv_name; 



    } 

} 
相關問題