Twitter API已从1.0更改为1.1。现在,对于任何类型的查询,都必须进行授权。我正在使用java来获取推文。任何人都可以给我一些使用OAuth身份验证获取推文的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<Status> 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中进行测试时,它无法正常工作。它显示了我的异常
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)
答案 0 :(得分:4)
问题在于您多次设置使用者密钥和令牌,如异常所示:
java.lang.IllegalStateException:已设置消费者密钥/密钥对。
这种情况正在发生,因为TwitterFactory.getInstance()
正在返回Twitter
的单例,然后每次向您的Servlet发出请求时都会调用setOAuthConsumer
和setOAuthAccessToken
。
您需要确保只配置一次Twitter
实例,而不是每次请求时都配置。
实现此目标的一种方法是让TwitterFactory
使用TwitterFactory.getInstance(AccessToken)
为您提供经过身份验证的Twitter
实例:
final AccessToken accessToken = new AccessToken("Your-Access-Token", "Your-Access-Token-Secret");
final Twitter twitter = TwitterFactory.getInstance(token);
...
此工厂方法的另一个好处是,它可能会为您返回一个经过身份验证的缓存Twitter
实例。
答案 1 :(得分:1)
您可以使用codebird js库进行推文搜索。您只需在Twitter上创建一个应用程序并记下以下内容:
从GitHub存储库here下载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
);
答案 2 :(得分:1)
我使用this tutorial使用带有OAuth身份验证的twitter api 1.1来搜索推文
我已修改了我的可用性代码,但它没有使用twitter4j,目前这是好的,因为RC build中没有OAuth搜索(我在某处无法找到它现在的位置)
还添加了获取Twitter时间线
代码位于Groovy
TweetsHelper tweetsHelper = new TweetsHelper()
def bearerToken=tweetsHelper.requestBearerToken(TWITTER_AUTH_URL)
List<TweetsInfo> 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<TweetsInfo> 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<TweetsInfo> tweets= new ArrayList<TweetsInfo>()
try{
JSONObject obj = (JSONObject)JSONValue.parse(readResponse(connection))
JSONArray objArray = (JSONArray)obj.get(TWEET_STATUSES)
if (objArray != null) {
for(int i=0;i<objArray.length();i++){
String text = dataCleanser.escapeQuotes(((JSONObject)objArray.get(i)).get(TWEET_TEXT).toString())
String createdAt = DateUtils.convertToUTC(parseTweetDate(((JSONObject)objArray.get(i)).get(TWEET_CREATED_AT).toString()))
String fromUser = ((JSONObject)objArray.get(i)).get(TWEET_USER).get(TWEET_NAME).toString()
String expandedURL = ((JSONObject)objArray.get(i)).get(TWEET_ENTITIES).get(TWEET_URLS).get(0).get(TWEET_EXPANDED_URL).toString()
TweetsInfo tweet=new TweetsInfo(text,fromUser,expandedURL,createdAt)
tweets.push(tweet)
}
}
}
catch(Exception e){
log.info "Exception in TweetsHelper $e"
}
return tweets
}
//Fetch Twitter timeline
public List<TweetsInfo> fetchTimelineTweet(def bearerToken) throws IOException {
HttpsURLConnection connection = null
List<TweetsInfo> tweets= new ArrayList<TweetsInfo>()
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类(这是我的要求)
希望这会有所帮助:)