[C#] 透過 skypetoken 如何取得 RegistrationToken(Bug 修正)

2020-06-03

之前有寫一個需要用到的專案,關於 skype 廣播,但是最近發現一個 不知道算不算是 bug  ,主要專案是 這個 https://github.com/donma/LazyLizard

之前寫的文章是這一篇 透過 skypetoken 如何取得 RegistrationToken ,遇到的問題在於 其中我提到 "https://client-s.gateway.messenger.live.com/v1/users/ME/endpoints",這個網址,其實他不一定是對的



如果發生 404 錯誤,則他回應的 WebResponse 中 headers 有一個 Location 這邊回應了一個新的 網址,這時候必須要用新的網址再送一次 取得 registrationToken,之後包含送圖片跟送文字 也都要使用 新的 Locatioon ,看起來是因為 skype 畢竟使用雲,他會飄這時候他會動態指向新的網址,所以必須要根據你被配給到新的網址進行操作

這邊有討論串 https://github.com/Terrance/SkPy/issues/54 ,可以參考一下,我這邊測試是成功,當然這是偶爾才會發生不是會一直發生的

Source Code:

/// <summary> /// /// </summary> /// <param name="skypeToken"></param> /// <returns> /// Item1:registrationToken /// Item2:endpointId /// </returns> public static Tuple<string, string> GetRegistToken(string skypeToken) { //Get Regist Token string requestUriString = "https://client-s.gateway.messenger.live.com/v1/users/ME/endpoints"; HttpWebRequest httpWebRequest9 = WebRequest.Create(requestUriString) as HttpWebRequest; httpWebRequest9.Method = "POST"; httpWebRequest9.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"; httpWebRequest9.Accept = "*/*"; httpWebRequest9.Headers.Add("Accept-Language", "zh-tw,zh;q=0.8,en-us;q=0.5,en;q=0.3"); httpWebRequest9.Headers.Add("Accept-Encoding", "gzip, deflate"); httpWebRequest9.Headers.Add("ClientInfo", "os=Windows; osVer=8.1; proc=Win32; lcid=en-us; deviceType=1; country=n/a; clientName=skype.com; clientVer=908/1.9.0.232//skype.com"); httpWebRequest9.Headers.Add("Cache-Control", "no-cache, no-store, must-revalidate"); httpWebRequest9.Headers.Add("Pragma", "no-cache"); httpWebRequest9.Headers.Add("Expires", "0"); httpWebRequest9.Headers.Add("BehaviorOverride", "redirectAs404"); httpWebRequest9.Headers.Add("Authentication", "skypetoken=" + skypeToken); //Important httpWebRequest9.ContentType = "application/json; charset=UTF-8"; httpWebRequest9.Referer = "https://web.skype.com/zh-Hant/"; httpWebRequest9.Headers.Add("Origin", "https://web.skype.com"); httpWebRequest9.KeepAlive = false; byte[] bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject((object)new Dictionary<string, object>())); using (Stream requestStream = httpWebRequest9.GetRequestStream()) requestStream.Write(bytes, 0, bytes.Length); var registTokenSource = ""; WebResponse response = null; try { response = httpWebRequest9.GetResponse(); registTokenSource = response.Headers["Set-RegistrationToken"].ToString(); } catch (WebException webExcp) { requestUriString = webExcp.Response.Headers["Location"]; response = httpWebRequest9.GetResponse(); } var registrationToken = registTokenSource.Split(';')[0].Replace("registrationToken=", ""); var endpointId = registTokenSource.Split(';')[2].Replace("endpointId=", ""); return new Tuple<string, string>(registrationToken, endpointId); }
這程式如果寫的不好可能就得麻煩你自己重構了,畢竟這只是 sample code.


當麻許的碎念筆記 2014 | Donma Hsu Design.