protected override string CreateSignature(string tokenSecret, string method, Uri uri, Dictionary <string, string> parameter) { //パラメタをソート済みディクショナリに詰替(OAuthの仕様) SortedDictionary <string, string> sorted = new SortedDictionary <string, string>(parameter); //URLエンコード済みのクエリ形式文字列に変換 string paramString = MyCommon.BuildQueryString(sorted); //アクセス先URLの整形 string url = string.Format("{0}://{1}{2}", uri.Scheme, uri.Host, uri.AbsolutePath); //本来のアクセス先URLに再設定(api.twitter.com固定) if (!string.IsNullOrEmpty(_proxyHost) && url.StartsWith(uri.Scheme + "://" + _proxyHost)) { url = url.Replace(uri.Scheme + "://" + _proxyHost, uri.Scheme + "://" + _apiHost); } //署名のベース文字列生成(&区切り)。クエリ形式文字列は再エンコードする string signatureBase = String.Format("{0}&{1}&{2}", method, UrlEncode(url), UrlEncode(paramString)); //署名鍵の文字列をコンシューマー秘密鍵とアクセストークン秘密鍵から生成(&区切り。アクセストークン秘密鍵なくても&残すこと) string key = UrlEncode(consumerSecret) + "&"; if (!string.IsNullOrEmpty(tokenSecret)) { key += UrlEncode(tokenSecret); } //鍵生成&署名生成 using (HMACSHA1 hmac = new HMACSHA1(Encoding.ASCII.GetBytes(key))) { byte[] hash = hmac.ComputeHash(Encoding.ASCII.GetBytes(signatureBase)); return(Convert.ToBase64String(hash)); } }
private async Task <Uri> ShortenByUxnuAsync(Uri srcUri) { // 明らかに長くなると推測できる場合は短縮しない if ("http://ux.nx/xxxxxx".Length > srcUri.OriginalString.Length) { return(srcUri); } var query = new Dictionary <string, string> { { "format", "plain" }, { "url", srcUri.OriginalString }, }; var uri = new Uri("http://ux.nu/api/short?" + MyCommon.BuildQueryString(query)); using (var response = await this.http.GetAsync(uri).ConfigureAwait(false)) { response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync() .ConfigureAwait(false); if (!Regex.IsMatch(result, @"^https?://")) { throw new WebApiException("Failed to create URL.", result); } return(new Uri(result.TrimEnd())); } }
/// <summary> /// Microsoft Translator API を使用した翻訳を非同期に行います /// </summary> /// <exception cref="HttpRequestException"/> public async Task <string> TranslateAsync(string text, string langFrom, string langTo) { var param = new Dictionary <string, string> { { "Text", "'" + text + "'" }, { "To", "'" + langTo + "'" }, { "$format", "Raw" }, }; if (langFrom != null) { param["From"] = "'" + langFrom + "'"; } var uri = new Uri(TranslateUri + "?" + MyCommon.BuildQueryString(param)); var request = new HttpRequestMessage(HttpMethod.Get, uri); request.Headers.Authorization = CreateBasicAuthHeaderValue(ApplicationSettings.AzureMarketplaceKey, ApplicationSettings.AzureMarketplaceKey); using (var response = await this.http.SendAsync(request).ConfigureAwait(false)) { response.EnsureSuccessStatusCode(); var xmlStr = await response.Content.ReadAsStringAsync() .ConfigureAwait(false); var xdoc = XDocument.Parse(xmlStr); return(xdoc.Root.Value); } }
///<summary> ///HttpWebRequestオブジェクトを取得する。パラメータはGET/HEAD/DELETEではクエリに、POST/PUTではエンティティボディに変換される。 ///</summary> ///<remarks> ///追加で必要となるHTTPヘッダや通信オプションは呼び出し元で付加すること ///(Timeout,AutomaticDecompression,AllowAutoRedirect,UserAgent,ContentType,Accept,HttpRequestHeader.Authorization,カスタムヘッダ) ///POST/PUTでクエリが必要な場合は、requestUriに含めること。 ///</remarks> ///<param name="method">HTTP通信メソッド(GET/HEAD/POST/PUT/DELETE)</param> ///<param name="requestUri">通信先URI</param> ///<param name="param">GET時のクエリ、またはPOST時のエンティティボディ</param> ///<returns>引数で指定された内容を反映したHttpWebRequestオブジェクト</returns> protected HttpWebRequest CreateRequest(string method, Uri requestUri, Dictionary <string, string> param) { Networking.CheckInitialized(); //GETメソッドの場合はクエリとurlを結合 UriBuilder ub = new UriBuilder(requestUri.AbsoluteUri); if (param != null && (method == "GET" || method == "DELETE" || method == "HEAD")) { ub.Query = MyCommon.BuildQueryString(param); } HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(ub.Uri); webReq.ReadWriteTimeout = 90 * 1000; //Streamの読み込みは90秒でタイムアウト(デフォルト5分) //プロキシ設定 if (Networking.ProxyType != ProxyType.IE) { webReq.Proxy = Networking.Proxy; } webReq.Method = method; if (method == "POST" || method == "PUT") { webReq.ContentType = "application/x-www-form-urlencoded"; //POST/PUTメソッドの場合は、ボディデータとしてクエリ構成して書き込み using (StreamWriter writer = new StreamWriter(webReq.GetRequestStream())) { writer.Write(MyCommon.BuildQueryString(param)); } } //cookie設定 if (this.UseCookie) { webReq.CookieContainer = this.cookieContainer; } //タイムアウト設定 webReq.Timeout = this.InstanceTimeout ?? (int)Networking.DefaultTimeout.TotalMilliseconds; webReq.UserAgent = Networking.GetUserAgentString(); // KeepAlive無効なサーバー(Twitter等)に使用すると、タイムアウト後にWebExceptionが発生する場合あり webReq.KeepAlive = false; return(webReq); }
private async Task <Uri> ShortenByBitlyAsync(Uri srcUri, string domain = "bit.ly") { // 明らかに長くなると推測できる場合は短縮しない if ("http://bit.ly/xxxx".Length > srcUri.OriginalString.Length) { return(srcUri); } // bit.ly 短縮機能実装のプライバシー問題の暫定対応 // ログインIDとAPIキーが指定されていない場合は短縮せずにPOSTする // 参照: http://sourceforge.jp/projects/opentween/lists/archive/dev/2012-January/000020.html if (string.IsNullOrEmpty(this.BitlyId) || string.IsNullOrEmpty(this.BitlyKey)) { return(srcUri); } var query = new Dictionary <string, string> { { "login", this.BitlyId }, { "apiKey", this.BitlyKey }, { "format", "txt" }, { "domain", domain }, { "longUrl", srcUri.OriginalString }, }; var uri = new Uri("https://api-ssl.bitly.com/v3/shorten?" + MyCommon.BuildQueryString(query)); using (var response = await this.http.GetAsync(uri).ConfigureAwait(false)) { response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync() .ConfigureAwait(false); if (!Regex.IsMatch(result, @"^https?://")) { throw new WebApiException("Failed to create URL.", result); } return(new Uri(result.TrimEnd())); } }