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); }
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); }
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); }