<?php
session_start();
define("CONSUMER_KEY", "iybjF4ucDqQ9VeSJm0....");
define("CONSUMER_SECRET", "xhLbOYuQyGSE2DyrAfpwgQ4o40Z1tgq0eh07CEcAPG....");
define("OAUTH_TOKEN", "1580647705633869826-YHuT8vIGTkZCMZRDVz5IUYN.....");
define("OAUTH_TOKEN_SECRET", "kYq4PFeCHHVkjjTw6xC47q7TJDvCBQDTqyMBb....");
define("OAUTH_CALLBACK", "http://localhost:80/callback.php");
class API{
protected $consumer_key, $consumer_secret, $oauth_token, $oauth_token_secret;
protected $apiUrl = 'https://api.twitter.com/';
protected $apiStandardUrl = 'https://api.twitter.com/1.1/';
protected $apiUploadUrl = 'https://upload.twitter.com/1.1/';
protected $oauth = [];
public function __construct($consumer_key, $consumer_secret, $oauth_token = false, $oauth_token_secret = false){
$this->consumer_key = $consumer_key;
$this->consumer_secret = $consumer_secret;
$this->oauth_token = $oauth_token;
$this->oauth_token_secret = $oauth_token_secret;
if ($oauth_token == false && $oauth_token_secret == false) {
$this->oauth = [
'oauth_consumer_key' => $this->consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_timestamp' => time(),
'oauth_version' => '1.0',
];
} elseif ($oauth_token !== false && $oauth_token_secret == false) {
$this->oauth = $oauth_token;
} else {
$this->oauth = [
'oauth_consumer_key' => $this->consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $this->oauth_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0',
];
}
}
protected function buildAutheaders($oauth){
$headers = 'Authorization: OAuth ';
$values = [];
foreach ($oauth as $key => $value) {
$values[] = "$key=\"" . rawurlencode($value) . "\"";
}
$headers .= implode(', ', $values);
return $headers;
}
protected function buildBearerheaders($oauth){
$headers = 'Authorization: Bearer ' . $oauth;
return $headers;
}
protected function buildString($method, $url, $params){
$headers = [];
ksort($params);
foreach ($params as $key => $value) {
$headers[] = "$key=" . rawurlencode($value);
}
return $method . "&" . rawurlencode($url) . '&' . rawurlencode(implode('&', $headers));
}
protected function buildSignature($baseInfo){
$encodeKey = rawurlencode($this->consumer_secret) . '&' . rawurlencode($this->oauth_token_secret);
$oauthSignature = base64_encode(hash_hmac('sha1', $baseInfo, $encodeKey, true));
return $oauthSignature;
}
protected function getSignature($method, $url, $params = false){
$oauth = $this->oauth;
if ($params == false) {
$baseInfo = $this->buildString($method, $url, $oauth);
$oauth['oauth_signature'] = $this->buildSignature($baseInfo);
} else {
$oauth = array_merge($oauth, $params);
$baseInfo = $this->buildString($method, $url, $oauth);
$oauth['oauth_signature'] = $this->buildSignature($baseInfo);
}
return $oauth;
}
protected function reqCurl($method = 'GET', $url, $params = false, $headers = false, $postfields = false, $userpwd = false){
$ch = curl_init();
if ($params == false) {
curl_setopt($ch, CURLOPT_URL, $url);
}
if ($params == true) {
curl_setopt($ch, CURLOPT_URL, $url . "?" . http_build_query($params));
}
if ($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
}
if ($method == 'DELETE') {
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
}
if ($postfields == true) {
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
}
if ($headers == true) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
if ($userpwd == true) {
curl_setopt($ch, CURLOPT_USERPWD, $this->consumer_key . ':' . $this->consumer_secret);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($ch);
return $result;
}
protected function request2($method, $req, $params = false){
$req = substr($req, 1);
$url = $this->apiUrl . $req;
if ($this->oauth_token !== false && $this->oauth_token_secret == false) {
$oauth = $this->buildBearerheaders($this->oauth);
$headers = [];
$headers[] = $oauth;
} else {
$oauth = $this->getSignature($method, $url);
$headers = [];
$headers[] = 'Content-type: application/json';
$headers[] = $this->buildAutheaders($oauth);
}
$result = $this->reqCurl($method, $url, null, $headers, $params);
return json_decode($result, true);
}
public function request($method, $req, $params = false){
$method = strtoupper($method);
if ($req == 'media/upload') {
return $this->upload($method, $req, $params);
}
$version = explode('/', $req);
if ($version[0] == '2') {
$req = "/$req";
return $this->request2($method, $req, $params);
}
if ($version[1] == '2') {
return $this->request2($method, $req, $params);
}
if ($version[0] == 'labs') {
$req = "/$req";
return $this->request2($method, $req, $params);
}
if ($version[1] == 'labs') {
return $this->request2($method, $req, $params);
}
$url = $this->apiStandardUrl . $req . ".json";
if ($this->oauth_token !== false && $this->oauth_token_secret == false) {
$oauth = $this->buildBearerheaders($this->oauth);
$headers = [];
$headers[] = $oauth;
} else {
$oauth = $this->getSignature($method, $url, $params);
$headers = [];
$headers[] = $this->buildAutheaders($oauth);
}
$result = $this->reqCurl($method, $url, $params, $headers, null);
return json_decode($result, true);
}
protected function reqUpload($method, $req, $params){
$url = $this->apiUploadUrl . $req . ".json";
$oauth = $this->getSignature($method, $url);
$headers = [];
$headers[] = $this->buildAutheaders($oauth);
$headers[] = 'Content-Type: multipart/form-data';
$result = $this->reqCurl($method, $url, null, $headers, $params);
return json_decode($result, true);
}
protected function uploadChunked($req, $params){
$_params = [
'command' => 'INIT',
'total_bytes' => filesize($params['media']),
'media_type' => $params['media_type'],
];
if (isset($params['additional_owners'])) {
$_params['additional_owners'] = $params['additional_owners'];
}
if (isset($params['media_category'])) {
$_params['media_category'] = $params['media_category'];
}
$req = $this->reqUpload('POST', 'media/upload', $_params);
$fp = fopen($params['media'], 'r');
$segment_id = 0;
while (!feof($fp)) {
$chunk = fread($fp, 40960);
$__params = [
"command" => "APPEND",
"media_id" => $req['media_id'],
"segment_index" => $segment_id++,
'media_data' => base64_encode($chunk),
];
$this->reqUpload('POST', 'media/upload', $__params);
}
fclose($fp);
$lastParams = array(
"command" => "FINALIZE",
"media_id" => $req['media_id'],
);
$result = $this->reqUpload('POST', 'media/upload', $lastParams);
return $result;
}
public function upload($method, $req, $params){
if ($method == 'GET') {
return "METHOD MUST BE POST";
}
$url = $this->apiUploadUrl . $req . ".json";
$c = count($params);
if ($c == 1 && isset($params['media'])) {
$filename = file_get_contents($params['media']);
$base64 = base64_encode($filename);
$_params = ['media_data' => $base64];
return $this->reqUpload('POST', 'media/upload', $_params);
} elseif ($c == 1 && isset($params['media_data'])) {
$base64 = $params['media_data'];
$_params = ['media_data' => $base64];
return $this->reqUpload('POST', 'media/upload', $_params);
} else {
return $this->uploadChunked($req, $params);
}
}
public function file($oauthUrl){
$oauth = $this->getSignature("GET", $oauthUrl);
$headers = [];
$headers[] = $this->buildAutheaders($oauth);
$result = $this->reqCurl("GET", $oauthUrl, null, $headers, null);
return $result;
}
public function oauth($req, $params){
$url = $this->apiUrl . $req;
$oauth = $this->getSignature("POST", $url, $params);
$headers = [];
$headers[] = $this->buildAutheaders($oauth);
$result = $this->reqCurl("POST", $url, $params, $headers, null);
parse_str($result, $arr);
return $arr;
}
public function url($req, $params){
$url = $this->apiUrl . $req . "?" . http_build_query($params);
return $url;
}
public function oauth2($req, $params){
$url = $this->apiUrl . $req;
$result = $this->reqCurl("POST", $url, $params, null, null, true);
return json_decode($result, true);
}
}
// ÖRNEK TWEET ÇEKME
$conn = new API(CONSUMER_KEY, CONSUMER_SECRET);
$params = ['grant_type' => 'client_credentials'];
$bearerToken = $conn->oauth2('oauth2/token', $params);
$conn2 = new API(CONSUMER_KEY, CONSUMER_SECRET, $bearerToken['access_token']);
$res = $conn2->request('GET', '/2/users/by/username/senggolbaok');
print_r($res);
// ÖRNEK TWEET ATMA
$conn = new API(CONSUMER_KEY, CONSUMER_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET);
$postfields = "{\"text\":\"Merhaba Dünya\"}";
$res = $conn->request('POST', '/2/tweets', $postfields);
print_r($res);
Kaynak: composer require ferrysyahrinal/twifer