2013-06-18 7 views
9

Ich versuche, eine Benutzer-Timeline von twitter mit oauth2 (für die Authentifizierung nur für Anwendungen), aber das Ergebnis ist immer Null. Ich habe keine Erfahrung mit OAUTH, und ich habe mir ein paar Tutorials und Beispiele angeschaut, aber bisher noch kein Glück. Ich brauche eine bestimmte Benutzerzeitleiste (in diesem Beispiel Twitter), ohne dass sich der Benutzer anmelden muss.Twitter-Anwendung nur Authentifizierung Java-Android mit twitter4j

Ich hatte eine Anwendung, die twitter API 1 verwendet und ich habe versucht, meinen vorhandenen Code an die neue API 1.1 mit oauth2 für Application-only-Authentifizierung anzupassen. Der Code sollte funktionieren, außer dass er von Twitter nichts zurückbekommt. Wenn ich ein Ergebnis zurückbekomme, sollte es wieder funktionieren.

Die Verbindung mit Twitter erfolgt in der Funktion twitterconnect unter dem asyncop.

hier ist mein Code:

public class TwitterActivity extends Activity { 

private ConfigurationBuilder builder; 

// twitter consumer key and secret 
static String TWITTER_CONSUMER_KEY = "**************"; 
static String TWITTER_CONSUMER_SECRET = "*************"; 

// twitter acces token and accestokensecret 
static String TWITTER_ACCES_TOKEN = "************"; 
static String TWITTER_ACCES_TOKEN_SECRET = "************"; 

ArrayList<Tweet> tweets = new ArrayList<Tweet>(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.twitter); 

    new AsyncOp().execute("test"); 

} 

//Async class... 
    public class AsyncOp extends AsyncTask<String, Void,List<twitter4j.Status>> { 

    protected List<twitter4j.Status> doInBackground(String... urls) { 

    //auth with twitter 
     List<twitter4j.Status> statuses = null; 
     try { 
      Twitter twitter=twitterConnect(); 

      statuses = twitter.getUserTimeline("Twitter"); 

      return statuses; 
     } catch (Exception ex) { 

      Log.d("Main.displayTimeline", "" + ex.getMessage()); 
     } 
     return statuses; 
    } 


    protected void onPostExecute(List<twitter4j.Status> statuses) { 

    try { 

    String TWITTER="EEE MMM dd HH:mm:ss ZZZZZ yyyy"; SimpleDateFormat sf=new 
    SimpleDateFormat(TWITTER, Locale.ENGLISH); sf.setLenient(true); 

    for(int i=0;i<statuses.size();i++){ 

    twitter4j.Status stat = statuses.get(i); 
    User user=stat.getUser(); 
    Date datePosted=stat.getCreatedAt(); 
    String text=stat.getText(); 
    String name=user.getName(); 
    String profile_image_url=user.getProfileImageURL(); 
    Tweet t =new Tweet(datePosted,text,name,profile_image_url,twitterHumanFriendlyDate(datePosted)); 

    tweets.add(t); 
    // logcat info 
    Log.i("date",datePosted.toString()); 
    Log.i("text",text); 
    Log.i("user",name); 
    Log.i("userprofilepic",profile_image_url); 
    Log.i("timeofpost",twitterHumanFriendlyDate(datePosted)); 
    } 

    ListView listView = (ListView) findViewById(R.id.ListViewId); 
    listView.setAdapter(new UserItemAdapter(TwitterActivity.this, 
    R.layout.listitem, tweets)); 
    ProgressBar bar=(ProgressBar) findViewById(R.id.progressBar1); 
    bar.setVisibility(View.GONE); 
    } catch 
    (Exception e) { e.printStackTrace(); } } 

} 

public class UserItemAdapter extends ArrayAdapter<Tweet> { 
    private ArrayList<Tweet> tweets; 

    public UserItemAdapter(Context context, int textViewResourceId, 
      ArrayList<Tweet> tweets) { 
     super(context, textViewResourceId, tweets); 
     this.tweets = tweets; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 
      LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.listitem, null); 
     } 

     Tweet tweet = tweets.get(position); 
     if (tweet != null) { 
      TextView username = (TextView) v.findViewById(R.id.username); 
      TextView message = (TextView) v.findViewById(R.id.message); 
      ImageView image = (ImageView) v.findViewById(R.id.avatar); 
      TextView date = (TextView) v.findViewById(R.id.date); 
      if (username != null) { 
       username.setText(tweet.username); 
      } 

      if (message != null) { 
       message.setText(tweet.message); 
      } 

      if (image != null) { 
       image.setImageBitmap(getBitmap(tweet.image_url)); 
      } 

      if (date != null) { 
       date.setText(tweet.hfdate); 

      } 
     } 
     return v; 
    } 
} 

public Bitmap getBitmap(String bitmapUrl) { 
    try { 
     URL url = new URL(bitmapUrl); 
     return BitmapFactory.decodeStream(url.openConnection() 
       .getInputStream()); 
    } catch (Exception ex) { 
     return null; 
    } 
} 


// build twitter 

public Twitter twitterConnect() throws Exception 
{ 

    // setup 
    builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY).setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET); 
    OAuth2Token token = new TwitterFactory(builder.build()).getInstance().getOAuth2Token(); 


// exercise & verify 
    ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setUseSSL(true); 
    cb.setApplicationOnlyAuthEnabled(true); 

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

    twitter.setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET); 
    twitter.setOAuth2Token(token); 

    return twitter; 
} 

public String twitterHumanFriendlyDate(Date dateCreated) { 
    // parse Twitter date 
    SimpleDateFormat dateFormat = new SimpleDateFormat(
      "EEE MMM dd HH:mm:ss ZZZZZ yyyy", Locale.ENGLISH); 
    dateFormat.setLenient(false); 
    Date created = dateCreated; 

    // today 
    Date today = new Date(); 

    // how much time since (ms) 
    Long duration = today.getTime() - created.getTime(); 

    long second = 1000; 
    long minute = second * 60; 
    long hour = minute * 60; 
    long day = hour * 24; 

    if (duration < second * 7) { 
     return "right now"; 
    } 

    if (duration < minute) { 
     int n = (int) Math.floor(duration/second); 
     return n + " seconds ago"; 
    } 

    if (duration < minute * 2) { 
     return "about 1 minute ago"; 
    } 

    if (duration < hour) { 
     int n = (int) Math.floor(duration/minute); 
     return n + " minutes ago"; 
    } 

    if (duration < hour * 2) { 
     return "about 1 hour ago"; 
    } 

    if (duration < day) { 
     int n = (int) Math.floor(duration/hour); 
     return n + " hours ago"; 
    } 
    if (duration > day && duration < day * 2) { 
     return "yesterday"; 
    } 

    if (duration < day * 365) { 
     int n = (int) Math.floor(duration/day); 
     return n + " days ago"; 
    } else { 
     return "over a year ago"; 
    } 
} 

}

Ist mein Problem der oauth Methode Witz? oder vielleicht mit der getuserzeitlinie? Wenn jemand einen Beispielcode oder ein Tutorial für oauth2 mit twitter4j hat, wäre es wünschenswert,

Antwort

11

nach einem langen Tag der Suche nach dem Problem habe ich eine Lösung gefunden. Ich bin mir immer noch nicht sicher, ob dies für mehrere Benutzer gleichzeitig funktioniert. aber wenn ich es teste, bekomme ich die letzten Tweets vom Benutzer, die ich spezifiziere.

Ich löschte die connecttwitter-Funktion und deklarierte das Twitter-Objekt in DoInBackground meiner asynctask. Um eine Oauth2-Authentifizierung zu erhalten, müssen Sie ein Bearer-Token erhalten. dies wird von Ihrem Consumer-Key und Geheimnis gemacht (so hat sich diese auf Ihrem Twitter-Objekt festgelegt werden) hier ist der geänderte Code (Code von meinem connecttwitter asynchroner Aufgabe doinbackground) mit einigen Modifikationen

ConfigurationBuilder builder=new ConfigurationBuilder(); 
      builder.setUseSSL(true); 
      builder.setApplicationOnlyAuthEnabled(true); 

      // setup 
      Twitter twitter = new TwitterFactory(builder.build()).getInstance(); 

      // exercise & verify 
      twitter.setOAuthConsumer(TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET); 
      // OAuth2Token token = twitter.getOAuth2Token(); 
      twitter.getOAuth2Token(); 
    statuses = twitter.getUserTimeline("Twitter"); 
+0

Hallo zu arbeiten, können Sie mir den vollen Arbeits Code geben von „Twitter-Feed zu holen“ nicht wahr? Ich bin vor Probleme –

+0

'Die Methode setApplicationOnlyAuthEnabled (boolean) für den Typ ConfigurationBuilder' – jul

+1

@jul Download nicht definiert ist und aktuelle Twitter4J Bibliothek Schnappschuss hinzufügen von hier [http://twitter4j.org/en/index.html#snapshot](http : //twitter4j.org/de/index.html#snapshot) – Mani

3

Ich hatte eine Menge Probleme mit diesem so dachte, ich würde erarbeiten, wie die Leute in den obigen Kommentaren anfordern.

Es gibt mehrere Methoden zum Laden der entsprechenden Einstellungen für Twitter4j, die nur als Anwendung ausgeführt werden. Laut Dokumentation hier (http://twitter4j.org/en/configuration.html) ging ich mit einer Property-Datei.

Hier sind die Schritte:

1) eine Eigenschaft Datei in Ihrem Projektstamm erstellen mit Dateinamen genau twitter4j.properties. Wenn ich es wäre, würde ich das in einen /resources Regisseur stecken, aber was auch immer.

2) in der twitter4j.properties Datei geben Sie etwas wie folgt aus:

debug=true 
enableApplicationOnlyAuth=true 
http.useSSL=true 
oauth.consumerKey=[consumer key here] 
oauth.consumerSecret=[consumer secret here] 

Hinweis: SSL und enableApplicationOnlyAuth sind sehr wichtig!Wenn Sie nicht-Consumer-Key/secret bekommen haben noch, dann können Sie einen Leitfaden an anderer Stelle folgen, aber Sie bekommen die App hier über die Registrierung (https://apps.twitter.com/)

3) die Twitter4J herunterladen und schließen Sie das Glas in Ihrem Projekt - http://twitter4j.org/en/index.html#howToUse

4) Hier ist eine vollständige Lösung - Beachten Sie, dass ein Suchparameter wie #Toyota übergeben werden muss. oder Sie könnten hart codieren - Query query = new Query("#Toyota");

package twittertest; 

import java.io.IOException; 
import java.util.List; 
import twitter4j.Query; 
import twitter4j.QueryResult; 
import twitter4j.Status; 
import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.TwitterFactory; 
import twitter4j.auth.OAuth2Token; 

/** 
* 
* @author That Guy 
*/ 
public class TwitterTest { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws IOException, TwitterException { 
     if (args.length < 1) { 
      System.out.println("java twitter4j.examples.search.SearchTweets [query]"); 
      System.exit(-1); 
     } 

     Twitter twitter = new TwitterFactory().getInstance(); 
     twitter.getOAuth2Token(); 

     try { 
      Query query = new Query(args[0]); 
      QueryResult result; 
      do { 
       result = twitter.search(query); 
       List<Status> tweets = result.getTweets(); 
       for (Status tweet : tweets) { 
        System.out.println("@" + 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()); 
      System.exit(-1); 
     } 
    } 

} 

Nachdem du es baust, sehen Sie alle Tweets in den Reihen an der Konsole ausgeben. Ich hoffe, dass jemanden helfen kann und bietet eine kurze Lösung von