<?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