Slackbot 구축을 통해 API-1 부분을 학습하는 방법
프로젝트 개요는 다음과 같습니다.
fullcode
객관적
이 버전에서 나의 목적은 다음과 같다.
리소스 이해
이 리소스만 있으면 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)
아이고!이 지루한 게시물을 읽어 주셔서 감사합니다.너 정말 대단해!나는 자신의 지식으로 기술 업무를 설명했는데, 만약 정확하지 않다면 나에게 알려 주세요.
비비
Reference
이 문제에 관하여(Slackbot 구축을 통해 API-1 부분을 학습하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/totorosyd/how-i-m-learning-about-apis-by-building-a-slackbot-part-1-2hmf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
간단한 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)
아이고!이 지루한 게시물을 읽어 주셔서 감사합니다.너 정말 대단해!나는 자신의 지식으로 기술 업무를 설명했는데, 만약 정확하지 않다면 나에게 알려 주세요.
비비
Reference
이 문제에 관하여(Slackbot 구축을 통해 API-1 부분을 학습하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/totorosyd/how-i-m-learning-about-apis-by-building-a-slackbot-part-1-2hmf
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# some code
if message.get('bot_id') is None .....:
# some code
# 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)
Reference
이 문제에 관하여(Slackbot 구축을 통해 API-1 부분을 학습하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/totorosyd/how-i-m-learning-about-apis-by-building-a-slackbot-part-1-2hmf텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)