twitter应用程序唯一身份验证java安卓与twitter4j

问题描述:

我试图从twitter与oauth2(仅适用于应用程序的身份验证),但结果始终为null的用户时间线。我没有使用OAUTH的经验,我已经看过一些教程和示例,但目前还没有运气。 我需要检索特定的用户时间表(在此示例中为Twitter),而无需用户登录。twitter应用程序唯一身份验证java安卓与twitter4j

我有一个使用twitter API 1的应用程序,我尝试使用oauth2将我现有的代码调整到新的API 1.1进行应用程序认证。所以代码应该工作,除了它不能从Twitter获得任何回报。如果我确实得到了一个结果,那么它应该再次工作。

与Twitter的连接是在asyncop下面的函数twitterconnect中进行的。

这里是我的代码:

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一些示例代码或教程,不胜感激

经过漫长的一天搜索问题,我找到了一个解决方案。我仍然不确定这会同时适用于多个用户。但是当我测试它时,我从我指定的用户那里得到最后一条推文。

我删除了connecttwitter函数,并在我的asynctask的DoInBackground中声明了Twitter对象。要获得Oauth2身份验证,您需要获取不记名令牌。这是从您的使用者密钥和机密(所以这也被你的Twitter对象上设置)这里是改变的代码(从我的connecttwitter到doinbackground异步任务的代码)与一些修改

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

你好,你可以给我完整的工作代码“抓取twitter feed”吗?我遇到问题 –

+0

'方法setApplicationOnlyAuthEnabled(boolean)未定义类型ConfigurationBuilder' – jul

+1

@jul下载并从这里添加最新的Twitter4J库快照[http://twitter4j.org/en/index.html#snapshot](http ://twitter4j.org/en/index.html#snapshot) – Mani

+0

请详细说明。我们不鼓励“只有链接”的答案,因为它们可能会消失,并且无法随时访问。您可以从文章中引用相关内容开始。 –

我有这个问题很多,所以想我会详细阐述,因为人们在上面的评论请求。

有几种方法可以将Twitter4j的相应设置加载为仅作为应用程序运行。根据这里的文档(http://twitter4j.org/en/configuration.html),我去了一个属性文件。

步骤如下:

1)创建的确切twitter4j.properties文件名,在您的项目根属性文件。如果是我,我会把这个放在/resources导演里面,但不管。

2)twitter4j.properties文件中把这样的事情:

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

注:SSL和enableApplicationOnlyAuth是非常重要的!如果你还没有得到消费者的键/秘密又那么你可以按照指南的其他地方,但你通过这里注册您的应用(https://apps.twitter.com/

3)下载twitter4j获取并在项目中包含的jar - 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); 
     } 
    } 

} 

你盖了之后,你会看到所有的鸣叫分批输出到您的控制台。我希望能帮助别人,并提供一个简洁的解决方案,从