-
Notifications
You must be signed in to change notification settings - Fork 11
/
TwitterService.java
129 lines (107 loc) · 4.63 KB
/
TwitterService.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package service;
import java.io.IOException;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.CookieSpecs;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
public class TwitterService {
private String apiKey;
private String apiSecret;
public TwitterService(String key, String secret) {
apiKey = key;
apiSecret = secret;
}
public List<String> getTweets(String searchString, String startTime) throws IOException, URISyntaxException {
List<String> tweets = new ArrayList<>();
if (validParameters(apiKey, apiSecret)) {
Map<String, Object> map = search(searchString, startTime);
if (null != map) {
ArrayList<Object> data = (ArrayList<Object>) map.get("data");
for (int i = 0; i < data.size(); i++) {
Map<String, Object> item = (Map<String, Object>) data.get(i);
String id = (String) item.get("id");
tweets.add(id);
}
}
}
return tweets;
}
/*
* This method calls the recent search endpoint with a the search term passed to it as a query parameter
* */
private Map<String, Object> search(String searchString, String startTime) throws IOException, URISyntaxException {
ObjectMapper mapper = new ObjectMapper();
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/labs/2/tweets/search");
ArrayList<NameValuePair> queryParameters;
queryParameters = new ArrayList<>();
queryParameters.add(new BasicNameValuePair("query", searchString));
queryParameters.add(new BasicNameValuePair("start_time", startTime));
queryParameters.add(new BasicNameValuePair("expansions", "author_id"));
uriBuilder.addParameters(queryParameters);
HttpGet httpGet = new HttpGet(uriBuilder.build());
httpGet.setHeader("Authorization", String.format("Bearer %s", getAccessToken()));
httpGet.setHeader("Content-Type", "application/json");
httpGet.setHeader("User-Agent", "LabsRecentSearchQuickStartJava");
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
return mapper.readValue(entity.getContent(), Map.class);
}
/*
*
* Helper method that generates bearer token by calling the /oauth2/token endpoint
* */
private String getAccessToken() throws IOException, URISyntaxException {
String accessToken = null;
HttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(CookieSpecs.STANDARD).build())
.build();
URIBuilder uriBuilder = new URIBuilder("https://api.twitter.com/oauth2/token");
ArrayList<NameValuePair> postParameters;
postParameters = new ArrayList<>();
postParameters.add(new BasicNameValuePair("grant_type", "client_credentials"));
uriBuilder.addParameters(postParameters);
HttpPost httpPost = new HttpPost(uriBuilder.build());
httpPost.setHeader("Authorization", String.format("Basic %s", getBase64EncodedString()));
httpPost.setHeader("Content-Type", "application/json");
HttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
if (null != entity) {
try (InputStream inputStream = entity.getContent()) {
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> jsonMap = mapper.readValue(inputStream, Map.class);
accessToken = jsonMap.get("access_token").toString();
}
}
return accessToken;
}
/*
* Helper method that generates the Base64 encoded string to be used to obtain bearer token
* */
private String getBase64EncodedString() {
String s = String.format("%s:%s", apiKey, apiSecret);
return Base64.getEncoder().encodeToString(s.getBytes(StandardCharsets.UTF_8));
}
private boolean validParameters(String apiKey, String apiSecret) {
return ((null != apiKey && null != apiSecret) && (apiKey != "" && apiSecret != ""));
}
}