如何使用twitter API 1.1和java搜索推文

Twitter API已从1.0更改为1.1。 现在,对于任何类型的查询,都必须进行授权。 我正在使用java来获取推文。 任何人都可以给我一些使用OAuth身份validation获取推文的java示例。

更新

使用twitter4j api是可能的。 http://twitter4j.org/en/ 。 下面给出一个例子

Twitter twitter = new TwitterFactory().getInstance(); AccessToken accessToken = new AccessToken("Your-Access-Token", "Your-Access-Token-Secret"); twitter.setOAuthConsumer("Consumer-Key", "Consumer-Key-Secret"); twitter.setOAuthAccessToken(accessToken); try { Query query = new Query("#IPL"); QueryResult result; result = twitter.search(query); List tweets = result.getTweets(); for (Status tweet : tweets) { System.out.println("@" + tweet.getUser().getScreenName() + " - " + tweet.getText()); } } catch (TwitterException te) { te.printStackTrace(); System.out.println("Failed to search tweets: " + te.getMessage()); System.exit(-1); } 

这里有问题

当我作为Java类运行时,此示例独立工作。 但是当我在JSP中添加此代码以便在webapp中进行测试时,它无法正常工作。 它向我显示以下exception

  SEVERE: Servlet.service() for servlet [jsp] in context with path [/mypub] threw exception [java.lang.IllegalStateException: consumer key/secret pair already set.] with root cause java.lang.IllegalStateException: consumer key/secret pair already set. at twitter4j.TwitterBaseImpl.setOAuthConsumer(TwitterBaseImpl.java:264) at com.me.framework.tag.core.TweetFetch.doTag(TweetFetch.java:50) at org.apache.jsp.template.test_jsp._jspx_meth_wf_002dcore_005ftweetFetch_005f0(test_jsp.java:100) at org.apache.jsp.template.test_jsp._jspService(test_jsp.java:74) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 

问题是您正在多次设置使用者密钥和令牌,如exception所示:

java.lang.IllegalStateException:已设置的使用者密钥/秘密对。

之所以发生这种情况是因为TwitterFactory.getInstance()返回了Twitter的单例,然后每次向Servlet发出请求时都会调用setOAuthConsumersetOAuthAccessToken

您需要确保只配置一次Twitter实例,而不是每次发出请求时都配置。

实现这一目标的一种方法是通过使用TwitterFactory.getInstance(AccessToken)要求TwitterFactory为您提供经过身份validation的Twitter实例:

 final AccessToken accessToken = new AccessToken("Your-Access-Token", "Your-Access-Token-Secret"); final Twitter twitter = TwitterFactory.getInstance(token); ... 

此工厂方法的另一个好处是它可能会为您返回一个缓存的,经过身份validation的Twitter实例。

您可以使用codebird js库进行推文搜索。 您只需要在Twitter上创建一个应用程序并记下以下内容:

  1. 消费者密钥
  2. 消费者密钥
  3. 访问令牌
  4. 访问令牌秘密

从GitHub存储库下载codebird js Library:

用法:

 var cb = new Codebird; cb.setConsumerKey('YOURKEY', 'YOURSECRET'); cb.setToken('YOURTOKEN', 'YOURTOKENSECRET'); cb.__call( 'oauth2_token', {}, function (reply) { var bearer_token = reply.access_token; } ); cb.__call( 'search_tweets', { q : "your query which you want to search", from : twitter_user }, function (data) { console.log(data); }, true // this parameter required ); 

我使用本教程使用带有OAuth身份validation的twitter api 1.1搜索推文

我已经修改了代码以实现我的可用性而且它没有使用twitter4j ,这在目前很好,因为OA 构建中没有OAuth搜索(我在某处无法找到位置时读到它)

还添加了获取Twitter时间线

代码在Groovy中

 TweetsHelper tweetsHelper = new TweetsHelper() def bearerToken=tweetsHelper.requestBearerToken(TWITTER_AUTH_URL) List tweets=tweetsHelper.fetchTimelineTweet(bearerToken) private final def TWITTER_HOST = "api.twitter.com" private final def TWITTER_AUTH_URL = "https://api.twitter.com/oauth2/token" private final def TWITTER_URL = "https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=INFAsupport&count=200" private HttpsURLConnection getHTTPSConnection(String method,String endpointUrl){ HttpsURLConnection connection = null URL url = new URL(endpointUrl) connection = (HttpsURLConnection) url.openConnection() connection.setDoOutput(true) connection.setDoInput(true) connection.setRequestMethod(method) connection.setRequestProperty("Host", TWITTER_HOST) connection.setRequestProperty("User-Agent", TWITTER_HANDLE) connection.setUseCaches(false) return connection } //Fetch Bearertoken for getting tweets public String requestBearerToken(String endPointUrl) throws IOException { String encodedCredentials = encodeKeys() HttpsURLConnection connection = null try { connection = getHTTPSConnection("POST",endPointUrl) connection.setRequestProperty("Authorization", "Basic " + encodedCredentials) connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") connection.setRequestProperty("Content-Length", "29") connection.setUseCaches(false) } catch (MalformedURLException e) { throw new IOException("Invalid endpoint URL specified.", e) } finally { if (connection != null) { connection.disconnect() } } writeRequest(connection, "grant_type=client_credentials") JsonSlurper js=new JsonSlurper() def result=js.parseText(readResponse(connection)) String tokenType = result?.token_type String token = result?.access_token return ((tokenType.equals("bearer")) && (token != null)) ? token : "" } //Search tweets public List fetchQueriedTweets(def bearerToken) throws IOException { HttpsURLConnection connection = null def dataCleanser = new DataCleanser() try { connection = getHTTPSConnection("GET",TWITTER_URL) connection.setRequestProperty("Authorization", "Bearer " + bearerToken) } catch (MalformedURLException e) { throw new IOException("Invalid endpoint URL specified.", e) } finally { if (connection != null) { connection.disconnect() } } List tweets= new ArrayList() try{ JSONObject obj = (JSONObject)JSONValue.parse(readResponse(connection)) JSONArray objArray = (JSONArray)obj.get(TWEET_STATUSES) if (objArray != null) { for(int i=0;i fetchTimelineTweet(def bearerToken) throws IOException { HttpsURLConnection connection = null List tweets= new ArrayList() def dataCleanser = new DataCleanser() try { connection = getHTTPSConnection("GET",TWITTER_URL) connection.setRequestProperty("Authorization", "Bearer " + bearerToken) } catch (MalformedURLException e) { throw new IOException("Invalid endpoint URL specified.", e) } finally { if (connection != null) { connection.disconnect() } } JsonSlurper js=new JsonSlurper() try{ def result=js.parseText(readResponse(connection)) result?.each{tweet-> String text = tweet?.text String createdAt = DateUtils.convertToUTC(parseTweetDate(tweet?.created_at)) String fromUser = tweet?.user?.name String expandedURL = tweet?.entities?.urls[0]?.expanded_url if(validTweetForAWeek(createdAt)){ TweetsInfo tweetinfo=new TweetsInfo(text,fromUser,expandedURL,createdAt) tweets.push(tweetinfo) } } } catch(Exception e){ log.info "Exception in TweetsHelper $e" } return tweets } 

TweetsInfo是一个包含String text, String fromUser, String expandedURL, String createdAt的Pojo类String text, String fromUser, String expandedURL, String createdAt (这是我的要求)

希望这可以帮助 :)