搜尋此網誌

2022年9月16日 星期五

C# Twitter API 發送 Tweet

緣起:


    接續這篇,今天上午弄好 signature 後,下午接著繼續研究怎麼用 C# 把我的那些 OAuth 資料送到 Twitter API 那邊,過程還算順利,只有一個地方卡比較久,就是沒把 hash 出來的值做 base64 的編碼,導致在傳 http 時一直出現 401 的 Exception。




HttpWebRequest:


    首先是要怎麼傳 http 的資料過去,這個我兩天前其實就有先稍微試過了,看這篇文章的教學。這個類別在 System.Net 下面

    使用 WebRequest 的 Create 方法,裡面傳入目標網址的字串,我們的目標是 "https://api.twitter.com/2/tweets"。可以透過 Headers 欄位來設定 Request 的 Header 值,存取的方式很像字典,是 key value 對,最重要的是設定 Authorization 的屬性。Method 可以設定 POST 或 GET,ContentType 就 "application/json",Timeout 是逾時的時間(毫秒)。


    要在 Body 裡寫資料的話會需要用到 StreamWriter 這個類別,讀回應的資料要用 StreamReader,需要引用 System.IO。HttpWebRequest 有 GetRequestStream 方法,回傳的 Stream 可以用來初始化 StreamWriter 類別,然後就能用 StreamWriter 的 Write 方法就可以寫東西到我們 Request 的 Body 裡了。


    讀取 Response 接著寫在下面,格式很像,HttpWebRequest 一樣有個 GetResponseStream 的方法來得到 Response 的 Stream,然後我們再用 StreamReader 的 ReadToEnd 方法讀取完整的回應。


    差不多就這樣。


TimeStamp 跟 Nonce:


    我們在 POST Man 上面使用 Twitter API 時,OAuth1.0 需要的 Nonce 跟 TimeStamp 是 POST Man 幫我們產生的,在 C# 上面我們需要自己寫個程式來產生。

    首先是 Nonce,看了看官方文件的說法,它是讓 Twitter 識別某個 request 是否被重送,每個 requst 應該都要有一個獨一無二的 Nonce。雖然文件是說那個值是基於 base64 32bytes 的資料,不過只要能每次都產生不重複的字母串,你用其它的方式也行,長度不一定要跟他一樣。

    說到產生不重複的字串,我想到我在看公司的程式碼時,好像有看到一個叫 GUID 的類別,他的功能感覺能滿足我的需求,所以就去查看了微軟的文件

    它使用起來超簡單,只要呼叫 GUID.NewGUID(),然後再呼叫 toString() 轉成字串就OK了,我們就能拿到一串獨一無二的字母串。

長這樣

    再來是 TimeStamp,跟時間有關的東西,好像就 1970 年 1 月 1 號到現在經過的毫秒數 (Unix系統),這個也查一下就有了,直接複製貼上使用。



產生 Authorization:


    這部份就觀察 POST Man 的 Header 格式就行


    依樣畫葫蘆,不過這裡要注意的是,value 都有用雙引號括起來,程式裡記得要加上 \",每個值都是用逗號來格開,最後是我上篇說的,hash 出來的值還要給它做 base64 的編碼。

我寫了一個 function 來回傳 Authorization 字串

    嗯....,好像這樣就行了。


送出資料:


    我把整個步驟都包成一個 Tweet 的 function,這邊要注意的就,送出的資料格式是 json。

沒有留言:

張貼留言