示例#1
0
        /// <summary>
        /// 指定された短縮URLサービスを使用してURLを短縮します
        /// </summary>
        /// <param name="shortenerType">使用する短縮URLサービス</param>
        /// <param name="srcUri">短縮するURL</param>
        /// <returns>短縮されたURL</returns>
        public Task <Uri> ShortenUrlAsync(MyCommon.UrlConverter shortenerType, Uri srcUri)
        {
            // 既に短縮されている状態のURLであれば短縮しない
            if (ShortUrlHosts.Contains(srcUri.Host))
            {
                return(Task.FromResult(srcUri));
            }

            switch (shortenerType)
            {
            case MyCommon.UrlConverter.TinyUrl:
                return(this.ShortenByTinyUrlAsync(srcUri));

            case MyCommon.UrlConverter.Isgd:
                return(this.ShortenByIsgdAsync(srcUri));

            case MyCommon.UrlConverter.Twurl:
                return(this.ShortenByTwurlAsync(srcUri));

            case MyCommon.UrlConverter.Bitly:
                return(this.ShortenByBitlyAsync(srcUri, "bit.ly"));

            case MyCommon.UrlConverter.Jmp:
                return(this.ShortenByBitlyAsync(srcUri, "j.mp"));

            case MyCommon.UrlConverter.Uxnu:
                return(this.ShortenByUxnuAsync(srcUri));

            default:
                throw new ArgumentException("Unknown shortener.", "shortenerType");
            }
        }
示例#2
0
        /// <summary>
        /// 指定された短縮URLサービスを使用してURLを短縮します
        /// </summary>
        /// <param name="shortenerType">使用する短縮URLサービス</param>
        /// <param name="srcUri">短縮するURL</param>
        /// <returns>短縮されたURL</returns>
        public async Task <Uri> ShortenUrlAsync(MyCommon.UrlConverter shortenerType, Uri srcUri)
        {
            // 既に短縮されている状態のURLであれば短縮しない
            if (ShortUrlHosts.Contains(srcUri.Host))
            {
                return(srcUri);
            }

            try
            {
                switch (shortenerType)
                {
                case MyCommon.UrlConverter.TinyUrl:
                    return(await this.ShortenByTinyUrlAsync(srcUri)
                           .ConfigureAwait(false));

                case MyCommon.UrlConverter.Isgd:
                    return(await this.ShortenByIsgdAsync(srcUri)
                           .ConfigureAwait(false));

                case MyCommon.UrlConverter.Twurl:
                    return(await this.ShortenByTwurlAsync(srcUri)
                           .ConfigureAwait(false));

                case MyCommon.UrlConverter.Bitly:
                    return(await this.ShortenByBitlyAsync(srcUri, "bit.ly")
                           .ConfigureAwait(false));

                case MyCommon.UrlConverter.Jmp:
                    return(await this.ShortenByBitlyAsync(srcUri, "j.mp")
                           .ConfigureAwait(false));

                case MyCommon.UrlConverter.Uxnu:
                    return(await this.ShortenByUxnuAsync(srcUri)
                           .ConfigureAwait(false));

                default:
                    throw new ArgumentException("Unknown shortener.", nameof(shortenerType));
                }
            }
            catch (OperationCanceledException)
            {
                // 短縮 URL の API がタイムアウトした場合
                return(srcUri);
            }
        }
示例#3
0
        public static string Make(MyCommon.UrlConverter ConverterType, string SrcUrl)
        {
            string src = "";

            try
            {
                src = MyCommon.urlEncodeMultibyteChar(SrcUrl);
            }
            catch (Exception)
            {
                return("Can't convert");
            }
            string orgSrc = SrcUrl;
            Dictionary <string, string> param = new Dictionary <string, string>();
            string content = "";

            foreach (string svc in _ShortUrlService)
            {
                if (SrcUrl.StartsWith(svc))
                {
                    return("Can't convert");
                }
            }

            //nico.msは短縮しない
            if (SrcUrl.StartsWith("http://nico.ms/"))
            {
                return("Can't convert");
            }

            SrcUrl = Uri.EscapeUriString(SrcUrl);

            switch (ConverterType)
            {
            case MyCommon.UrlConverter.TinyUrl:           //tinyurl
                if (SrcUrl.StartsWith("http"))
                {
                    if ("http://tinyurl.com/xxxxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }
                    if (!(new HttpVarious()).PostData("http://tinyurl.com/api-create.php?url=" + SrcUrl, null, out content))
                    {
                        return("Can't convert");
                    }
                }
                if (!content.StartsWith("http://tinyurl.com/"))
                {
                    return("Can't convert");
                }
                break;

            case MyCommon.UrlConverter.Isgd:
                if (SrcUrl.StartsWith("http"))
                {
                    if ("http://is.gd/xxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }
                    if (!(new HttpVarious()).PostData("http://is.gd/api.php?longurl=" + SrcUrl, null, out content))
                    {
                        return("Can't convert");
                    }
                }
                if (!content.StartsWith("http://is.gd/"))
                {
                    return("Can't convert");
                }
                break;

            case MyCommon.UrlConverter.Twurl:
                if (SrcUrl.StartsWith("http"))
                {
                    if ("http://twurl.nl/xxxxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }
                    param.Add("link[url]", orgSrc);     //twurlはpostメソッドなので日本語エンコードのみ済ませた状態で送る
                    if (!(new HttpVarious()).PostData("http://tweetburner.com/links", param, out content))
                    {
                        return("Can't convert");
                    }
                }
                if (!content.StartsWith("http://twurl.nl/"))
                {
                    return("Can't convert");
                }
                break;

            case MyCommon.UrlConverter.Bitly:
            case MyCommon.UrlConverter.Jmp:
                const string BitlyApiVersion = "3";
                if (SrcUrl.StartsWith("http"))
                {
                    if ("http://bit.ly/xxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }
                    if (string.IsNullOrEmpty(_bitlyId) || string.IsNullOrEmpty(_bitlyKey))
                    {
                        // bit.ly 短縮機能実装のプライバシー問題の暫定対応
                        // ログインIDとAPIキーが指定されていない場合は短縮せずにPOSTする
                        // 参照: http://sourceforge.jp/projects/opentween/lists/archive/dev/2012-January/000020.html
                        content = src;
                        break;
                    }
                    string req = "";
                    req  = "http://api.bitly.com/v" + BitlyApiVersion + "/shorten?";
                    req += "login="******"&apiKey=" + _bitlyKey +
                           "&format=txt" +
                           "&longUrl=" + SrcUrl;
                    if (ConverterType == MyCommon.UrlConverter.Jmp)
                    {
                        req += "&domain=j.mp";
                    }
                    if (!(new HttpVarious()).GetData(req, null, out content))
                    {
                        return("Can't convert");
                    }
                }
                break;

            case MyCommon.UrlConverter.Uxnu:
                if (SrcUrl.StartsWith("http"))
                {
                    if ("http://ux.nx/xxxxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }
                    if (!(new HttpVarious()).PostData("http://ux.nu/api/short?url=" + SrcUrl + "&format=plain", null, out content))
                    {
                        return("Can't convert");
                    }
                }
                if (!content.StartsWith("http://ux.nu/"))
                {
                    return("Can't convert");
                }
                break;
            }
            //変換結果から改行を除去
            char[] ch = { '\r', '\n' };
            content = content.TrimEnd(ch);
            if (src.Length < content.Length)
            {
                content = src;                              // 圧縮の結果逆に長くなった場合は圧縮前のURLを返す
            }
            return(content);
        }