Slackbot 구축을 통해 API-1 부분을 학습하는 방법

이것은 내가 정기 간행물에 발표한 하이버트의 Hello world 버전 개발 과정에 관한 글이다.나는 초보자의 관점에서 글을 쓸 것이다. 이렇게 하면 매우 길지만, 나는 다른 초보자들이 그것이 유용하다는 것을 발견할 수 있기를 바란다.
프로젝트 개요는 다음과 같습니다.
fullcode

객관적


이 버전에서 나의 목적은 다음과 같다.
  • heybot(백엔드가 내 노트북에 저장됨)을 Slack 서버
  • 에 연결
  • 내가 "안녕하세요"라고 말했을 때, 헤버트는 "안녕하세요"라고 대답했다.
  • 리소스 이해


    이 리소스만 있으면 Helloworld 버전을 구축하고 최종 버전으로 업그레이드할 수 있습니다.

    API에 대한 일반 지식


    병.


    서버가 없기 때문에 Flask를 사용하면 웹 서버를 만들 수 있습니다.Flask를 사용하면 웹 요청을 신속하게 처리할 수 있습니다(구성 필요 없음).

    한국


    Flask 덕분에 기술적으로 말하자면 내 맥 컴퓨터에 서버가 하나 있다.그러나 나는 여전히 다른 웹 서비스(서버)를 볼 수 없다. - 이런 상황에서 그들은 Slack과 BambooHR이다.
    기다리다왜?당신은 통상적으로 여전히 브라우저를 통해 이 서비스들을 방문하지 않습니까?
    좋다나는 그들의 고객 중의 하나이기 때문에 그들과 이야기할 수 있다.정적 주소 (도메인) 가 있는 공공 웹에서 볼 수 있습니다.그래서 나는 그들을 찾아서 언제든지 나를 위해 서비스를 제공할 수 있다.그들은 아무 데도 갈 수 없다.
    "하지만 다른 웹 서비스 (서버) 는 여전히 나를 볼 수 없습니다"로 돌아가서, 나는 Heybot을 서비스 제공 업체로 맡겼다.위의 설명에 의하면 만약에 내가'내 기업을 경영하고 싶다'고 생각한다면 나도 정적 주소가 필요하다.이것은 내가 다른 고객(다른 서비스 공급자(Slack, BambooHR) 또는 일반 사용자)에게 찾을 수 있는 공중파가 필요하다는 것을 의미한다.
    간단히 말하면,ngrok는 웹 서비스가 나를 볼 수 있고 찾을 수 있도록 터널을 만드는 데 도움을 주었다.그리고 그들이 나에게 요청을 보냈을 때,ngrok의 터널 덕분에 나는 이 요청을 받아들이고 회답할 수 있었다.

    느슨한 API


    웹 API, 이벤트 API 및 기타 API의 핵심 API가 몇 개 있습니다.

    Python 개발 키트-slackclient


    Slack은 서버와 함께 사용할 수 있도록 서로 다른 프로그래밍 언어를 위한 도구 패키지를 준비했습니다.

    Python 이완 이벤트 API 어댑터 - Python 이완 이벤트 API


    몇 시간 동안 인터넷으로 강좌와 문서를 조회하고 읽은 후에 Helloworld 버전을 구축하려면 Slack Events API 어댑터를 사용하는 것을 권장합니다.그것도 사용하기 쉽다.
    팁: RTM-실시간 메시징 API를 사용하는 튜토리얼을 발견할 수 있습니다.본 강좌에 따르면 "당신은 우리의 RTM API를 사용하여 웹소켓을 통해 유동식 전송 이벤트를 연결할 수 있습니다. 방화벽 뒤에 있고 Slack에서 전송된 웹 요청을 받을 수 없을 때만 RTM API를 사용하는 것을 권장합니다.⚠️ 기본 이완 응용 프로그램에는 RTM API가 적용되지 않습니다."회사 방화벽의 한계 때문에 RTM을 사용해야 하는 경우 Slack 응용 프로그램을 만들어 사용할 수 있습니다."

    한 걸음 한 걸음


    간단한 Slackbot을 만드는 데 도움이 되는 재료가 많습니다.그래서 나는 그들이 한 말을 되풀이하지 않을 것이다.반대로 나는 같은 절차를 따라 유용한 자료를 발견하고 발견한 것만 쓴다.
    ⚠️시작하기 전에 가상 환경을 설정하는 것을 기억하십시오.이것은 필수적이다.

    1. Slack 응용 프로그램 만들기


    이 단계는 Slack API 문서와 this step of this tutorial에서 간단합니다.

    2. 메시지 구축


    step 2 of this tutorial년에 그들은 복잡한 소식을 준비했지만 Helloworld 버전은 Heybot이 "안녕하세요"라고 말하기만 하면 된다.그래서 나는 이 단계를 뛰어넘었다.

    3. Slack의 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 응답 이완 이벤트


    이 단계는 하이버트를 살리는 관건이다.그것은 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']
    

    운영 체제란 무엇입니까?
    Python의 운영 체제 모듈은 운영 체제와 상호작용하는 함수를 제공합니다.이 경우 SLACK\uBOT\u영패와 SLACK\uSIGNING\u SECRET를 사용해야 합니다.그것들은 기밀이기 때문에 우리는 코드에서 그것들을 변수로 설정해서는 안 된다.환경 변수 (export 명령 사용) = > 코드를 공유하면 영패를 주지 않으면 아무도 볼 수 없습니다.따라서 운영체제는 환경 변수를 호출하는 데 도움이 된다.

    무엇이 json 모듈입니까?
    서버에서 전송/수신한 요청의 데이터는 JSON 객체입니다.JSON 분석이 필요합니다(Python에서 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 v2는 WebClient와 RTMClient를 분리합니다.Migration guide의 차이를 읽을 수 있습니다.
    ----------
    # Routing
    @app.route('/', methods=['POST', 'GET'])
    
    모든 기능은 이 노선을 따른다.
    Flask 문서에서 웹 사이트를 구축하는 데 사용되는 여러 개의 루트를 만들 수 있습니다. 그 중에서 여러 개의 페이지가 있고 각 페이지마다 경로가 있습니다.우리는 슬랙에서 보내는 요청을 처리할 수 있는 단점만 있으면 채팅 로봇을 구축하고 있다.
    ----------
    # 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)
    
    아이고!이 지루한 게시물을 읽어 주셔서 감사합니다.너 정말 대단해!나는 자신의 지식으로 기술 업무를 설명했는데, 만약 정확하지 않다면 나에게 알려 주세요.
    비비

    좋은 웹페이지 즐겨찾기