之前有寫一個需要用到的專案,關於 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:
///
///
///
///
///
/// Item1:registrationToken
/// Item2:endpointId
///
public static Tuple 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()));
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(registrationToken, endpointId);
}
這程式如果寫的不好可能就得麻煩你自己重構了,畢竟這只是 sample code.