2013-06-18 6 views
9

मैं oauth2 (केवल एप्लिकेशन प्रमाणीकरण के लिए) के साथ ट्विटर से उपयोगकर्ता टाइमलाइन प्राप्त करने का प्रयास कर रहा हूं लेकिन परिणाम हमेशा शून्य है। मुझे ओथ के साथ अनुभव नहीं है, और मैंने कुछ ट्यूटोरियल और उदाहरणों को देखा है, लेकिन अब तक कोई किस्मत नहीं है। मुझे उपयोगकर्ता को लॉगिन करने की आवश्यकता के बिना एक विशिष्ट उपयोगकर्ता टाइमलाइन (इस उदाहरण में ट्विटर) को पुनः प्राप्त करने की आवश्यकता है।ट्विटर एप्लिकेशन केवल प्रमाणीकरण जावा एंड्रॉइड twitter4j

मेरे पास एक ऐसा एप्लिकेशन था जिसने ट्विटर एपीआई 1 का उपयोग किया था और मैंने अपने मौजूदा कोड को नए एपीआई 1.1 में ओएथ 2 के साथ केवल एप्लिकेशन के लिए अनुकूलित करने का प्रयास किया था। तो कोड को काम करना चाहिए सिवाय इसके कि इसे ट्विटर से कुछ भी वापस नहीं मिलता है। अगर मुझे परिणाम मिल जाए तो इसे फिर से काम करना चाहिए।

ट्विटर के साथ कनेक्शन एसिंकॉप के नीचे फ़ंक्शन ट्विटरकनेक्ट में बनाया गया है।

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

}

मेरी समस्या बुद्धि OAuth विधि है:

यहाँ मेरी कोड है? या शायद getusertimeline बुद्धि? अगर किसी के पास twitter4j के साथ oauth2 के लिए कुछ उदाहरण कोड या ट्यूटोरियल है, तो समस्या की खोज के एक लंबे दिन के बाद

उत्तर

11

की सराहना की जाएगी, मुझे एक समाधान मिला है। मुझे अभी भी यकीन नहीं है कि यह एक ही समय में कई उपयोगकर्ताओं के लिए काम करेगा। लेकिन जब मैं इसका परीक्षण करता हूं तो मुझे निर्दिष्ट उपयोगकर्ता से अंतिम ट्वीट मिलती है।

मैंने कनेक्टटविटर फ़ंक्शन हटा दिया, और ट्विटर ऑब्जेक्ट को मेरे asynctask के DoInBackground में घोषित कर दिया। Oauth2 प्रमाणीकरण प्राप्त करने के लिए आपको एक भालू टोकन प्राप्त करने की आवश्यकता है। इस में कुछ संशोधनों

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

से काम करने के लिए एक संक्षिप्त समाधान प्रदान करने में मदद कर सकते हैं, क्या आप मुझे "ट्विटर फ़ीड लाने" का पूरा कामकाजी कोड दे सकते हैं? मुझे समस्याएं आ रही हैं –

+0

'विधि सेट एप्प्लिकेशनऑनलीएथएनेबल (बूलियन) कॉन्फ़िगरेशनबिल्डर' – jul

+1

@jul डाउनलोड के लिए अपरिभाषित है और यहां से नवीनतम ट्विटर 4 जे लाइब्रेरी स्नैपशॉट जोड़ें [http://twitter4j.org/en/index.html#snapshot ](http : //twitter4j.org/en/index.html#snapshot) – Mani

0

हो सकता है कि इस के साथ अपने उपभोक्ता कुंजी और रहस्य (तो यह आपके चहचहाना वस्तु पर स्थापित किया जाना है) यहाँ बदली हुई कोड (मेरी connecttwitter async कार्य की doinbackground करने से कोड) है से बनाया गया है एक आपकी मदद करेगा। यहां देखें: http://www.socialseer.com/twitter-programming-in-java-with-twitter4j/authentication-with-twitter/application-authentication-example/

+0

कृपया और विस्तार करें। हम "लिंक-केवल" उत्तरों को हतोत्साहित करते हैं क्योंकि वे किसी भी समय जा सकते हैं और पहुंच योग्य नहीं हो सकते हैं। आप लेख से संबंधित सामग्री उद्धृत करके शुरू कर सकते हैं। –

3

मुझे इस विचार के साथ बहुत सारी समस्याएं थीं क्योंकि मैं ऊपर बताई गई टिप्पणियों में अनुरोध कर रहा हूं क्योंकि मैं विस्तार से बताऊंगा।

Twitter4j के लिए उपयुक्त सेटिंग्स को लोड करने के लिए कई विधियां हैं जो केवल एप्लिकेशन के रूप में चलाने के लिए हैं। यहां दस्तावेज के अनुसार (http://twitter4j.org/en/configuration.html) मैं एक संपत्ति फ़ाइल के साथ गया था।

1) बिल्कुल twitter4j.properties की फ़ाइल नाम के साथ अपनी परियोजना जड़ में एक संपत्ति फ़ाइल बनाने:

ये कदम उठाएँ। अगर यह मैं था, तो मैं इसे /resources निदेशक के अंदर रखूंगा लेकिन जो भी हो।

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

नोट::

2)twitter4j.properties फाइल के अंदर कुछ इस तरह कर दिया एसएसएल और enableApplicationOnlyAuth बहुत महत्वपूर्ण हैं!आप उपभोक्ता कुंजी/गुप्त अभी तक तो नहीं मिला है आप कहीं और एक गाइड का पालन कर सकते लेकिन आप यहां (https://apps.twitter.com/)

3) अपने अनुप्रयोग को पंजीकृत डाउनलोड twitter4j के माध्यम से मिलता है और अपनी परियोजना में जार में शामिल हैं - http://twitter4j.org/en/index.html#howToUse

4) यहां एक पूर्ण समाधान है - ध्यान दें कि इसे #Toyota जैसे पास एक खोज पैरा की आवश्यकता होगी। या अपने को हार्डकोड सकता है - 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); 
     } 
    } 

} 

के बाद आप इसे बनाने, तुम सब ट्वीट्स अपने कंसोल बैचों में outputting देखेंगे। मुझे उम्मीद है कि

संबंधित मुद्दे