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