【问题标题】:Nuget package for bitly to shorten the links用于缩短链接的 Nuget 包
【发布时间】:2015-10-07 21:18:28
【问题描述】:

我需要在 C# 中使用 bitly 来缩短链接。有没有为此的nuget包? 谁能提供我的代码以便我可以使用它。

【问题讨论】:

    标签: .net bit.ly


    【解决方案1】:

    查看https://www.nuget.org/packages/BitlyAPI/ 或直接调用 bit.ly api。该 API 非常易于使用和使用。

    public string Shorten(string longUrl, string login, string apikey)
    {
        var url = string.Format("http://api.bit.ly/shorten?format=json&version=2.0.1&longUrl={0}&login={1}&apiKey={2}", HttpUtility.UrlEncode(longUrl), login, apikey);
    
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        try
        {
            WebResponse response = request.GetResponse();
            using (Stream responseStream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                JavaScriptSerializer js = new JavaScriptSerializer();
                dynamic jsonResponse = js.Deserialize<dynamic>(reader.ReadToEnd());
                string s = jsonResponse["results"][longUrl]["shortUrl"];
                return s;
            }
        }
        catch (WebException ex)
        {
            WebResponse errorResponse = ex.Response;
            using (Stream responseStream = errorResponse.GetResponseStream())
            {
                StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                String errorText = reader.ReadToEnd();
                // log errorText
            }
            throw;
        }
    }
    

    您可以通过此链接https://bitly.com/a/your_api_key从 bit.ly 获取您的登录名和 apikey

    【讨论】:

    • 有时我会收到错误:403 - RATE_LIMIT_EXCEEDED。 ApiKey 已弃用。
    • @Kiquenet 我只是偶然发现了这个评论,你是对的。我正在开发本周应该发布的新版本 API V4。我是链接 nuget 包的作者。
    【解决方案2】:

    我在使用 Nuget 包 Bitly.Net 时遇到问题,所以我在上面实现了 @devfunkd 的解决方案。但是我在 Azure see this related link 上仍然遇到同样的问题,所以我不得不开发一个稍微不同的解决方案。

    按照 bit.ly 支持的建议,我的解决方案使用 fixed OAuth Token 进行身份验证。它在 Azure 上工作,并具有不会像旧的“登录”/“apiKey”那样贬值的优点。如果这对某人有用,这里的代码是based on @devfunkd ,但更新为:

    • 使用固定的 OAuth 令牌进行验证。
    • 使用 bit.ly 的 V3 API,它具有更好的 json 格式。
    • 它使用了我主要使用的Json.NET json反序列化器。
    • 我将其设为异步,因为我的系统其余大部分都是异步的。

    请注意,在代码中,_bitlyToken 字段应包含通过转到this page 创建的令牌。 _logger 变量包含某种记录器,因此不会丢失错误。

    public async Task<string> ShortenAsync(string longUrl)
    {
        //with thanks to @devfunkd - see https://stackoverflow.com/questions/31487902/nuget-package-for-bitly-to-shorten-the-links
    
        var url = string.Format("https://api-ssl.bitly.com/v3/shorten?access_token={0}&longUrl={1}",
                _bitlyToken, HttpUtility.UrlEncode(longUrl));
    
        var request = (HttpWebRequest) WebRequest.Create(url);
        try
        {
            var response = await request.GetResponseAsync();
            using (var responseStream = response.GetResponseStream())
            {
                var reader = new StreamReader(responseStream, Encoding.UTF8);
                var jsonResponse = JObject.Parse(await reader.ReadToEndAsync());
                var statusCode = jsonResponse["status_code"].Value<int>();
                if (statusCode == (int) HttpStatusCode.OK)
                    return jsonResponse["data"]["url"].Value<string>();
    
                //else some sort of problem
                _logger.ErrorFormat("Bitly request returned error code {0}, status text '{1}' on longUrl = {2}",
                    statusCode, jsonResponse["status_txt"].Value<string>(), longUrl);
                //What to do if it goes wrong? I return the original long url
                return longUrl;
            }
        }
        catch (WebException ex)
        {
            var errorResponse = ex.Response;
            using (var responseStream = errorResponse.GetResponseStream())
            {
                var reader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
                var errorText = reader.ReadToEnd();
                // log errorText
                _logger.ErrorFormat("Bitly access threw an exception {0} on url {1}. Content = {2}", ex.Message, url, errorText);
            }
            //What to do if it goes wrong? I return the original long url
            return longUrl;
        }
    }
    

    我希望对某人有所帮助。

    【讨论】:

    • 有时我会收到错误:403 - RATE_LIMIT_EXCEEDED。
    • 这是bitly的限制。
    • 使用 Newtonsoft.Json.Linq;
    【解决方案3】:

    其他答案很好,但示例代码将不再工作 https://www.nuget.org/packages/BitlyAPI/4.0.0 已更新,因此您可以使用它或在 github https://github.com/doublej42/BitlyAPI 中查看它的代码

    【讨论】:

      【解决方案4】:
          public static async Task<string> ShortenUrl(string url)
          {
              string _bitlyToken = my token;
              HttpClient client = new HttpClient();
      
              HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post,
                  "https://api-ssl.bitly.com/v4/shorten")
              {
                  Content = new StringContent($"{{\"long_url\":\"{url}\"}}",
                                                  Encoding.UTF8,
                                                  "application/json")
              };
      
              try
              {
                  request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _bitlyToken);
      
                  var response = await client.SendAsync(request).ConfigureAwait(false);
      
                  if (!response.IsSuccessStatusCode)
                      return string.Empty;
      
                  var responsestr = await response.Content.ReadAsStringAsync();
      
                  dynamic jsonResponse = JsonConvert.DeserializeObject<dynamic>(responsestr);
                  return jsonResponse["link"];
              }
              catch (Exception ex)
              {
                  return string.Empty;
              }
          }
      

      这个正在使用 V4

      【讨论】:

      【解决方案5】:

      这个使用bit.ly API v4:

      using System.Collections.Generic;
      using RestSharp;
      using Newtonsoft.Json.Linq;
      
      private static string API_KEY = Environment.GetEnvironmentVariable("BITLY_ACCESS_TOKEN");
      private static string API_URL = "https://api-ssl.bit.ly/v4";
      
      private static string Shorten(string longUrl)
      {
          var client = new RestClient(API_URL);
          var request = new RestRequest("shorten");
          request.AddHeader("Authorization", $"Bearer {API_KEY}");
          var param = new Dictionary<string, string> {
              { "long_url", longUrl }
          };
          request.AddJsonBody(param);
          var response = client.Post(request);
          string content = response.Content;
          // WriteLine(content);
          JObject d = JObject.Parse(content);
          var result = (string)d["id"];
          return result;
      }
      

      必需的第 3 方包:Newtonsoft.Json、RestSharp。我也做了一个 GitHub 项目,见这里:https://github.com/jabbalaci/CsUrlShortener。

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 2021-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多