OSDN Git Service

SettingCommon.xml に bit.ly のアクセストークンの項目を追加
authorKimura Youichi <kim.upsilon@bucyou.net>
Fri, 28 Apr 2017 17:00:47 +0000 (02:00 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Fri, 28 Apr 2017 18:43:04 +0000 (03:43 +0900)
アクセストークンが設定されている場合は API キーより優先して使用する

OpenTween/Api/BitlyApi.cs
OpenTween/Setting/SettingCommon.cs
OpenTween/ShortUrl.cs
OpenTween/Tween.cs

index b8993e4..4dcb73e 100644 (file)
@@ -34,6 +34,8 @@ namespace OpenTween.Api
     {
         public static readonly Uri ApiBase = new Uri("https://api-ssl.bitly.com/");
 
+        public string EndUserAccessToken { get; set; }
+
         public string EndUserLoginName { get; set; }
         public string EndUserApiKey { get; set; }
 
@@ -54,8 +56,6 @@ namespace OpenTween.Api
         {
             var query = new Dictionary<string, string>
             {
-                ["login"] = this.EndUserLoginName,
-                ["apiKey"] = this.EndUserApiKey,
                 ["format"] = "txt",
                 ["longUrl"] = srcUri.OriginalString,
             };
@@ -63,18 +63,26 @@ namespace OpenTween.Api
             if (!string.IsNullOrEmpty(domain))
                 query["domain"] = domain;
 
-            var uri = new Uri(ApiBase, "/v3/shorten?" + MyCommon.BuildQueryString(query));
-            using (var response = await this.http.GetAsync(uri).ConfigureAwait(false))
-            {
-                response.EnsureSuccessStatusCode();
+            var uri = new Uri("/v3/shorten", UriKind.Relative);
+            var responseText = await this.GetAsync(uri, query).ConfigureAwait(false);
 
-                var result = await response.Content.ReadAsStringAsync()
-                    .ConfigureAwait(false);
+            if (!Regex.IsMatch(responseText, @"^https?://"))
+                throw new WebApiException("Failed to create URL.", responseText);
+
+            return new Uri(responseText.TrimEnd());
+        }
 
-                if (!Regex.IsMatch(result, @"^https?://"))
-                    throw new WebApiException("Failed to create URL.", result);
+        public async Task<string> GetAsync(Uri endpoint, IEnumerable<KeyValuePair<string, string>> param)
+        {
+            var paramWithToken = param.Concat(this.CreateAccessTokenParams());
+
+            var requestUri = new Uri(new Uri(ApiBase, endpoint), "?" + MyCommon.BuildQueryString(paramWithToken));
 
-                return new Uri(result.TrimEnd());
+            using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
+            using (var response = await this.http.SendAsync(request).ConfigureAwait(false))
+            {
+                return await response.Content.ReadAsStringAsync()
+                    .ConfigureAwait(false);
             }
         }
 
@@ -109,5 +117,22 @@ namespace OpenTween.Api
 
             return false;
         }
+
+        private IEnumerable<KeyValuePair<string, string>> CreateAccessTokenParams()
+        {
+            if (string.IsNullOrEmpty(this.EndUserAccessToken))
+            {
+                return new[]
+                {
+                    new KeyValuePair<string, string>("login", this.EndUserLoginName),
+                    new KeyValuePair<string, string>("apiKey", this.EndUserApiKey),
+                };
+            }
+
+            return new[]
+            {
+                new KeyValuePair<string, string>("access_token", this.EndUserAccessToken),
+            };
+        }
     }
 }
index 8abdaf7..33fe841 100644 (file)
@@ -196,6 +196,10 @@ namespace OpenTween
         public bool GetFav = true;
         public string BilyUser = "";
         public string BitlyPwd = "";
+
+        /// <summary>Bitly API アクセストークン</summary>
+        public string BitlyAccessToken { get; set; } = "";
+
         public bool ShowGrid = false;
         public bool UseAtIdSupplement = true;
         public bool UseHashSupplement = true;
index b3ee02d..4f12642 100644 (file)
@@ -65,6 +65,7 @@ namespace OpenTween
         /// </summary>
         public int PurgeCount { get; set; }
 
+        public string BitlyAccessToken { get; set; }
         public string BitlyId { get; set; }
         public string BitlyKey { get; set; }
 
@@ -447,11 +448,12 @@ namespace OpenTween
             // 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))
+            if (!string.IsNullOrEmpty(this.BitlyAccessToken) && (string.IsNullOrEmpty(this.BitlyId) || string.IsNullOrEmpty(this.BitlyKey)))
                 return srcUri;
 
             var bitly = new BitlyApi
             {
+                EndUserAccessToken = this.BitlyAccessToken,
                 EndUserLoginName = this.BitlyId,
                 EndUserApiKey = this.BitlyKey,
             };
index 245444f..998b739 100644 (file)
@@ -811,6 +811,7 @@ namespace OpenTween
             tw.AllAtReply = SettingManager.Common.AllAtReply;
             AllrepliesToolStripMenuItem.Checked = tw.AllAtReply;
             ShortUrl.Instance.DisableExpanding = !SettingManager.Common.TinyUrlResolve;
+            ShortUrl.Instance.BitlyAccessToken = SettingManager.Common.BitlyAccessToken;
             ShortUrl.Instance.BitlyId = SettingManager.Common.BilyUser;
             ShortUrl.Instance.BitlyKey = SettingManager.Common.BitlyPwd;
 
@@ -3731,6 +3732,7 @@ namespace OpenTween
                     tw.RestrictFavCheck = SettingManager.Common.RestrictFavCheck;
                     tw.ReadOwnPost = SettingManager.Common.ReadOwnPost;
                     ShortUrl.Instance.DisableExpanding = !SettingManager.Common.TinyUrlResolve;
+                    ShortUrl.Instance.BitlyAccessToken = SettingManager.Common.BitlyAccessToken;
                     ShortUrl.Instance.BitlyId = SettingManager.Common.BilyUser;
                     ShortUrl.Instance.BitlyKey = SettingManager.Common.BitlyPwd;
                     TwitterApiConnection.RestApiHost = SettingManager.Common.TwitterApiHost;