Use slack's API to display active members in a specific channel of slack in python by skipping specific mentions on slackbot.
Execution result

It is like this. Since it contains personal information, I hide some of it. Let's do it! !!
├───.gitignore                                 
├───.env                                
├───requirements.txt             
├───Procfile           
│───plugins
│   └───my_mention.py                          #This file is mainly used.
│    └───__init__.py
│───run.py                  
│───settings.py           
│───slackbot_settings.py
└───README.md                      
my_mention.py
from slackbot.bot import respond_to
import requests
import random
import sys
sys.path.append('..')
import settings
CHANNEL_ID = settings.CHANNEL_ID
SLACK_API_TOKEN = settings.SLACK_API_TOKEN
@respond_to('')
def main(message):
    url = 'https://slack.com/api/channels.info?token={0}&channel={1}&pretty=1'.format(SLACK_API_TOKEN, CHANNEL_ID)
    response = requests.get(url).json()
    channel_info = response["channel"]
    member_id = channel_info["members"]
    member_id_list = [id for id in member_id]
    name_active_dict = member(member_id_list)
    active_member = []
    for key, value in name_active_dict.items():
        if value == 'active':
            active_member.append(key)
    active_member = random.sample(active_member, len(active_member))
    member_text = ''
    for i, active_name in enumerate(active_member):
        member_text = member_text + '{} : {}\n'.format(i+1, active_name)
            
    message.reply(member_text)
def member(member_id_list):
    member_dict = {}
    user_list = []
    is_active_list = []
    for name_id in member_id_list:
        user_url = 'https://slack.com/api/users.info?token={0}&user={1}&pretty=1'.format(SLACK_API_TOKEN, name_id)
        active_user_url = 'https://slack.com/api/users.getPresence?token={0}&user={1}&pretty=1'.format(SLACK_API_TOKEN, name_id)
        user_response = requests.get(user_url).json()
        active_user_response = requests.get(active_user_url).json()
        user_list.append(user_name(user_response))
        is_active_list.append(is_active_user(active_user_response))
    for user, active in zip(user_list, is_active_list):
        member_dict[user] = active
    
    return member_dict
def user_name(user_response_json):
    user = user_response_json["user"]
    user_profile = user["profile"]
    name = user_profile["real_name"]
    return name
def is_active_user(active_user_response_json):
    is_active = active_user_response_json["presence"]
    return is_active
slackbot_settings.py
import settings
API_TOKEN = settings.API_TOKEN
DEFAULT_REPLY = 'Let's decide the members!'
PLUGINS = ['plugins']
settings.py
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
SLACK_API_TOKEN = os.environ.get("SLACK_API_TOKEN")
API_TOKEN = os.environ.get('API_TOKEN')
CHANNEL_ID = os.environ.get('CHANNEL_ID')
run.py
from slackbot.bot import Bot
def main():
    bot = Bot()
    bot.run()
if __name__ == '__main__':
    main()
Procfile
worker: python run.py
runtime.txt
python-3.6.0
requirements.txt
slackbot==0.5.3
It's pretty easy to do. Let's make effective use of slackbot! !!
Recommended Posts