DEV Community

Cover image for using slack api to retrieve data
Ashley D
Ashley D

Posted on

using slack api to retrieve data

Disclaimer: This article provides a high-level overview of interacting with the Slack API from the perspective of a beginner who recently finished her 4-month bootcamp. The insights shared here are based on a mini-project and aim to guide those new to how to work with existing API- in this case Slack API integration. 🧡

Introduction

Recently, I overheard two of the mentors in my technical apprenticeship program conversing about what Slack channels we should join once we transition into a formal technical role, and they mentioned how there is no easy way to export Slack channels you are in to share with others.

As such, I embarked on a mini-project (repo) to build a Spring Boot application that could:

  • Retrieve both private and public Slack channels that a user is a member of, along with their details. This is super useful for onboarding new team members, giving them a comprehensive view of relevant channels.
  • Create a Slack command that new hires can use to quickly join essential public channels.

This project marked my first foray into data retrieval with an existing API, and as a beginner, I initially felt quite overwhelmed by where to start. However, after gaining some high-level insights and a better understanding of how to approach API documentation, I wanted to humbly share my learnings with the community. 🤗


Topics I Learned:

1. Slack API Library in Java

The Slack API library for Java is a powerful tool that allows developers to interact with Slack's platform programmatically. This means you can write Java code to perform actions on Slack, such as sending messages, retrieving channel information, managing users, and much more.

The Slack API library has several methods. In this project, I specifically used the conversations.list method provided by the Slack API. This method is designed to fetch a list of channels within a Slack workspace that a user is a part of.
Here's a simple example of how you can import the Slack API library in Java to list channels:

import com.slack.api.Slack;
import com.slack.api.methods.SlackApiException;
import com.slack.api.methods.request.conversations.ConversationsListRequest;
import com.slack.api.methods.response.conversations.ConversationsListResponse;

import java.io.IOException;

public class SlackChannelLister {
// code here
Enter fullscreen mode Exit fullscreen mode

2. Token Management

In the context of APIs, a token is a piece of information used to authenticate and authorize your requests. For Slack, this token allows your application to access and interact with Slack's data and functionalities, such as retrieving channel information.

To get your Slack API token, follow these steps:

  1. Create a Slack App: Go to the Slack API Apps page and click "Create New App."
  2. Install the App: Install the app to your workspace to generate a token. This token is what you’ll use to authenticate API requests.
  3. Store the Token Securely: For security reasons, avoid hardcoding your token directly into your code. Instead, use environment variables to manage sensitive information.

^ In IntelliJ, you can access that setting from the Run menu and select Edit Configurations.
Then in your Java code, you can use this line of code so that your application can read the environmental variable value at runtime.
String token = System.getenv("SLACK_TOKEN");

3. OAuth Scopes

Now that you have your token, it needs the appropriate permissions, or "scopes," attached to it.

Think of OAuth scopes as the permissions your app requests when it needs to interact with Slack API. These scopes specify exactly what your app is allowed to do within a Slack workspace:
You'll need to specify these scopes in the app configuration:

  1. Navigate to Your App's Settings: Go to your app's dashboard on the Slack API website.
  2. Select "OAuth & Permissions": Here, you'll see a list of scopes you can add.
  3. Add Required Scopes: It's a best practice to grant only the necessary permissions required for your app's functionality. As such, include the following scopes:
  • channels:read: Allows your app to read information about public channels that you are in .
  • groups:read:Allows your app to read information about private channels that are in.

4. Jsoup Library

Jsoup is a versatile Java library designed for working with real-world HTML. Using Jsoup ensures that any HTML content retrieved from APIs or user input is sanitized.
In the context of this project, Jsoup was used to clean and parse the "purpose" field of Slack channels. Sometimes, the purpose or topic of a channel may contain HTML tags or entities, and we want to extract just the plain text for display or processing purposes.

Here's an example how Jsoup can be utilized to clean HTML content:

import org.jsoup.Jsoup;
public class JsoupExample {
String htmlPurpose = "<p>Welcome to the <strong>development</strong> channel!</p>";`
    ….     
 // Parsing and cleaning the HTML content
String cleanedText = Jsoup.parse(htmlPurpose).text();

 System.out.println("Cleaned Up Purpose: " + cleanText);
 // Output: Cleaned Up Purpose: Welcome to the development channel!
    }
}
Enter fullscreen mode Exit fullscreen mode
  • Jsoup.parse(htmlPurpose): Parses the HTML string into a Jsoup Document object.
  • .text(): Extracts the plain text from the parsed HTML, stripping away all HTML tags.

6. limit Parameter

When working with APIs that return lists of data, such as channels or messages, it's common to control how much data is retrieved in a single request. This is because fetching too much data in a single request can slow down your application and consume unnecessary resources.

The limit parameter serves this exact purpose by specifying the maximum number of items to return.

ConversationsListRequest request = ConversationsListRequest.builder()
        .limit(200)
        .build();
Enter fullscreen mode Exit fullscreen mode

When dealing with larger datasets, you can also implement pagination by fetching data in chunks. You retrieve a set number of items per request and can request additional pages as needed.

A cursor is a pointer provided by Slack to fetch the next set of results. If there's more data, Slack provides a next_cursor value. You can use this next_cursor to make subsequent requests and continue retrieving data until you have processed the entire dataset. This method ensures that you handle large volumes of data efficiently without overwhelming your application or the API, and this also addresses rate limit issues.

7. .build() Builder Pattern

The .build() method is a fundamental part of the Builder Pattern in software design. This pattern provides a flexible and readable way to construct complex objects step by step.

In the context of Slack API requests, the builder pattern simplifies the creation of request objects, as you can see in the example below. This way we don’t have to write several lines and calling .set.

ConversationsListRequest request = ConversationsListRequest.builder()
        .token(System.getenv("SLACK_TOKEN")) 
        .types(Arrays.asList(ConversationType.PUBLIC_CHANNEL, ConversationType.PRIVATE_CHANNEL))
        .limit(100)
        .build();
Enter fullscreen mode Exit fullscreen mode
  • ConversationsListRequest.builder(): Initializes a new builder instance for creating a ConversationsListRequest object.
  • token(...): Sets the authentication token for the request.
  • types(...): Specifies the types of conversations to retrieve (public and private channels in this case).
  • limit(...): Sets the maximum number of channels to return.
  • .build(): Finalizes the construction and returns a fully configured ConversationsListRequest object ready to be used.

8. Leveraging API Documentation

API documentation is your comprehensive guide to understanding and effectively using an API. At first I wanted to take a shortcut and just check chatGPT, however that resulted in many rabbit holes of doing things the wrong way. Making sure you read the API documentation is key, as it offers the most up-to-date user guide, Here are a few highlights I found most helpful from Slack's API documentation.

  • Sample Code: The documentation provides starter code for interacting with their API endpoints in various languages such as Java, JavaScript, and Python. You can find this code on the sample code tab, which is a handy resource for getting started with your project.
  • Detailed Method Descriptions: Understand what each API method does, required parameters, and expected responses.
  • Sample Tester: The Slack API tester helps show how JSON responses from the API are formatted. You can see the exact structure of the data returned. This immediate feedback helps ensure your API requests are properly configured and your token is functioning as expected.

Top comments (0)