public TokenPair AccessToken(string verifier) { try { var obj = new { oauth_verifier = verifier }; var buff = Encoding.UTF8.GetBytes(OAuth.ToString(obj)); var req = MakeRequest("POST", "https://api.twitter.com/oauth/access_token", obj); req.GetRequestStream().Write(buff, 0, buff.Length); using (var res = req.GetResponse()) using (var reader = new StreamReader(res.GetResponseStream())) { var str = reader.ReadToEnd(); var token = new TokenPair(); token.Token = Regex.Match(str, @"oauth_token=([^&]+)").Groups[1].Value; token.Secret = Regex.Match(str, @"oauth_token_secret=([^&]+)").Groups[1].Value; return(token); } } catch { return(null); } }
/// <summary> /// 트윗을 게시합니다. /// </summary> /// <param name="songinfo">트윗할 SongInfo 객체</param> /// <returns>트윗 성공 여부</returns> public bool Publish(SongInfo songinfo) { if (songinfo == null) { return(false); } string mediaId = null; var stream = ImageResize.LoadImageResized(songinfo.Cover); if (stream != null) { try { var req = OAuth.MakeRequest("POST", "https://upload.twitter.com/1.1/media/upload.json"); using (stream) { var buff = new byte[4096]; var read = 0; var boundary = Guid.NewGuid().ToString("N") + Guid.NewGuid().ToString("N"); var bef = Encoding.UTF8.GetBytes(string.Format("--{0}\r\nContent-Type: application/octet-stream\r\nContent-Disposition: form-data; name=\"media\";\r\n\r\n", boundary)); var aft = Encoding.UTF8.GetBytes(string.Format("\r\n\r\n--{0}--\r\n", boundary)); req.ContentType = "multipart/form-data; boundary=" + boundary; using (var writer = new BinaryWriter(req.GetRequestStream())) { writer.Write(bef); while ((read = stream.Read(buff, 0, 4096)) > 0) { writer.Write(buff, 0, read); } writer.Write(aft); } } using (var res = req.GetResponse()) using (var reader = new StreamReader(res.GetResponseStream())) mediaId = m_media.Match(reader.ReadToEnd()).Groups[1].Value; } catch { mediaId = null; } } ////////////////////////////////////////////////// var text = songinfo.ToString(mediaId != null); if (string.IsNullOrWhiteSpace(text)) { return(false); } if (TwitterCommunicator.m_lastStr == text) { return(true); } TwitterCommunicator.m_lastStr = text; ////////////////////////////////////////////////// object obj; if (mediaId != null) { obj = new { status = text, media_ids = mediaId } } ; else { obj = new { status = text } }; try { var buff = Encoding.UTF8.GetBytes(OAuth.ToString(obj)); var req = OAuth.MakeRequest("POST", "https://api.twitter.com/1.1/statuses/update.json", obj); req.GetRequestStream().Write(buff, 0, buff.Length); using (var res = req.GetResponse()) using (var reader = new StreamReader(res.GetResponseStream())) return(reader.ReadToEnd() != null); } catch (WebException ex) { if (ex.Response != null) { using (var res = ex.Response) using (var reader = new StreamReader(res.GetResponseStream())) { this.m_lastError = reader.ReadToEnd(); try { var m = m_error.Match(this.m_lastError); this.m_lastError = m.Groups[1].Value; // 중복 트윗인 경우에는 에러 메시지를 작성하지 않는다 if (this.m_lastError.IndexOf("duplica") >= 0) { return(true); } } catch { } } } return(false); } catch { return(false); } }
public WebRequest MakeRequest(string method, string url, object data = null) { method = method.ToUpper(); var uri = new Uri(url); var dic = new SortedDictionary <string, object>(); if (!string.IsNullOrWhiteSpace(uri.Query)) { OAuth.AddDictionary(dic, uri.Query); } if (data != null) { OAuth.AddDictionary(dic, data); } if (!string.IsNullOrWhiteSpace(this.User.Token)) { dic.Add("oauth_token", UrlEncode(this.User.Token)); } dic.Add("oauth_consumer_key", UrlEncode(this.App.Token)); dic.Add("oauth_nonce", OAuth.GetNonce()); dic.Add("oauth_timestamp", OAuth.GetTimeStamp()); dic.Add("oauth_signature_method", "HMAC-SHA1"); dic.Add("oauth_version", "1.0"); var hashKey = string.Format( "{0}&{1}", UrlEncode(this.App.Secret), this.User.Secret == null ? null : UrlEncode(this.User.Secret)); var hashData = string.Format( "{0}&{1}&{2}", method.ToUpper(), UrlEncode(string.Format("{0}{1}{2}{3}", uri.Scheme, Uri.SchemeDelimiter, uri.Host, uri.AbsolutePath)), UrlEncode(OAuth.ToString(dic))); using (var hash = new HMACSHA1(Encoding.UTF8.GetBytes(hashKey))) dic.Add("oauth_signature", UrlEncode(Convert.ToBase64String(hash.ComputeHash(Encoding.UTF8.GetBytes(hashData))))); var sbData = new StringBuilder(); sbData.Append("OAuth "); foreach (var st in dic) { if (Array.IndexOf <string>(oauth_array, st.Key) >= 0) { sbData.AppendFormat("{0}=\"{1}\",", st.Key, Convert.ToString(st.Value)); } } sbData.Remove(sbData.Length - 1, 1); var str = sbData.ToString(); var req = (HttpWebRequest)WebRequest.Create(uri); req.Method = method; req.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; req.UserAgent = "Decchi"; req.Headers.Add("Authorization", sbData.ToString()); if (method == "POST") { req.ContentType = "application/x-www-form-urlencoded"; } return(req); }