どのように私はスラックボットを構築することによってAPIについて学んでいる-第2部


私のバージョンを続けて、私はHellogalaticバージョンを完了しました.この論文の記事はHeybotのHellogalCamバージョンの開発プロセスと、公式ドキュメントがない私の大好きな課題の1つを共有することです.
私の完全なコードが利用可能ですhere .

ロードマップ





>パート3:最終版(次に来る)
私の最初のロードマップから思い出して、これは我々が立っているところです.

デモ



目的


このバージョンでは、私の目標は
  • トライアルアカウントとトークンキーを作成することにより、Bamboohr APIに接続します.
  • “hello”と言うと、Heybotはアクションオプション(ボタン)で答えます.
  • サービスを選択するボタンをクリックすると、従業員IDのためのheybotアシスModal .
    heybotは、私に対する答えを返します.
  • 資源


    バンブーAPI


    The Documentation 明確であり、よく整理APIは、活動(レポート、ログイン、従業員)によって分類されます.
    私は1つの単一の顧客のためにHeybotを構築したかったので、私が必要としたすべては(1)アカウント(注意:トライアルアカウントは7日間のみ有効です)、(2)サブドメインは私が私の試用アカウント(私の会社Monsterinc : D)を開いたときに作成された“Mycompany”です、(3)私は私の試用アカウント“設定”から作ったAPIキー.
    APIキーの作成方法

    APIキーをコピーしてノートに保存することを勧めます.
    注意しなければならないもう一つの重要なことは、AuthorizationCacheトークン(「基本的なNndjim EyeClipAttribute **」)です.

    Why do we need this?


    私たちは直接MamboohrにHTTP要求を送るためにAPIキーを使用することができません.APIキーを認証トークンに変換する必要があります.
    フラスコアプリを実行する前に、我々はする必要がありますexport AUTHORIZATION_TOKEN= "NDJim********** 環境変数(私がしたことと似ています)SLACK_TOKEN and SLACK_SIGNING_SECRET ここで説明しました.

    How to use BambooHR API Key to find AUTHORIZATION TOKEN?


    に移動API Reference ページとAPIを選択し、“それを試してください”.

    課題と解決


    スラック詐欺APIの上で正しい文書を見つけてください


    スラックはAPIをアップグレードしました、そして、そのため、いくつかの特徴または方法は中止されたか、まだ使われていました、しかし、彼らのサポート資源は非難されませんでした.
    HellogalCityバージョンでは、ビルドする必要がありました.
  • ボタンを含むリッチテキストメッセージ/メニュー/日付ピッカー
  • モーダル.
    スラック1号、スラック紹介 Blocks (ブロックキットビルダーのサポートattachments これによればpost . このアップグレードの目的は、よりインタラクティブな機能(投票、ボタン、メニュー)またはリッチコンテンツ(ビデオ、リンク、画像)をサポートすることです.
  • これは私のアクションメッセージですBlocks そして、chat_postMessage() メソッド.

    あなたは私の見ることができますBlock payload heredef understood_greeting(self, user) .
    - 1Modal 置換Dialogs これによればpost . この変更により引退した dialog.open() 方法と導入 views.open() モーダルを開く方法chat_postMessage() または他の規則的な方法Modal ).

    content type = application / x - www - form - urlencodedでリクエスト本文からコンテンツを取得する


    通常、Content-type = application/JSON 非常に簡単で簡単です.私たちはrequest.data , request.get_data , request.json , request.get_json .application/x-www-form-urlencoded はByteString型ファイルです.それで、我々が使うならばrequest.data (共通の解決策)空の文字列を取得します.
    この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'}
    

    VisuateRangeメタデータを使用してViewCloud提出ペイロードの制限を解決する。


    注:ボタンをクリックすると、それはblock_actions を含むchannel_id , action_id . モードが閉じられるとき(提出される)とき、Aview_submission ペイロードが送信されます.
    サンプルを保存block_actions ペイロードview_submission ペイロード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.
  • 私は、bamboohrから答えを得るために、そのIDを使用しました.
  • 私はユーザーに返信したい.
  • Problem:


    正しい関数を呼び出すにはGET MambooHRを要求し、適切なテンプレートメッセージをビルドするには action_id 私が作成したときに設定Block メッセージ.view_submission ペイロードにはaction_id .
    返信するにはchannel_id 必須です.view_submission ペイロードにはchannel_id .

    Solution:


    これに関する公式文書はスラックからはなかった.しかし、私は private_metadata 保管するaction_id から受信block_actions ペイロード
    このSlack doc 推奨記憶channel_id インprivate_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",
          [....]
          })
    
    読書ありがとう!
    フェブ