Example #1
0
        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));
            }
        }
Example #2
0
        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()));
            }
        }
Example #3
0
        /// <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);
            }
        }
Example #4
0
        ///<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);
        }
Example #5
0
        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()));
            }
        }