예제 #1
0
        public static string Make(UrlConverter converterType, string srcUrl)
        {
            string src;

            try
            {
                src = MyCommon.GetUrlEncodeMultibyteChar(srcUrl);
            }
            catch (Exception)
            {
                return("Can't convert");
            }

            var orgSrc  = srcUrl;
            var param   = new Dictionary <string, string>();
            var content = string.Empty;

            if (ShortUrlServices.Any(svc => srcUrl.StartsWith(svc)))
            {
                return("Can't convert");
            }

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

            srcUrl = HttpUtility.UrlEncode(srcUrl);

            switch (converterType)
            {
            case 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, ref content))
                    {
                        return("Can't convert");
                    }
                }

                if (!content.StartsWith("http://tinyurl.com/"))
                {
                    return("Can't convert");
                }

                break;

            case 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, ref content))
                    {
                        return("Can't convert");
                    }
                }

                if (!content.StartsWith("http://is.gd/"))
                {
                    return("Can't convert");
                }

                break;

            case 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, ref content))
                    {
                        return("Can't convert");
                    }
                }

                if (!content.StartsWith("http://twurl.nl/"))
                {
                    return("Can't convert");
                }

                break;

            case UrlConverter.Bitly:
            case UrlConverter.Jmp:
                const string BitlyLogin      = "******"; // TODO: Hoehoenize
                const string BitlyApiKey     = "R_c5ee0e30bdfff88723c4457cc331886b";
                const string BitlyApiVersion = "3";
                if (srcUrl.StartsWith("http"))
                {
                    if ("http://bit.ly/xxxx".Length > src.Length && !src.Contains("?") && !src.Contains("#"))
                    {
                        // 明らかに長くなると推測できる場合は圧縮しない
                        content = src;
                        break;
                    }

                    string req = "http://api.bitly.com/v" + BitlyApiVersion + "/shorten?";
                    req += "login="******"&apiKey=" + BitlyApiKey + "&format=txt" + "&longUrl=" + srcUrl;
                    if (!string.IsNullOrEmpty(bitlyId) && !string.IsNullOrEmpty(bitlyKey))
                    {
                        req += "&x_login="******"&x_apiKey=" + bitlyKey;
                    }

                    if (converterType == UrlConverter.Jmp)
                    {
                        req += "&domain=j.mp";
                    }

                    if (!(new HttpVarious()).GetData(req, null, ref content))
                    {
                        return("Can't convert");
                    }
                }

                break;

            case 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, ref content))
                    {
                        return("Can't convert");
                    }
                }

                if (!content.StartsWith("http://ux.nu/"))
                {
                    return("Can't convert");
                }

                break;
            }

            // 変換結果から改行を除去
            content = content.TrimEnd(new[] { '\r', '\n' });

            // 圧縮の結果逆に長くなった場合は圧縮前のURLを返す
            if (src.Length < content.Length)
            {
                content = src;
            }

            return(content);
        }
예제 #2
0
        public static string Resolve(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return(orgData);
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var urlList = new List <string>();
            var m       = Regex.Matches(orgData, "<a href=\"(?<svc>http://.+?/)(?<path>[^\"]+)?\"", RegexOptions.IgnoreCase);

            foreach (Match orgUrlMatch in m)
            {
                var orgUrl     = orgUrlMatch.Result("${svc}");
                var orgUrlPath = orgUrlMatch.Result("${path}");
                if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1) &&
                    !urlList.Contains(orgUrl + orgUrlPath) && orgUrl != "http://twitter.com/")
                {
                    if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co"))
                    {
                        continue;
                    }

                    lock (LockObj)
                    {
                        urlList.Add(orgUrl + orgUrlPath);
                    }
                }
            }

            foreach (string orgUrl in urlList)
            {
                if (UrlCache.ContainsKey(orgUrl))
                {
                    try
                    {
                        orgData = orgData.Replace("<a href=\"" + orgUrl + "\"", "<a href=\"" + UrlCache[orgUrl] + "\"");
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
                else
                {
                    try
                    {
                        // urlとして生成できない場合があるらしい
                        var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                        var httpVar   = new HttpVarious();
                        var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                        if (retUrlStr.StartsWith("http"))
                        {
                            // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                            retUrlStr = retUrlStr.Replace("\"", "%22");
                            orgData   = orgData.Replace("<a href=\"" + tmpurlStr, "<a href=\"" + retUrlStr);
                            lock (LockObj)
                            {
                                if (!UrlCache.ContainsKey(orgUrl))
                                {
                                    UrlCache.Add(orgUrl, retUrlStr);
                                }
                            }
                        }
                    }
                    catch (Exception)
                    {
                        // Through
                    }
                }
            }

            return(orgData);
        }
예제 #3
0
        public static string ResolveMedia(string orgData, bool tcoResolve)
        {
            if (!isResolve)
            {
                return(orgData);
            }

            lock (LockObj)
            {
                if (UrlCache.Count > 500)
                {
                    // 定期的にリセット
                    UrlCache.Clear();
                }
            }

            var m = Regex.Match(orgData, "(?<svc>https?://.+?/)(?<path>[^\"]+)?", RegexOptions.IgnoreCase);

            if (!m.Success)
            {
                return(orgData);
            }

            var orgUrl     = m.Result("${svc}");
            var orgUrlPath = m.Result("${path}");

            if ((isForceResolve || Array.IndexOf(ShortUrlServices, orgUrl) > -1) && orgUrl != "http://twitter.com/")
            {
                if (!tcoResolve && (orgUrl == "http://t.co/" || orgUrl == "https://t.co/"))
                {
                    return(orgData);
                }

                orgUrl += orgUrlPath;
                if (UrlCache.ContainsKey(orgUrl))
                {
                    return(orgData.Replace(orgUrl, UrlCache[orgUrl]));
                }

                try
                {
                    // urlとして生成できない場合があるらしい
                    var tmpurlStr = new Uri(MyCommon.GetUrlEncodeMultibyteChar(orgUrl)).GetLeftPart(UriPartial.Path);
                    var httpVar   = new HttpVarious();
                    var retUrlStr = MyCommon.GetUrlEncodeMultibyteChar(httpVar.GetRedirectTo(tmpurlStr));
                    if (retUrlStr.StartsWith("http"))
                    {
                        // ダブルコーテーションがあるとURL終端と判断されるため、これだけ再エンコード
                        retUrlStr = retUrlStr.Replace("\"", "%22");
                        lock (LockObj)
                        {
                            if (!UrlCache.ContainsKey(orgUrl))
                            {
                                UrlCache.Add(orgUrl, orgData.Replace(tmpurlStr, retUrlStr));
                            }
                        }

                        return(orgData.Replace(tmpurlStr, retUrlStr));
                    }
                }
                catch (Exception)
                {
                    return(orgData);
                }
            }

            return(orgData);
        }