-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTwitterSearch.php
155 lines (137 loc) · 6.95 KB
/
TwitterSearch.php
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?php
/**
* Oauth.php
*
* Created by Jon Hurlock (@jonhurlock) 2013-03-20.
* Extended by Sam Tuke (@samtuke) on 2014-10-09.
*
* Jon Hurlock's Twitter Application-only Authentication App by Jon Hurlock
* is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
* Permissions beyond the scope of this license may be available at http://www.jonhurlock.com/.
*/
class TwitterSearch
{
// url to send data to for authentication
const AUTH_URL = 'https://api.twitter.com/oauth2/token';
const SEARCH_URL = 'https://api.twitter.com/1.1/search/tweets.json';
CONST INVALIDATE_AUTH_URL = 'https://api.twitter.com/oauth2/invalidate_token';
/**
* @brief Authenticate a session with Twitter using OAuth
* @param string $consumerKey Your personal key from Twitter
* @param string $consumerSecret Your personal secret from Twitter
* @note https://dev.twitter.com/docs/auth/application-only-auth
*/
function authenticate( $consumerKey, $consumerSecret )
{
$this->consumerKey = $consumerKey;
$this->consumerSecret = $consumerSecret;
// Step 1
// step 1.1 - url encode the consumer_key and consumer_secret in accordance with RFC 1738
$encoded_consumer_key = urlencode($this->consumerKey);
$encoded_consumer_secret = urlencode($this->consumerSecret);
// step 1.2 - concatinate encoded consumer, a colon character and the encoded consumer secret
$bearer_token = $encoded_consumer_key.':'.$encoded_consumer_secret;
// step 1.3 - base64-encode bearer token
$base64_encoded_bearer_token = base64_encode($bearer_token);
// step 2
$headers = array(
"POST /oauth2/token HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: jonhurlock Twitter Application-only OAuth App v.1",
"Authorization: Basic ".$base64_encoded_bearer_token."",
"Content-Type: application/x-www-form-urlencoded;charset=UTF-8",
"Content-Length: 29"
);
$ch = curl_init(); // setup a curl
curl_setopt($ch, CURLOPT_URL, SELF::AUTH_URL); // set url to send to
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // set custom headers
curl_setopt($ch, CURLOPT_POST, 1); // send as post
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return output
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials"); // post body/fields to be sent
$header = curl_setopt($ch, CURLOPT_HEADER, 1); // send custom headers
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$response = curl_exec ($ch); // execute the curl
curl_close($ch); // close the curl
$output = explode("\n", $response);
$bearer_token = '';
foreach ( $output as $line ) {
if ( $line === false ) {
// there was no bearer token
} else {
$bearer_token = $line;
}
}
// decode token
$bearer_token = json_decode( $bearer_token );
// set token for reuse
$this->token = $bearer_token->{'access_token'};
}
/**
* @brief Invalidate the Bearer Token, end the session
* @note should the bearer token become compromised or need to be invalidated for any reason, call this method/function.
*/
function unauthenticate ()
{
$encoded_consumer_key = urlencode($this->consumerKey);
$encoded_consumer_secret = urlencode($this->consumerSecret);
$consumer_token = $encoded_consumer_key.':'.$encoded_consumer_secret;
$base64_encoded_consumer_token = base64_encode($consumer_token);
// step 2
$headers = array(
"POST /oauth2/invalidate_token HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: jonhurlock Twitter Application-only OAuth App v.1",
"Authorization: Basic ".$base64_encoded_consumer_token."",
"Accept: */*",
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: ".(strlen($this->token)+13).""
);
$ch = curl_init(); // setup a curl
curl_setopt($ch, CURLOPT_URL, SELF::INVALIDATE_AUTH_URL); // set url to send to
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // set custom headers
curl_setopt($ch, CURLOPT_POST, 1); // send as post
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return output
curl_setopt($ch, CURLOPT_POSTFIELDS, "access_token=".$this->token.""); // post body/fields to be sent
$header = curl_setopt($ch, CURLOPT_HEADER, 1); // send custom headers
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$retrievedhtml = curl_exec ($ch); // execute the curl
curl_close($ch); // close the curl
return $retrievedhtml;
}
/**
* @brief search for tweets with a given term
* @param string $query Search term to look for (needle)
* @param string $result_type Twitter compatible result type filter
* @param int $count Limit for tweets to return
* @return StdClass parsed from JSON with array of statuses ($returned->statuses[1])
* @note on https://dev.twitter.com/docs/api/1.1/get/search/tweets
*/
function search( $query, $result_type='mixed', $count='15' )
{
$q = urlencode(trim($query)); // query term
$formed_url ='?q='.$q; // fully formed url
// result type - mixed(default), recent, popular
if ( $result_type!='mixed' ) {
$formed_url = $formed_url.'&result_type='.$result_type;
}
// results per page - defaulted to 15
if( $count!='15' ) {
$formed_url = $formed_url.'&count='.$count;
}
$formed_url = $formed_url.'&include_entities=true'; // makes sure the entities are included, note @mentions are not included see documentation
$headers = array(
"GET /1.1/search/tweets.json".$formed_url." HTTP/1.1",
"Host: api.twitter.com",
"User-Agent: jonhurlock Twitter Application-only OAuth App v.1",
"Authorization: Bearer ".$this->token."",
);
$ch = curl_init(); // setup a curl
curl_setopt($ch, CURLOPT_URL,SELF::SEARCH_URL.$formed_url); // set url to send to
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // set custom headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // return output
$response = curl_exec ($ch); // execute the curl
curl_close($ch); // close the curl
$decoded = json_decode( $response );
return $decoded;
}
}