2011-09-16 34 views
0

[Update 2011-09-21 11:19] 我修復了一個導致問題的問題,那就是GMT/GMT +2 我的當地時間是格林尼治標準時間+2,而twitter使用的是格林威治標準時間+ 0/UTC。這導致時間戳越界錯誤。如何使用API​​函數將照片上傳到twitter?狀態/ update_with_media

我現在固定的問題,現在所面臨的一個問題: 串(96)「{」請求「:」/1 /狀態/ update_with_media.json「‘錯誤’:」無法使用OAuth認證「}」

這是(使用curl)通過Themattharris PHP庫產生的請求頭:

["request_header"]=> 
    string(587) "POST /1/statuses/update_with_media.json HTTP/1.1 

User-Agent: themattharris' HTTP Client 

Host: upload.twitter.com 

Accept: */* 

Authorization: OAuth oauth_consumer_key="L9AWIB6jvxm3Req1XWHxJA", oauth_nonce="9e41eea04e2dcc2b67784b35c27d8740", oauth_signature="N2Y4YzYwMDg1YjBmZTA1NDgwNDdjOGY3MDI4YjdiNWE3M2E5ZTA5YQ%3D%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1316596483", oauth_token="373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2", oauth_version="1.0" 

Content-Length: 10024 

Content-Type: multipart/form-data; boundary=----------------------------3ddd9c41c091 



" 

我相當肯定,我使用了正確的密碼(從Twitter的開發頁面複製pastaed我的申請)在那裏我也產生了我的私人祕密令牌

[2011-09-21更新〜10:45] 所以我周圍使用PHP LIB得到(改寫成C++/CLI)和我的C++ lib應該產生完全相同的結果作爲PHP庫。 (授權標題字符串)。

由於某種原因,我總是得到一個狀態:(401)未經授權。 我正在使用System.Net.WebClient發出請求。並使用UploadValues,以及上傳值。

如果我使用UploadData或使用WebRequest而不是WebClient,則會出現狀態:(500)內部服務器錯誤。

如果需要的話(但我當然不會給出祕密)

這是什麼例如我即basestring和授權字符串看,我可以提供所有的字符串和我產生像頭:

BaseString: POST&https%3A%2F%2Fupload.twitter.com%2F1%2Fstatuses%2Fupdate_with_media.json&oauth_consumer_key%3DL9AWIB6jvxm3Req1XWHxJA%26oauth_nonce%3Ddb0ca1f6c926c1d3ae0d9cbb2c349ae2%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1316538778%26oauth_token%3D373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2%26oauth_version%3D1.0

Authorization: OAuth oauth_consumer_key="L9AWIB6jvxm3Req1XWHxJA", oauth_nonce="db0ca1f6c926c1d3ae0d9cbb2c349ae2", oauth_signature="OGI4ZDVkYjZjNjA3YWMyZGYxNWYzZDBhNDE0ODcwMzRkMDE4OWZiYQ%3D%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1316538778", oauth_token="373846001-bJYH4C47vk34yfIH3XbpvvfZjd2JrIX9OlO5MyO2", oauth_version="1.0"


下面是舊的文本,不再有效。


我可能是一個簡單的問題,但我無法弄清楚這一點。 我正在使用Twitterizer爲我提供所需的祕密令牌。該庫還提供了一種使用新推文更新您的Twitter的方法,但它不支持新的update_with_media調用。

我嘗試了幾種方法,通過使用WebRequest類和其他方式使用Web客戶端(僞C#-code)的一種方法:

string URL = "https://upload.twitter.com/1/statuses/update_with_media.json?oauth_consumer_secret=[mysecretgoeshere]&oauth_token_secret=[usersecretgoeshere]"; 
System.Net.ServicePointManager.Expect100Continue = false; 
Byte[] fileData = File.ReadAllBytes(pathToFile); 

#if useWebRequest 
    string postString = "status={statusgoeshere}&image[]={Encoding.ASCII.GetString(fileData)}"; 
    Byte[] postData = Encoding.ASCII.GetBytes(postString); 

    WebRequest wr = WebRequest.Create(URL); 

    wr.Method = "POST"; 
    wr.ContentType = "multipart/form-data"; //as required by twitter API 
    wr.ContentLength = postData.Length; 

    IO.Stream rqstream = wr.GetRequestStream(); 
    rqstream.Write(postData,0,postData.Length); 
    rqstream.Close(); 

    wr.GetResponse(); //returns status 500 internal server error 
#else 
    WebClient client = new WebClient(); 
    NameValueCollection postData = new NameValueCollection(); 

    postData.Add("status", "{statusgoeshere}"); 
    postData.add("media[]", Encoding.ASCII.GetString(fileData)); 

    client.UploadValues(URL, "POST", postData); //returns status 401 not authorized 
#endif 

我不知道我做錯了(如果我做這是錯誤的)。這兩種方式在我眼中都很有效,但我可能會錯過一些東西。

EDIT1: 我注意到我傳遞的誓言參數以錯誤的方式,將嘗試和更新的一部分。

+0

我已經用更多和更新的相關信息更新了這個問題。 –

+0

OAuth祕密值不通過互聯網發送。它們用於生成簽名(以及所有其他查詢字符串和/或表單值)。 –

+0

@RickySmith是的,我發現後通過tmhOAuth PHP庫的工作;-) –

回答

1

,我沒有添加任何文件上傳到Twitterizer又是因爲它需要WebRequestBuilder類的修改(即增加了OAuth的頭和標誌要求)來處理多POST請求的原因。我試圖對這個類進行幾次必要的修改,但每次都會導致庫中其他部分不穩定,這主要是由於缺少有關Twitter API如何預期多部分請求被簽名的文檔。

然而,最近有些文件被髮布到Twitter API portal,詳述了這些請求。如果你想嘗試自己實現這個邏輯,那將是非常寶貴的資源。否則,您可以等待。根據這些信息,我計劃儘快進行修改以正確支持文件上傳。

+0

我確實開始改變Twitterizer的代碼來實現with_media API。如果我能使事情順利進行,我會再次回覆。 –

+0

對,我所做的只是添加了Multipart - 設置。在PrepareRequest函數中添加一些if(Multipart)和if(!Multipart),並添加一個函數以將後數據作爲多部分字節[]。這會導致以下錯誤:System.dll中發生類型'System.Net.WebException'的第一次機會異常 ----------- RESPONSE ----------- {「request」:「\/1 \/statuses \ /update_with_media.json」,「error」:「無法使用OAuth進行身份驗證。」} ----------- END ----- ------ Bah,當我發佈一條普通的推文時,它可以正常工作。 : -/ –

+0

對。這幾乎肯定意味着OAuth簽名生成存在問題。 https://dev.twitter.com/discussions/1059和http://www.oauth.net/將擁有您想要的最無聊格式所需的一切。 –

0

The TweetIt example顯示瞭如何通過update_with_media.xml通過用C#編寫的.NET應用程序更新狀態併發布圖像。

提供全部資源。它不使用Twitterizer。它使用this Oauth module來管理身份驗證。

+0

我已經解決了這個問題並更改了twitterizer代碼,並且Ricky更新了官方Twitterizer,請參閱此處的主題:http://forums.twitterizer.net/viewtopic.php?f=9&t=607 #p2139但感謝您的信息。 –

1

萬一有人仍試圖上傳在Twitter上。 我是Tweetinvi的主要開發者,它能夠上傳超過6個月的文件。

隨意看看吧:

例子:

// 1 line to upload and publish 
var tweet = Tweet.PublishTweetWithVideo("my tweet", File.ReadAllBytes("filepath")); 

// OR WITH ADDITIONAL PARAMETERS 
var uploadedVideo = Upload.UploadVideo(File.ReadAllBytes("filepath")); 
tweet = Tweet.PublishTweet("my tweet", new PublishTweetOptionalParameters 
{ 
    Medias = new List<IMedia> { uploadedVideo }, 
    Coordinates = new Coordinates(42, 42) 
}); 

很明顯,你可以做得更多。 隨時檢查文檔:https://github.com/linvi/tweetinvi/wiki/Upload

相關問題