Skip to content

Instantly share code, notes, and snippets.

@sajidmohammed88
Last active September 6, 2022 11:21
Show Gist options
  • Save sajidmohammed88/670f57377836cb89eb01518774d27cd4 to your computer and use it in GitHub Desktop.
Save sajidmohammed88/670f57377836cb89eb01518774d27cd4 to your computer and use it in GitHub Desktop.
Get repos details from API cloud bitbucket.

1 - Create Key and Secret

Go to Picture Account => workspace => Setting => APPS AND FEATURES => OAuth consumers => Add Customer. https://support.atlassian.com/bitbucket-cloud/docs/use-oauth-on-bitbucket-cloud/#Create-a-consumer

$ curl -X POST -u "client_id:secret" \
  https://bitbucket.org/site/oauth2/access_token -d grant_type=password \
  -d username={username} -d password={password}

Call the API to Get the Token :

/// <summary>
/// Generate token.
/// </summary>
/// <param name="refreshToken">The refresh token.</param>
/// <returns>The token.</returns>
private static async Task<Token> GetToken( string refreshToken)
{
    using var httpClient = new HttpClient();
    using var request = new HttpRequestMessage(new HttpMethod("POST"), "https://bitbucket.org/site/oauth2/access_token");

    var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("f6vHJv9Mwf2QECNAuY:tuBstxeBRYJbaPFL4hVKKjFupRm3WnFS"));// key:secret
    request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

    var contentList = !string.IsNullOrEmpty(refreshToken)
        ? new List<string> 
        { 
            "grant_type=refresh_token", 
            $"refresh_token={refreshToken}" 
        }
        : new List<string>
        {
            "grant_type=password",
            "username=mohammed_sajid",
            "password=***************"
        };

    request.Content = new StringContent(string.Join("&", contentList));
    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");

    var response = await httpClient.SendAsync(request);
    var res = await response.Content.ReadAsStringAsync();
    return JsonConvert.DeserializeObject<Token>(await response.Content.ReadAsStringAsync());
}

Call the API to repositories details

/// <summary>
/// Get repositories
/// </summary>
/// <param name="token">The token.</param>
/// <returns>The repositories name.</returns>
private static async Task<IList<string>> GetRepos(string token)
{
    var request = WebRequest.Create("https://api.bitbucket.org/2.0/repositories/mohammed_sajid?role=admin") as HttpWebRequest;//mohammed_sajid => workspace id

    request.Headers.Add("Authorization", $"Bearer {token}");
    using var response = await request.GetResponseAsync().ConfigureAwait(false) as HttpWebResponse;

    Stream stream = response.GetResponseStream();
    string jsonRepo = new StreamReader(stream).ReadToEnd();

    JObject obj = JObject.Parse(jsonRepo);
    return obj.SelectToken("$.values").Select(o => o.SelectToken("slug").ToString()).ToList();
}

Token class :

public class Token
{
    [JsonProperty("access_token")]
    public string AccesToken { get; set; }

    [JsonProperty("refresh_token")]
    public string RefreshToken { get; set; }
}

The Main function.

static async Task Main(string[] args)
{
    try
    {
        // Get token from key/secret
        Token token = await GetToken(null).ConfigureAwait(false);

        // get repos
        IList<string> repos = await GetRepos(token.AccesToken).ConfigureAwait(false);

        Console.WriteLine(string.Join(", ", repos));
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment