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


これはHeybotのHello World版の開発プロセスのための私の論文記事です.私は初心者の視点から書くので、それは長く(少し)することができますが、私は他の初心者が役に立つことを願っています.
プロジェクトの概要です.
fullcode

目的


このバージョンでは、
  • 接続HiYBOT(バックエンドは、ラップトップに格納されている)スラックサーバーに
  • 「こんにちは」と言うとき、Heybotは「こんにちは」と答える
  • 資源を知る


    これらのリソースは、私がHelloWorldバージョンを構築し、最終バージョンにアップグレードする必要があるすべてです.

    APIに関する一般知識


    フラスコ


    私はサーバーを持っていなかったので、フラスコを使用して、私のウェブサーバを作成できます.フラスコを使用すると迅速に(設定なし)のWeb要求を処理することができます.

    農業技術研究機構


    フラスコのおかげで、私は技術的に私のMac上でサーバーを持っています.しかし、私はまだ他のウェブサービス(サーバー)に見えません.
    待って!なぜ?通常、まだあなたのブラウザを介してこれらのサービスにアクセスできませんか?
    OK!私は彼らに“話”することができますので、私は彼らのクライアントの一つです.それらは、静的アドレス(ドメイン)でパブリックウェブに表示されます.それで、私は彼らを見つけることができます、私が望むときはいつでも、彼らにサービスを与えるよう頼みます.彼らはどこにも行かない.
    「しかし、私はまだ他のウェブサービス(サーバー)に見えません」に戻って、私はサービスプロバイダーとしてheybotを持ちます.上の説明によると、私のビジネスを実行したい場合は、静的なアドレスも必要です.これは、他のクライアント(他のサービスプロバイダ(スラック、MambooHR)または通常のユーザーであることができます)で見つけることができるパブリックアドレスを持つ必要があることを意味します.
    一言で言えば、Ngrokはトンネルを作成するのに役立ちます.そして、彼らが私に要求を送るとき、Ngrokのトンネルのおかげで、私は彼らの要求に応えて、応じることができます.

    スラックAPI


    彼らはいくつかのコアAPI - Web API、イベントAPIや他のAPIを持っている.

    Python用開発キット


    スラックいくつかのツールキットを別のプログラミング言語のサーバーで動作するように準備します.

    PythonのスラックイベントAPIアダプター


    インターネットブラウジングと読書チュートリアルとドキュメントの後、HelloWorld版を構築するために、スラックイベントAPIアダプターを使用することは推薦されて好ましいアプローチです.また、使いやすいです.
    ヒント:RTM -リアルタイムメッセージングAPIを使用していくつかのチュートリアルを見つけるかもしれません.このチュートリアルによると、あなたは、我々がRTM APIでWebSocket接続を通してイベントをストリームすることができます.⚠️ RTM APIは、デフォルトのスラックのアプリでは利用できません.場合は、企業のファイアウォールの制限のためにRTMを使用する必要がある場合は、古典的なスラックアプリケーションを作成することによって行うことができます.

    一歩一歩


    あなたがシンプルなslackbotを作成するための材料がたくさんあります.それで、私は彼らが言ったことを繰り返しません.代わりに、私は同じ手順に従って、私は有用な発見した材料にリンクし、私は私が考え出したものを書くだけです.
    ⚠️起動する前に、仮想環境を設定してください.それは絶対必要だ.

    1 .スラックアプリを作成する


    この手順はスラックAPIドキュメントでも簡単ですthis step of this tutorial .

    2 .メッセージのビルド


    インstep 2 of this tutorial , 彼らは複雑なメッセージを準備しました、しかし、HelloWorldバージョンはHeybotに「Hello」と言うだけを必要とします.それで、私はそのステップをスキップしました.

    スラックからURL検証チャレンジをパスする準備


    ngrokが生成したURLは、このテストに合格しなければなりません.
    リクエストを表示して何を持っているか確認する必要があります.私を信頼し、それはあなたに送信されているかを知って、多くの助けになります.

    def reply():
     # print(request.headers)
     # print(request.data)
     # print(request.args)
     # print(request.form)
     # print(request.endpoint)
     # print(request.method)
     # print(request.remote_addr)
    
     # get ready to receive and respond HTTP POST
     # request from Slack to verify bot's endpoint URL
     if request.method == 'POST':
      challenge_parse = (json.loads(request.data)) 
                       ['challenge']
      # print(challenge_parse)
      # respond URL verification from Slack  
      # with 'challenge' value
      response = {"challenge": challenge_parse}
      return response, 200
    

    スラックイベントへの3.1の応答


    このステップはHeybotを生かす鍵です.にありますstep 3 of this tutorial .
    解説
    # import dependencies to obtain the environment variable values
    import os 
    import slack
    from slackeventsapi import SlackEventAdapter
    import json
    from flask import Flask, request, jsonify
    
    # Import environment var by retrieving exported token https://slack.dev/python slackclient/auth.html
    SLACK_BOT_TOKEN = os.environ['SLACK_BOT_TOKEN']
    SLACK_SIGNING_SECRET = os.environ['SLACK_SIGNING_SECRET']
    

    OSとは
    PythonのOSモジュールはオペレーティングシステムと対話するための関数を提供します.この場合、私はSlackCard BottleトークンとSlackCount signingCone秘密を使わなければなりませんでした.それらは秘密ですので、コードの変数として設定するべきではありません.環境変数として使用しましたexport 私がコードを共有するならば、私が彼らにトークンを与えない限り、誰も見ることができません.それで、OSは環境変数を呼び出すのを助けます.

    JSONモジュールとは
    サーバが送受信するリクエストのデータはJSONオブジェクトです.私はJSONを解析する必要があります( Pythonでは、parse JSONはjson.loads )
    ----------
    # create the Flask server
    app = Flask(__name__)
    
    # Initialize a Slack Event Adapter for receiving actions 
    slack_events_adapter = SlackEventAdapter(SLACK_SIGNING_SECRET, '/slack/events', app)
    
    # Instantiate a Web API client
    slack_web_client = slack.WebClient(
    token=os.environ['SLACK_BOT_TOKEN'])
    
    SLackClient V 2は、WebClientとRtClientを切り離しました.この違いを読むことができますMigration guide .
    ----------
    # Routing
    @app.route('/', methods=['POST', 'GET'])
    
    すべての機能は、このルートの下に行きます.
    フラスコのドキュメントでは、複数のルートを作成し、複数のページを持っているウェブサイトを構築します.私たちはchatbotを構築しています、そして、我々はスラックから送られる1つの終点処理要求を必要とするだけです.
    ----------
    # When a user sends a DM, the event type will be
    # 'message'.
    # Link the message callback to the 'message' event.
    # Choose to use Event API (handled by
    # SlackEventAdapter) instead of RTM API.
    
    @slack_events_adapter.on("message")
    def say_hello(event_data):
         message = event_data['event']
    
         # if the incoming message contains "hello" 
         # NOT CASE SENSITIVE, respond with a message
         # check if the message is from a bot or not.  
         # If Yes, do nothing. If No, reply.
         if message.get('bot_id') is None and 'hello' 
         in ((message.get('text')).lower()):
              channel_id = message['channel']
              user = message['user']
              message = "Hello <@%s>! :tada:" % user
              slack_web_client.chat_postMessage 
              (channel=channel_id, text=message)
         else:
              return
    
    # Error events
    @slack_events_adapter.on("error")
    def error_handler(err):
         print("ERROR: " + str(err))
    
    slack_events_adapter.start(port=5000)
    
    このコードの構文はthis example , chat_postmessage メソッド.

    課題と解決


    heybotはメッセージとユーザのメッセージを区別できません


    そのため、ノンストップで返信します.

    ソリューションthis StackOverflow post は、最も関連性とよく説明されたが、それはソリューションチェックを言及subtype リクエストでevent , そこにはなかった.

    私の解決策はbot_id からevent .
    # some code
    if message.get('bot_id') is None .....:
    # some code
    

    [ errno 48 ]使用中のアドレス


    時々、ngrokを実行すると、このエラーが発生します.
    解決策はkill -9 , はnot very recommended しかし、それは働いた.
    # list of processes using the port if any 
    sudo lsof -i:5000   
    # or 
    ps -a 
    
    # use the id on the PID column to terminate the process use 
    kill (PID)
    
    # if the above doesnt solve the problem, use this. Not very recommended :D. 
    kill -9 (PID)
    
    フィル!この長いポストを読んでくれてありがとう.あなたは素晴らしいです!私は技術的な仕事を私自身の知識で説明したので、彼らが正しくないならば、どうか私に話してください.
    フェブ