[Python] Slack API를 사용하여 채널의 메시지를 한 번만 남기고 일괄 삭제해 보았습니다.

소개



사내에서 사용하는 #general 채널의 운영을 변경하게 되었기 때문에 메시지를 일괄 삭제해 달라고 했습니다. 한 건만 남기고 싶은 메시지가 있다는 것이었기 때문에, 한 건 남겨두고 삭제하는 코드를 작성했습니다.

환경



Visual Studio Code
Python3.9.1

준비



  • python-slackclient 설치
    터미널에서 다음 명령을 실행합니다.
    pip install slackclient
    
  • 사용자 토큰을 얻는 방법
    사용자 토큰을 얻으려면 앱을 만들어야 합니다.
    앱 작성은 아래의 기사를 참고로 했습니다.
    Slack API 권장 Token 정보
    앱을 만든 후 사용자 토큰을 얻을 수 있습니다.

    ※xoxp로 시작하는 사용자 토큰을 사용합니다.

  • 채널 ID 및 타임 스탬프를 얻는 방법
    대상 채널의 메시지 링크에서 채널 ID와 타임스탬프를 얻을 수 있습니다.

    예: https://xxxxxx.slack.com/archives/AAAAAAAAA/p1111111111000000
    "AAAAAAAAA"가 채널 ID, p를 제외한 "1111111111000000"이 메시지의 타임 스탬프가됩니다.
    ※API로 취득하는 타임 스탬프의 포맷은 "1111111111.000000"이므로 맞출 필요가 있습니다.

  • 사용 API 설명


  • chat.delete
    받은 타임스탬프의 메시지를 삭제합니다.
  • conversations.history
    메시지의 타임 스탬프를 가져옵니다.
  • conversations.replies
    thread의 타임 스탬프를 취득합니다.

  • 소스 코드


    import time 
    from slack import WebClient 
    
    # slackのユーザートークン  
    SLACK_CLIENT = WebClient('xoxpから始まるユーザートークン') 
    # メッセージ削除対象のチャンネル名  
    CHANNEL_ID ="AAAAAAAAA" 
    # 削除したくないメッセージのタイムスタンプ  
    NOT_DELETE_TS = "1111111111.000000" 
    
    def main():
        while True: 
            # 最新のメッセージ100件を取得する
            channel_history = SLACK_CLIENT.conversations_history(channel=CHANNEL_ID)
            print('メッセ-ジ取得件数: {}'.format(len(channel_history['messages'])))
            if len(channel_history['messages']) <= 1:
                print('メッセ-ジが1件になったので終了')
                break
            for messages in channel_history['messages']:
                print(f'対象メッセ-ジ: {messages}')
                if messages['ts'] == NOT_DELETE_TS:
                    print(f'スキップ対象メッセ-ジ: {messages}')
                    continue
                SLACK_CLIENT.chat_delete(channel=CHANNEL_ID, ts=messages['ts'])
                time.sleep(0.5) # 連続実行をさける
    
                if 'thread_ts' in messages:
                    thread_replies = SLACK_CLIENT.conversations_replies(channel=CHANNEL_ID, ts=messages['ts'])
                    for thread in thread_replies['messages']:
                        # メッセージのタイムスタンプは削除済みのためスキップする
                        if messages['ts'] == thread['ts']:
                            continue
                        SLACK_CLIENT.chat_delete(channel=CHANNEL_ID, ts=thread['ts'])
                        time.sleep(0.5) # 連続実行をさける
    
    if __name__ == '__main__':
        main()
    

    힘든 점



    "conversations.history"만으로는 메시지의 타임 스탬프 만 얻을 수 있었으므로 스레드를 삭제하는 데 어려움을 겪었습니다. API 목록에서 스레드 타임 스탬프를 얻을 수있는 것이 없을까 찾고 있다면 "conversations.replies"를 찾아 해결할 수있었습니다.

    끝에



    이번에 처음으로 Python과 Slack API를 사용하여 코드를 작성해 보았습니다. 파이썬에 흥미는 있었지만 업무에서는 사용할 기회가 없었기 때문에 써서 즐거웠습니다.

    참고 자료



    API 메소드 목록

    좋은 웹페이지 즐겨찾기