Php Twitter Api v2 ve Oauth1.0a Sınıfı – Tweet API 2023

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