· 9 years ago · Oct 07, 2016, 11:00 AM
1public class tweetUtil {
2public static final String[] SIGNATURE_KEYS = new String[]
3 {'oauth_consumer_key',
4 'oauth_nonce',
5 'oauth_signature_method',
6 'oauth_timestamp',
7 'oauth_token',
8 'oauth_version',
9 'status'};
10
11public static final String[] OAUTH_KEYS = new String[]
12 {'oauth_consumer_key',
13 'oauth_nonce',
14 'oauth_signature',
15 'oauth_signature_method',
16 'oauth_timestamp',
17 'oauth_token',
18 'oauth_version'};
19
20public String algorithmName {
21 get {
22 if(algorithmName == null)
23 return 'hmacSHA1';
24 return algorithmName;
25 }
26 set;}
27public String oauth_signature_method {
28 get {
29 if(oauth_signature_method == null)
30 return 'HMAC-SHA1';
31 return oauth_signature_method;
32 }
33 set;}
34public String oauth_version {
35 get {
36 if(oauth_version == null)
37 oauth_version = '1.0';
38 return oauth_version;
39 }
40 set;}
41public String http_method {get; set;}
42public String base_url {get; set;}
43public String status {get; set;}
44public String oauth_consumer_key {get; set;}
45public String oauth_consumer_secret {get; set;}
46public String oauth_token {get; set;}
47public String oauth_token_secret {get; set;}
48
49public String oauth_nonce {get; private set;}
50public String oauth_signature {get; private set;}
51public String oauth_timestamp {
52 get {
53 if(oauth_timestamp == null)
54 oauth_timestamp = String.valueOf(DateTime.now().getTime()/1000);
55 return oauth_timestamp;
56 }
57 private set;}
58
59private map<String, String> signaturePairs {get; set;}
60private String parameterString {get; set;}
61private String signatureBaseString {get; set;}
62private String signingKey {get; set;}
63private String oauth_header {get; set;}
64private String http_body {get; set;}
65
66public TweetUtil() {}
67
68public TweetUtil(String oauth_consumer_key, String oauth_consumer_secret, String oauth_token, String oauth_token_secret) {
69 this.oauth_consumer_key = oauth_consumer_key;
70 this.oauth_consumer_secret = oauth_consumer_secret;
71 this.oauth_token = oauth_token;
72 this.oauth_token_secret = oauth_token_secret;
73 system.debug('**** Created successfully');
74}
75
76public Boolean sendTweet(String status, map<String, String> additionalParams) {
77 if(this.oauth_consumer_key == null ||
78 this.oauth_consumer_secret == null ||
79 this.oauth_token == null ||
80 this.oauth_token_secret == null)
81 return false;
82
83 this.http_method = 'GET';
84 this.base_url = 'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name=@onactuate&count=10';
85 this.status = status;
86 generateNonce();
87 initializeSignatureKeyValuePairs(additionalParams);
88 generateOauthSignature();
89 generateOauthHeader();
90 generateHttpBody(additionalParams);
91
92 Http h = new Http();
93 HttpRequest req = new HttpRequest();
94 req.setMethod(this.http_method);
95 req.setEndpoint(this.base_url);
96 req.setBody(this.http_body);
97 req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
98 req.setHeader('Content-Length', String.valueOf(req.getBody().length()));
99 req.setHeader('Authorization', this.oauth_header);
100
101 try {
102 HttpResponse res = h.send(req);
103 system.debug('**** Response: ');
104 system.debug(res);
105 system.debug(res.getBody());
106
107 if(res.getStatusCode() == 200)
108 return true;
109 else
110 return false;
111 } catch (CalloutException e) {
112 return false;
113 }
114 return true;
115}
116
117private void generateNonce() {
118 String validChars = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
119 Integer len = validChars.length();
120 String randomString = '';
121
122 for(Integer i=0; i<32; i++) {
123 Integer rInt = Integer.valueOf(Math.rint(Math.random()*(len-1)));
124 randomString += validChars.substring(rInt, rInt+1);
125 }
126 this.oauth_nonce = randomString;
127}
128
129private void initializeSignatureKeyValuePairs(map<String, String> additionalParams) {
130 this.signaturePairs = new map<String, String>();
131 this.signaturePairs.put('status', this.status);
132 this.signaturePairs.put('oauth_consumer_key', this.oauth_consumer_key);
133 this.signaturePairs.put('oauth_nonce', this.oauth_nonce);
134 this.signaturePairs.put('oauth_signature_method', this.oauth_signature_method);
135 this.signaturePairs.put('oauth_timestamp', this.oauth_timestamp);
136 this.signaturePairs.put('oauth_token', this.oauth_token);
137 this.signaturePairs.put('oauth_version', this.oauth_version);
138 if(additionalParams != null && additionalParams.keySet().size() > 0) {
139 for(String key : additionalParams.keySet()) {
140 if(!this.signaturePairs.containsKey(key) && additionalParams.get(key) != null) {
141 //system.debug('**** adding key: ' + key + ' and value: ' + additionalParams.get(key));
142 this.signaturePairs.put(key, additionalParams.get(key));
143 SIGNATURE_KEYS.add(key);
144 }
145 }
146 }
147 SIGNATURE_KEYS.sort(); //The keys have to be sorted when generating the signature
148}
149
150private void generateOauthSignature() {
151 this.parameterString = createParameterString();
152 this.signatureBaseString = createSignatureBaseString();
153 this.signingKey = createSigningKey();
154 this.oauth_signature = createOauthSignature();
155}
156
157private String createParameterString() {
158 String paramString = '';
159 system.debug(json.serializepretty(signaturePairs));
160 for(String key : SIGNATURE_KEYS) {
161 paramString += StringUtil.percentEncode(key);
162 paramString += '=';
163 paramString += StringUtil.percentEncode(signaturePairs.get(key));
164 paramString += '&';
165 }
166 paramString = removeLastNLetters(paramString, 1);
167 system.debug('**** Parameter String');
168 system.debug(paramString);
169 return paramString;
170}
171
172private String createSignatureBaseString() {
173 String sigBase = '';
174 sigBase += this.http_method.toUpperCase() ;
175 sigBase += '&';
176 sigBase += StringUtil.percentEncode(this.base_url);
177 sigBase += '&';
178 sigBase += StringUtil.percentEncode(this.parameterString);
179 system.debug('**** Signature Base String');
180 system.debug(sigBase);
181 return sigBase;
182}
183
184private String createSigningKey() {
185 String signKey = StringUtil.percentEncode(this.oauth_consumer_secret);
186 signKey += '&';
187 signKey += StringUtil.percentEncode(this.oauth_token_secret);
188 system.debug('**** Signing Key');
189 system.debug(signKey);
190 return signKey;
191}
192
193private String createOauthSignature() {
194 Blob mac = Crypto.generateMac(this.algorithmName, Blob.valueOf(this.signatureBaseString), Blob.valueOf(this.signingKey));
195 string hashedValue = EncodingUtil.convertToHex(mac);
196 String oauthSig = EncodingUtil.base64Encode(mac);
197 system.debug('**** Hashed Value');
198 system.debug(hashedValue);
199 system.debug('**** Oauth Signature');
200 system.debug(oauthSig);
201 return oauthSig;
202}
203
204private void generateOauthHeader() {
205 map<String, String> oauthParams = new map<String, String>();
206 oauthParams.put('oauth_consumer_key', this.oauth_consumer_key);
207 oauthParams.put('oauth_nonce', this.oauth_nonce);
208 oauthParams.put('oauth_signature', this.oauth_signature);
209 oauthParams.put('oauth_signature_method', this.oauth_signature_method);
210 oauthParams.put('oauth_timestamp', this.oauth_timestamp);
211 oauthParams.put('oauth_version', this.oauth_version);
212 oauthParams.put('oauth_token', this.oauth_token);
213 String header = 'OAuth ';
214 for(String key : OAUTH_KEYS) {
215 header += StringUtil.percentEncode(key);
216 header += '="';
217 header += StringUtil.percentEncode(oauthParams.get(key));
218 header += '", ';
219 }
220 this.oauth_header = removeLastNLetters(header, 2);
221 system.debug('**** Oauth Header');
222 system.debug(this.oauth_header);
223}
224
225private void generateHttpBody(map<String, String> additionalParams) {
226 String httpBody = 'status='+EncodingUtil.urlEncode(this.status, 'UTF-8');
227 if(additionalParams != null && additionalParams.keySet() != null) {
228 for(String key : additionalParams.keySet()) {
229 if(additionalParams.get(key) != null) {
230 httpBody += '&';
231 httpBody += EncodingUtil.urlEncode(key, 'UTF-8');
232 httpBody += '=';
233 httpBody += EncodingUtil.urlEncode(additionalParams.get(key), 'UTF-8');
234 }
235 }
236 }
237 this.http_body = httpBody.replace('*', '%2A'); //for some reason, '*' breaks twitter
238 system.debug('**** Request Body: ');
239 system.debug(this.http_body);
240}
241
242private static String removeLastNLetters(String source, Integer numToRemove) {
243 return source.subString(0, source.length()-numToRemove);
244}