我可以得到一個 image_id 但不能用影像更新狀態......
我向“media/upload.json”發出第一個請求并獲得media_id,然后我向“statuses/update.json”發出請求,其中包含之前收到的狀態訊息和media_id。只顯示文本,不顯示影像。
我的 php 代碼:
<?php
$oauth_access_token = "XXXX";
$oauth_access_token_secret = "XXXX";
$consumer_key = "XXXX";
$consumer_secret = "XXXX";
//twitter api urls
$URLS = array(
"image" => "https://upload.twitter.com/1.1/media/upload.json",
"status" => "https://api.twitter.com/1.1/statuses/update.json"
);
function buildBaseString($baseURI, $method, $params)
{
$r = array();
ksort($params);
foreach ($params as $key => $value) {
$r[] = "$key=" . rawurlencode($value);
}
return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth)
{
$r = 'Authorization: OAuth ';
$values = array();
foreach ($oauth as $key => $value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
function makeRequest($postfields, $url)
{
global $consumer_key;
global $consumer_secret;
global $oauth_access_token;
global $oauth_access_token_secret;
$oauth = array(
'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauth_access_token,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
$base_info = buildBaseString($url, 'POST', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
$header = array(buildAuthorizationHeader($oauth), 'Content-Type: multipart/form-data;');
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
return $json;
}
//Upload image to twitter and get media_id
$file = file_get_contents("C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\img\mercedes.jpg");
$postfields = array("media_data" => base64_encode($file));
$result = makeRequest($postfields, $URLS['image']);
$imageresult = json_decode($result);
$imageid = $imageresult->media_id_string;
var_dump($imageresult);
// update status with status and media_id
$postfields = array(
"media_ids" => $imageid,
"status" => "test messsage with image"
);
var_dump($postfields);
$result = makeRequest($postfields, $URLS['status']);
$statusresult = json_decode($result);
var_dump($statusresult);
twitter api 回應:我在第一個請求的回應中有 media_id。使用 media_id 但在更新狀態時不起作用...
C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:82:
object(stdClass)[1]
public 'media_id' => int 1446017066218164228
public 'media_id_string' => string '1446017066218164228' (length=19)
public 'size' => int 161329
public 'expires_after_secs' => int 86400
public 'image' =>
object(stdClass)[2]
public 'image_type' => string 'image/jpeg' (length=10)
public 'w' => int 1200
public 'h' => int 900
C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:91:
array (size=2)
'media_ids' => string '1446017066218164228' (length=19)
'status' => string 'test messsage with image' (length=24)
C:\wamp64\apps\annonces_insolites\auto\annonces_insolites\reseaux\twitter\twitter_fct2.php:96:
object(stdClass)[3]
public 'created_at' => string 'Thu Oct 07 07:38:29 0000 2021' (length=30)
public 'id' => int 1446017068470611973
public 'id_str' => string '1446017068470611973' (length=19)
public 'text' => string 'test messsage with image' (length=24)
public 'truncated' => boolean false
public 'entities' =>
object(stdClass)[4]
public 'hashtags' =>
array (size=0)
empty
public 'symbols' =>
array (size=0)
empty
public 'user_mentions' =>
array (size=0)
empty
public 'urls' =>
array (size=0)
empty
public 'source' => string '<a href="XXXX" rel="nofollow">XXXX</a>' (length=83)
public 'in_reply_to_status_id' => null
public 'in_reply_to_status_id_str' => null
public 'in_reply_to_user_id' => null
public 'in_reply_to_user_id_str' => null
public 'in_reply_to_screen_name' => null
public 'user' =>
object(stdClass)[5]
public 'id' => int XXXX
public 'id_str' => string 'XXXX' (length=19)
public 'name' => string 'XXXX' (length=23)
public 'screen_name' => string 'XXXX' (length=6)
public 'location' => string 'XXXX' (length=19)
public 'description' => string 'XXXX' (length=59)
public 'url' => null
public 'entities' =>
object(stdClass)[7]
public 'description' =>
object(stdClass)[6]
...
public 'protected' => boolean false
public 'followers_count' => int 54
public 'friends_count' => int 47
public 'listed_count' => int 0
public 'created_at' => string 'Sun Jan 20 11:36:11 0000 2019' (length=30)
public 'favourites_count' => int 2163
public 'utc_offset' => null
public 'time_zone' => null
public 'geo_enabled' => boolean false
public 'verified' => boolean false
public 'statuses_count' => int 172
public 'lang' => null
public 'contributors_enabled' => boolean false
public 'is_translator' => boolean false
public 'is_translation_enabled' => boolean false
public 'profile_background_color' => string 'F5F8FA' (length=6)
public 'profile_background_image_url' => null
public 'profile_background_image_url_https' => null
public 'profile_background_tile' => boolean false
public 'profile_image_url' => string 'XXXX' (length=75)
public 'profile_image_url_https' => string 'XXXX' (length=76)
public 'profile_banner_url' => string 'XXXX' (length=68)
public 'profile_link_color' => string '1DA1F2' (length=6)
public 'profile_sidebar_border_color' => string 'C0DEED' (length=6)
public 'profile_sidebar_fill_color' => string 'DDEEF6' (length=6)
public 'profile_text_color' => string '333333' (length=6)
public 'profile_use_background_image' => boolean true
public 'has_extended_profile' => boolean true
public 'default_profile' => boolean true
public 'default_profile_image' => boolean false
public 'following' => boolean false
public 'follow_request_sent' => boolean false
public 'notifications' => boolean false
public 'translator_type' => string 'none' (length=4)
public 'withheld_in_countries' =>
array (size=0)
empty
public 'geo' => null
public 'coordinates' => null
public 'place' => null
public 'contributors' => null
public 'is_quote_status' => boolean false
public 'retweet_count' => int 0
public 'favorite_count' => int 0
public 'favorited' => boolean false
public 'retweeted' => boolean false
public 'lang' => string 'en' (length=2)
uj5u.com熱心網友回復:
我遇到了完全相同的問題。在幾乎放棄了幾次之后,我終于破解了它。
您需要知道/做的一些事情。
確保將您的帖子引數附加到您傳遞給 buildBaseString 的 OAuth 陣列上,然后在 URL 編碼它們之前執行 ksort
如果您將 post 引數作為陣列傳遞給 curl,那么它會將內容型別標頭更改為您不想要的 multipart/form-data,因此請務必先執行以下操作:
$post = http_build_query($data, "", "&");在傳遞給 curl 之前。OAuth 規范規定,當且僅當編碼為 x-www-form-urlencoded 時,主體應包含在基本字串中以進行簽名。
至于為什么 Twitter 接受所有 bar media_ids 引數,如果你作為 multipart/form-data 發送,我不知道,但似乎就是這種情況。
不要將 post 引數包含到您傳遞給 buildAuthorisationHeader func 的 OAuth 陣列中:)
我希望這對你有所幫助,因為它在我讓它作業之前讓我發瘋了好幾個小時。我現在對 OAuth 的了解比我想了解的還要多,哈哈。
PS - 成功后,您應該在 JSON 回應中收到一大塊擴展屬性,詳細說明推文中包含的影像/視頻。
uj5u.com熱心網友回復:
我創建了這段代碼,它作業得很好:如果有人需要幫助或想在沒有任何庫的情況下將影像和狀態上傳到 twitter ;)
<?php
function post_media_status($url, $method, $media_ids, $status, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{
$nonce = time();
$timenow = time();
$signature = build_signature($url, $method, $media_ids, $status, $nonce, $timenow, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
//print($signature);
$oauth = array(
'oauth_consumer_key' => $oauthconsumerkey,
'oauth_nonce' => $nonce,
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauthtoken,
'oauth_timestamp' => $timenow
);
$oauth['oauth_signature'] = $signature;
$header = array(buildAuthorizationHeader($oauth));
var_dump($header);
curl_post_status_media($url, $header, $media_ids, $status);
}
function build_signature($url, $method, $media_ids, $status, $nonce, $timenow, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{
$key = rawurlencode($clientsecret) . "&" . rawurlencode($tokensecret);
$paramstring = "media_ids=" . $media_ids . "&oauth_consumer_key=" . $oauthconsumerkey . "&oauth_nonce=" . $nonce . "&oauth_signature_method=HMAC-SHA1" . "&oauth_timestamp=" . $timenow . "&oauth_token=" . $oauthtoken . "&status=" . $status;
$encodeurl = $method . "&" . rawurlencode($url) . "&" . rawurlencode($paramstring);
$signature = hash_hmac('sha1', $encodeurl, $key, TRUE);
$signature = base64_encode($signature);
return $signature;
}
function curl_post_status_media($url, $header, $media_ids, $status)
{
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_POSTFIELDS => "status=" . $status . "&media_ids=" . $media_ids,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
);
$request = curl_init();
curl_setopt_array($request, $options);
$response = curl_exec($request);
$decoded = json_decode($response);
var_dump($decoded);
curl_close($request);
return $response;
}
function buildAuthorizationHeader($oauth)
{
$r = 'Authorization: OAuth ';
$values = array();
foreach ($oauth as $key => $value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
function upload_media($postfields, $url, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret)
{
$oauth = array(
'oauth_consumer_key' => $oauthconsumerkey,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_token' => $oauthtoken,
'oauth_timestamp' => time(),
'oauth_version' => '1.0'
);
$base_info = buildBaseString($url, 'POST', $oauth);
$composite_key = rawurlencode($clientsecret) . '&' . rawurlencode($tokensecret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
$header = array(buildAuthorizationHeader($oauth));
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false
);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
//var_dump($json);
curl_close($feed);
return $json;
}
function buildBaseString($baseURI, $method, $params)
{
$r = array();
ksort($params);
foreach ($params as $key => $value) {
$r[] = "$key=" . rawurlencode($value);
}
return $method . "&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function post_media_with_status($file_location, $status, $oauthconsumerkey, $clientsecret, $tokensecret, $oauthtoken)
{
$file = file_get_contents($file_location);
$postfields = array("media_data" => base64_encode($file));
$result = upload_media($postfields, "https://upload.twitter.com/1.1/media/upload.json", $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
$imageresult = json_decode($result);
var_dump($imageresult);
$imageid = $imageresult->media_id_string;
$result = post_media_status("https://api.twitter.com/1.1/statuses/update.json", "POST", $imageid, $status, $oauthconsumerkey, $oauthtoken, $clientsecret, $tokensecret);
return $result;
}
post_media_with_status("IMAGE_URL", "Test", TWITTER_API_KEY, TWITTER_API_SECRET_KEY, "TOKEN_SECRET", "TOKEN");
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331442.html
