Slackbot 구축을 통해 API-2를 배우는 방법

내 버전을 계속해, 내 Hello Galaxy 버전을 완성했어.이 간행물은 Heybot의 Hello Galaxy 버전의 개발 과정과 내가 가장 좋아하는 도전 중 하나를 공유하기 위한 것이다. 공식 문서가 없기 때문에 나는 자신의 해결 방안(private\u 메타데이터 사용)을 찾았다.
전체 코드를 사용할 수 있습니다 here.

노선도





>> 섹션 3: 최종 버전 (다음)
나의 최초의 노선도를 되돌아보면 이것이 우리의 입장이다.

프레젠테이션



목표


이 버전에서 나의 목표는 다음과 같다.
  • 시험 계정과 영패 키를 만들어 BambooHR API를 연결합니다.
  • 내가 "안녕하세요"라고 말했을 때, 헤버트는 동작 옵션(버튼)으로 대답했다.
  • 내가 버튼을 눌러 서비스를 선택했을 때 heybot은 Modal을 통해 직원 ID를 물었다.
    헤버트는 답을 나에게 돌려주었다.
  • 리소스


    BambooHR API


    파일Documentation이 명확하고 질서정연하다.API는 활동(보고서, 로그인, 직원)별로 그룹화됩니다.
    고객을 위해 Heybot을 만들고 싶습니다. 그래서 저는 (1) 계정만 필요합니다. (주의: 계정은 7일 이내에만 유효합니다.) (2) 하위 영역은 제가 테스트 계정을 열 때 만든'mycompany'(우리 회사는monsterinc:D), (3) API 키 하나입니다. 저는 테스트 계정인'Settings'에서 만듭니다.
    API 키를 만드는 방법:

    API 키를 복사하여 주석에 저장하는 것이 좋습니다. 자주 사용해야 하기 때문입니다.
    주의해야 할 또 다른 중요한 사항은 * 머리의 AUTHORIZATION_토큰("기본 NDJim*****")입니다.

    Why do we need this?


    API 키를 사용하여 BambooHR에 직접 HTTP 요청을 보낼 수 없습니다.API 키를 인증 토큰으로 변환해야 합니다.
    Flask 응용 프로그램을 실행하기 전에 환경 변수 export AUTHORIZATION_TOKEN= "NDJim**********SLACK_TOKEN 와 같은 환경 변수 SLACK_SIGNING_SECRET 를 사용해야 합니다.

    How to use BambooHR API Key to find AUTHORIZATION TOKEN?


    API Reference 페이지로 이동하여 API를 선택하고 평가판을 선택합니다.

    과제 및 솔루션


    Slack API에서 올바른 문서 찾기


    Slack은 API를 계속 업그레이드하고 있기 때문에 일부 기능이나 방법은 사용을 중지하거나 사용하고 있지만 지원 자원은 사용되지 않습니다.
    HelloGalaxy 버전에서는 다음과 같은 구성이 필요합니다.
  • 버튼/메뉴/날짜 선택기를 포함하는 풍부한 텍스트 메시지
  • 모드.
    #1에 대해 느슨함 Blocks (블록 세트 생성기에서 지원하여 post에 따라 교체attachments를 도입했다.이번 업그레이드의 목적은 더 많은 상호작용 (투표, 버튼, 메뉴) 이나 풍부한 내용 (영상, 링크, 이미지) 을 지원하는 것이다.
  • 이것은 내가 Blocks로 구축한 조작 메시지이며 chat_postMessage() 방법을 통해 사용자에게 발송한다.

    너는 def understood_greeting(self, user) 아래에서 나의 Block payload here을 볼 수 있다.
    #2의 경우 Modal 에 따라 post 대체Dialogs.이 변화는 dialog.open() 방법의 은퇴를 초래했고 views.open() 방법을 도입하여 모드를 열 수 없었다 chat_postMessage() 또는 다른 일반적인 방법으로 열 수 없었다 Modal.

    요청 본문에서 내용을 가져옵니다. 내용 형식은 응용 프로그램/x-www-form-urlencoded


    일반적으로 사용Content-type = application/JSON은 매우 간단명료하다.우리는 request.data, request.get_data, request.json, request.get_json, application/x-www-form-urlencoded를 사용할 수 있다.request.databytestring 형식의 파일입니다.따라서 만약 우리가 block_actions (흔히 볼 수 있는 해결 방안) 을 사용한다면, 우리는 빈 문자열을 얻을 것이다.
    이것StackOverflow post은 전면적인 답안이다.나의 상세한 답안도 여기에 있다.다음은 신속하게 볼 수 있는 제 솔루션입니다.
    @ app.route('/slack/request_handler', methods=['POST'])
    def request_handler():
       # return an ImmutableMultiDict with 1 pair
       payload = request.form 
    
       # get value of key 'payload'
       a1 = payload['payload']  
    
       # Note that if you have single quotes as a part
       # of your keys or values, this will fail due to
       # improper character replacement.
       # Convert a string (representation of a Dict))
       # to a Dict
       a2 = json.loads(a1)
    
       # Get value of key "channel"
       channel = a2["channel"] 
       print(channel) 
       # {'id': 'D01ACC2E8S3', 'name': 'directmessage'}
    

    개인_메타데이터를 사용하여 보기_제출 부하의 제한을 해결합니다.


    참고: 단추를 누르면 channel_idpayload8이 action_id,view_submission 로 되돌아옵니다.모드가 종료(제출)되면 유효 하중block_actions이 전송됩니다.
    나는 view_submission 유효 하중과 GET 유효 하중here의 견본을 저장했다.

    Context:

    • A Modal appears to get Employee ID input from a user. Once the user provided the ID and clicked "Submit", a view_submission payload was sent to my server.
  • 저는 이 ID로 BambooHR로부터 답을 얻었습니다.
  • 사용자에게 회답하고 싶습니다.
  • Problem:


    올바른 함수를 호출하여 BambooHR에 action_id 요청을 보내고 올바른 템플릿 메시지를 구축하려면 Block 메시지를 만들 때 설정된 view_submission 메시지가 필요합니다.action_id 유효 하중이 없습니다channel_id.
    답변을 위해서는 view_submission 을 제공해야 합니다.channel_id 유효 하중이 없습니다private_metadata.

    Solution:


    Slack은 이 방면에 관한 공식 문서가 없습니다.그러나 나는 action_id 유효 부하에서 수신한 block_actions 를 저장하기 위해 channel_id 을 사용한다.
    Slack docprivate_metadata 에 저장하는 것을 권장합니다.

    Pseudocode



    Code


    # build view payload
    def get_employee_id_modal(self, channel_id, action_id):
        private_metadata = {
           "channel_id": channel_id,
           "action_id": action_id
        }
        # jsonify a dict into a string 
        # (required type for private_metadata)
        json_private_metadata = 
        json.dumps(private_metadata)
    
        # return a block
        return ({
          "type": "modal",
          "private_metadata": json_private_metadata,
          "callback_id": "employee_id_modal",
          [....]
          })
    
    읽어주셔서 감사합니다!
    비비

    좋은 웹페이지 즐겨찾기