Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7.5.5 슬랙으로 메시지 보내기 에러 질문드립니다. #46

Open
hamlsy opened this issue Feb 26, 2021 · 19 comments
Open

7.5.5 슬랙으로 메시지 보내기 에러 질문드립니다. #46

hamlsy opened this issue Feb 26, 2021 · 19 comments
Labels
good first issue Good for newcomers

Comments

@hamlsy
Copy link

hamlsy commented Feb 26, 2021

안녕하세요 책보고 따라하는 코딩 초보입니다. 슬랙 메시지 보내기 부분에서, 분명 똑같이 따라한 것 같은데 이러한 에러가 생겼습니다. ch07_07_Slack_SendMessage.py를 실행했을 때도 같은 에러가 생깁니다. 원인이 무엇인지 알려주시면 감사하겠습니다. 파이썬 버전은 3.8.1입니다.

from slacker import Slacker
slack = Slacker('xoxb-1779311309207-1791005363445-bsjbUr5aGKl8QlB3sJreZHKA')
slack.chat.post_message('#trading', 'hello')
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\82104\AppData\Local\Programs\Python\Python38\lib\site-packages\slacker_init_.py", line 498, in post_message
return self.post('chat.postMessage',
File "C:\Users\82104\AppData\Local\Programs\Python\Python38\lib\site-packages\slacker_init_.py", line 124, in post
return self.request(
File "C:\Users\82104\AppData\Local\Programs\Python\Python38\lib\site-packages\slacker_init
.py", line 102, in _request
raise Error(response.error)
slacker.Error: invalid_auth

@INVESTAR
Copy link
Owner

slacker.Error: invalid_auth

제일 마지막 에러 메시지를 보시면 유효하지 않은 권한이라고 나옵니다.
봇 사용자 토큰의 권한 쪽에 문제가 있는 것으로 보여지며
우선적으로는 아래 두가지 사항을 확인해 보시기 바랍니다.

  1. #trading 채널을 만드셨는지 확인해 보시기 바랍니다.

#trading 채널을 안 만드셨다면 #general 채널로 메시지를 보내보세요.
slack.chat.post_message('#general', 'hello')

  1. xoxb-문자열로 시작하는 봇 사용자 토큰을 새로 발급받으셔야 할 것 같습니다.

OAuth & Permissions을 설정하실 때 Bot Token Scope을
'chat:write'를 뿐만 아니라 최대한 많은 영역으로 설정해 보시기 바랍니다.

@hamlsy
Copy link
Author

hamlsy commented Feb 28, 2021

  1. #trading 채널은 존재했었습니다. 그리고 #general 채널로 메시지를 보냈을 때도 같은 오류가 생겼습니다.

  2. 봇 사용자 토큰을 새로 발급받고 시도한 것과, 아예 워크스페이스랑 앱을 다 지운 후 처음부터 시도했을 때도 같은 오류가 생겼습니다. write 관련 Permission들을 모두 설정했을 때도 마찬가지입니다. (슬랙 앱을 내려받아 시행도 해봤습니다.)

혹시 몰라 slackclient 2.9.3 pip을 설치하고 실행해봤는데 소용 없었습니다.

그래서 2.2.1 64비트 파이썬 설치 과정부터 잘못된 게 아닌가 하고 점검해봤지만 이상은 없어보입니다..도대체 무엇이 문제일까요?..

명령프롬프트와 VSCode 둘 다 실행한 결과입니다.

@INVESTAR
Copy link
Owner

혹시 처음에는 메시지가 잘 보내졌는데 어느 순간부터 메시지가 안보내지는 상황이라면
무료 계정에서 사용 가능한 메시지 전송량을 초과했기 때문에 슬랙 측에서 차단했을 가능성이 있습니다.
이 경우에는 어느 정도 기간이 지나면 차단이 풀렸던 것으로 기억합니다.

만일 slaker API를 이용해서 메시지를 한 번도 보낸적이 없고
1, 2 문제가 아니라면 저도 더 이상 어디를 봐야할지는 모르겠습니다.
다만, 저라면 마지막으로 기존에 발급받은 봇 사용자 토큰으로 다른 PC에서는 메시지가 보내지는지 추가로 확인해 보겠습니다.

@kulkuroo
Copy link

kulkuroo commented Mar 1, 2021

도움이 되시기를 바라며 제 경험을 공유하겠습니다.
저도 동일한 오류가 발생하여 애를 먹었습니다.

저는 여러 검색을 통해 아래와 같은 방식으로 진행했습니다.

  1. 슬랙 자체의 설정 오류 확인
  • 슬랙 로그인 하신 상태에서 https://api.slack.com/methods/chat.postMessage/test 페이지 접속
  • "Tester" 탭에서 "Argument" 필요한 것만 설정
  • Bot User OAuth Access Token을 "token" argument의 "Or, provide your own token:" 텍스트 박스에 입력
  • "channel" argument에 보내시고자 하는 채널명을 입력
  • "text" argument에 메시지 입력
  • "Test Method" 버튼 누름
  • 맨 아래 결과창 및 슬랙 채널에 메시지 도착 여부 확인
  1. 위 과정에 성공한 상태인데도 slacker 라이브러리로 안될 경우
  • webhook url 방식으로 사용 (curl/postman 등 웹 클라이언트로 보내는 방식은 잘 작동했습니다. 봇 설정 시 webhook url 설정필요)
  • slack_sdk 사용 (아래는 김황후 저자님 코드를 라이브러리 바꿔서 작성해 보았습니다)

attached.txt

@hamlsy
Copy link
Author

hamlsy commented Mar 1, 2021

처음부터 일어난 에러이고, 다른 PC에서 사용했음에도 같은 오류가 생겼습니다.. 계정 자체 오류인 것 같아 일단 기다려보기로 결정했습니다. 시간 내주셔서 정말 감사드립니다.

@hamlsy
Copy link
Author

hamlsy commented Mar 1, 2021

도움이 되시기를 바라며 제 경험을 공유하겠습니다.
저도 동일한 오류가 발생하여 애를 먹었습니다.

저는 여러 검색을 통해 아래와 같은 방식으로 진행했습니다.

  1. 슬랙 자체의 설정 오류 확인
  • 슬랙 로그인 하신 상태에서 https://api.slack.com/methods/chat.postMessage/test 페이지 접속
  • "Tester" 탭에서 "Argument" 필요한 것만 설정
  • Bot User OAuth Access Token을 "token" argument의 "Or, provide your own token:" 텍스트 박스에 입력
  • "channel" argument에 보내시고자 하는 채널명을 입력
  • "text" argument에 메시지 입력
  • "Test Method" 버튼 누름
  • 맨 아래 결과창 및 슬랙 채널에 메시지 도착 여부 확인
  1. 위 과정에 성공한 상태인데도 slacker 라이브러리로 안될 경우
  • webhook url 방식으로 사용 (curl/postman 등 웹 클라이언트로 보내는 방식은 잘 작동했습니다. 봇 설정 시 webhook url 설정필요)
  • slack_sdk 사용 (아래는 김황후 저자님 코드를 라이브러리 바꿔서 작성해 보았습니다)

저는 첨부된 코드로 책에 표시된 대로 메시지가 가는 것을 확인하였고, 질문자분에게도 도움이 되셨으면 좋겠습니다.
attached.txt

도움이 되시기를 바라며 제 경험을 공유하겠습니다.
저도 동일한 오류가 발생하여 애를 먹었습니다.

저는 여러 검색을 통해 아래와 같은 방식으로 진행했습니다.

  1. 슬랙 자체의 설정 오류 확인
  • 슬랙 로그인 하신 상태에서 https://api.slack.com/methods/chat.postMessage/test 페이지 접속
  • "Tester" 탭에서 "Argument" 필요한 것만 설정
  • Bot User OAuth Access Token을 "token" argument의 "Or, provide your own token:" 텍스트 박스에 입력
  • "channel" argument에 보내시고자 하는 채널명을 입력
  • "text" argument에 메시지 입력
  • "Test Method" 버튼 누름
  • 맨 아래 결과창 및 슬랙 채널에 메시지 도착 여부 확인
  1. 위 과정에 성공한 상태인데도 slacker 라이브러리로 안될 경우
  • webhook url 방식으로 사용 (curl/postman 등 웹 클라이언트로 보내는 방식은 잘 작동했습니다. 봇 설정 시 webhook url 설정필요)
  • slack_sdk 사용 (아래는 김황후 저자님 코드를 라이브러리 바꿔서 작성해 보았습니다)

저는 첨부된 코드로 책에 표시된 대로 메시지가 가는 것을 확인하였고, 질문자분에게도 도움이 되셨으면 좋겠습니다.
attached.txt

안녕하세요, 밤낮을 찾아보던 도중 kulkuroo 님의 답을 보고 희망을 가지고 실행을 해보았습니다.

우선 1. 의 Tester 탭에서 Argument를 필요한 것만 설정한다는 뜻이 무엇을 의미하는지 모르겠습니다. "Tester"탭을 보면 여러 "Argument"들과 Value 값을 입력하는 칸이 나오는데, 어떻게 설정한다는 것인지 모르겠습니다.

그리고 "Or, provide your own token:" 텍스트 박스에 입력하고, 채널에 채널명을, 텍스트에 메시지를 입력하고 "Test Method" 를 누른 결과

{
"ok": false,
"error": "invalid_auth"
}
이렇게 나왔는데 어떤 의미인지 잘 모르겠네요. 성공한 과정인지 실패한 과정인지도 잘 모르겠습니다.

이 상태에서 attached.txt 를 실행해봤는데

ERROR:root:Error posting message: The request to the Slack API failed.
The server responded with: {'ok': False, 'error': 'not_in_channel'}

이러한 에러가 나왔습니다. 이정도 되면 제가 정말 가벼운 설정 과정을 놓치진 않았나 의심이 되네요.

에러 생각에 잠도 잘 못자고, 종일 붙잡고만 있었는데 도움주셔서 정말 감사합니다. 희망이 생겨서 정말 기뻐요...

@kulkuroo
Copy link

kulkuroo commented Mar 1, 2021

안녕하세요 hamsterdmin님. 저도 며칠간 머리를 쥐어뜯었던 경험을 공유한 사람으로서 어려운 심정
이해가 갑니다 ^^;

일단 테스트 페이지에서 Argument설정하시는 부분은 맞게 진행하신 듯 합니다. Input 창에 value넣어 주시면 됩니다.
그리고 결과는 slacker 라이브러리와 동일한 결과이고 실패에 해당합니다. (저도 동일한 실패 메시지가
나온 상황에서도 첨부파일 코드 실행했는데 chat wirte가 성공한 상황이어서 좀 헷갈리긴 합니다)

제가 첨부 드린 코드의 에러 메시지는 채널에 봇이 초대가 안되었을 때 나오는 메시지로 보입니다만, 님께서 메시지
게시하시려는 #trading 채널에 토큰 소유한 봇이 초대가 되었는지요? 혹시 안되었다면 초대하신 후에 다시 한번 코드 실행해 보시면 어떨까 싶습니다.

꼭 성공하시길 바랍니다.

@hamlsy
Copy link
Author

hamlsy commented Mar 1, 2021

안녕하세요 hamsterdmin님. 저도 며칠간 머리를 쥐어뜯었던 경험을 공유한 사람으로서 어려운 심정
이해가 갑니다 ^^;

일단 테스트 페이지에서 Argument설정하시는 부분은 맞게 진행하신 듯 합니다. Input 창에 value넣어 주시면 됩니다.
그리고 결과는 slacker 라이브러리와 동일한 결과이고 실패에 해당합니다. (저도 동일한 실패 메시지가
나온 상황에서도 첨부파일 코드 실행했는데 chat wirte가 성공한 상황이어서 좀 헷갈리긴 합니다)

제가 첨부 드린 코드의 에러 메시지는 채널에 봇이 초대가 안되었을 때 나오는 메시지로 보입니다만, 님께서 메시지
게시하시려는 #trading 채널에 토큰 소유한 봇이 초대가 되었는지요? 혹시 안되었다면 초대하신 후에 다시 한번 코드 실행해 보시면 어떨까 싶습니다.

꼭 성공하시길 바랍니다.

봇 초대하는 방법을 몰라 조금 헤메다가 명령어를 통해 초대하니 문제가 해결되었습니다! 여전히 invalid_auth 에러 원인을 밝혀내진 못했지만, kulkuroo님 덕분에 webhook url 방식으로 메시지 보내기를 성공했습니다. 이 방식을 통해 자동매매 시스템에 적용시켜보도록 해보겠습니다. 귀한 시간 내주셔서 정말 감사합니다!

@kulkuroo
Copy link

kulkuroo commented Mar 1, 2021

저런, 제가 답신 드릴 때 봇 초대하는 것도 적어드릴걸 그랬군요. ^^;

해결되셨다니 다행입니다. webhook도 되셨다니 코드로도 모두 성공 맛보시길 바랍니다.

@INVESTAR INVESTAR added the good first issue Good for newcomers label Mar 20, 2021
@jrchoi41
Copy link

!,수고하십니다.
2.봇초대하는 법을 가르처주세요.
3.webhook url 방식으로 메시지 보내는 방법
을 부탁드립니다.

@gdeok
Copy link

gdeok commented Oct 29, 2021

저도 다따라해봤는데 안되는데 ㅜㅜ 봇초대가 앱을 채널에 초대하는건가요??

@f1772man
Copy link

도움이 되시기를 바라며 제 경험을 공유하겠습니다.
저도 동일한 오류가 발생하여 애를 먹었습니다.
저는 여러 검색을 통해 아래와 같은 방식으로 진행했습니다.

  1. 슬랙 자체의 설정 오류 확인
  • 슬랙 로그인 하신 상태에서 https://api.slack.com/methods/chat.postMessage/test 페이지 접속
  • "Tester" 탭에서 "Argument" 필요한 것만 설정
  • Bot User OAuth Access Token을 "token" argument의 "Or, provide your own token:" 텍스트 박스에 입력
  • "channel" argument에 보내시고자 하는 채널명을 입력
  • "text" argument에 메시지 입력
  • "Test Method" 버튼 누름
  • 맨 아래 결과창 및 슬랙 채널에 메시지 도착 여부 확인
  1. 위 과정에 성공한 상태인데도 slacker 라이브러리로 안될 경우
  • webhook url 방식으로 사용 (curl/postman 등 웹 클라이언트로 보내는 방식은 잘 작동했습니다. 봇 설정 시 webhook url 설정필요)
  • slack_sdk 사용 (아래는 김황후 저자님 코드를 라이브러리 바꿔서 작성해 보았습니다)

저는 첨부된 코드로 책에 표시된 대로 메시지가 가는 것을 확인하였고, 질문자분에게도 도움이 되셨으면 좋겠습니다.
attached.txt

도움이 되시기를 바라며 제 경험을 공유하겠습니다.
저도 동일한 오류가 발생하여 애를 먹었습니다.
저는 여러 검색을 통해 아래와 같은 방식으로 진행했습니다.

  1. 슬랙 자체의 설정 오류 확인
  • 슬랙 로그인 하신 상태에서 https://api.slack.com/methods/chat.postMessage/test 페이지 접속
  • "Tester" 탭에서 "Argument" 필요한 것만 설정
  • Bot User OAuth Access Token을 "token" argument의 "Or, provide your own token:" 텍스트 박스에 입력
  • "channel" argument에 보내시고자 하는 채널명을 입력
  • "text" argument에 메시지 입력
  • "Test Method" 버튼 누름
  • 맨 아래 결과창 및 슬랙 채널에 메시지 도착 여부 확인
  1. 위 과정에 성공한 상태인데도 slacker 라이브러리로 안될 경우
  • webhook url 방식으로 사용 (curl/postman 등 웹 클라이언트로 보내는 방식은 잘 작동했습니다. 봇 설정 시 webhook url 설정필요)
  • slack_sdk 사용 (아래는 김황후 저자님 코드를 라이브러리 바꿔서 작성해 보았습니다)

저는 첨부된 코드로 책에 표시된 대로 메시지가 가는 것을 확인하였고, 질문자분에게도 도움이 되셨으면 좋겠습니다.
attached.txt

안녕하세요, 밤낮을 찾아보던 도중 kulkuroo 님의 답을 보고 희망을 가지고 실행을 해보았습니다.

우선 1. 의 Tester 탭에서 Argument를 필요한 것만 설정한다는 뜻이 무엇을 의미하는지 모르겠습니다. "Tester"탭을 보면 여러 "Argument"들과 Value 값을 입력하는 칸이 나오는데, 어떻게 설정한다는 것인지 모르겠습니다.

그리고 "Or, provide your own token:" 텍스트 박스에 입력하고, 채널에 채널명을, 텍스트에 메시지를 입력하고 "Test Method" 를 누른 결과

{ "ok": false, "error": "invalid_auth" } 이렇게 나왔는데 어떤 의미인지 잘 모르겠네요. 성공한 과정인지 실패한 과정인지도 잘 모르겠습니다.

이 상태에서 attached.txt 를 실행해봤는데

ERROR:root:Error posting message: The request to the Slack API failed. The server responded with: {'ok': False, 'error': 'not_in_channel'}

이러한 에러가 나왔습니다. 이정도 되면 제가 정말 가벼운 설정 과정을 놓치진 않았나 의심이 되네요.

에러 생각에 잠도 잘 못자고, 종일 붙잡고만 있었는데 도움주셔서 정말 감사합니다. 희망이 생겨서 정말 기뻐요...

올려주신 소스로 진행을 하였고 메시지 전송은 정상적으로 진행되었으나, 터미널에 아래와 같이 메시지가 뜨네요.
UserWarning: The fallback argument is missing in the request payload for a chat.postMessage call - It's a best practice to always provide a fallback argument when posting a message. The fallback argument is used in places where content cannot be rendered such as: system push notifications, assistive technology such as screen readers, etc.
warnings.warn(message, UserWarning)

@kulkuroo
Copy link

kulkuroo commented Feb 23, 2022 via email

@yunwoong7
Copy link

Slack의 정책 업데이트로 인해 2021.2.24 이후로 새로 생성된 bot은 slacker 라이브러리를 이용 할 수 없습니다. slacker.Error: invalid_auth 라는 에러가 발생합니다.

slack.chat.post_message 을 대신 할 함수를 만들어서 대체 하여 사용 하시면 문제를 해결 하실 수 있습니다.

import requests

def post_message(token, channel, answer):
    response = requests.post("https://slack.com/api/chat.postMessage",
        headers={"Authorization": "Bearer "+token},
        data={"channel": channel,"text": answer}
    )

# slack.chat.post_message(channel, answer)  // slack.chat.post_message -> post_message 으로 대체
post_message(token, channel, answer)

@pcmola
Copy link

pcmola commented Apr 23, 2022

윗분 - yunwoong7 님 - 이 작성하신 글에 추가 comment 합니다.
저도 post_message 만들어서 테스트 해봤는데 슬랙 메시지가 안 가더군요.
Slack API의 OAuth & Permissions > Scopes > Bot Token Scopes에 'chat:write.public' 추가하고 나니깐 슬랙 메시지가 전송됩니다.

https://developerdk.tistory.com/96 > ㅇㅇ님의 댓글 참고했습니다.

@baekjo10
Copy link

baekjo10 commented May 1, 2022

Slacker 가 아닌 slack_sdk를 사용하여 수정하니 잘 되네요
https://api.slack.com/messaging/sending 참조하여 수정하였습니다.

import logging
# Import WebClient from Python SDK (github.com/slackapi/python-slack-sdk)
from slack_sdk import WebClient
from slack_sdk.errors import SlackApiError

# WebClient instantiates a client that can call API methods
# When using Bolt, you can use either `app.client` or the `client` passed to listeners.

token = "xoxb-"
# client = WebClient(token=os.environ.get(token))
client = WebClient(token)
logger = logging.getLogger(name)

# ID of channel you want to post message to

channel_id = "#general"

markdown_text = '''
This message is plain.
This message is bold.
This message is code.
This message is italic.
This message is strike.
'''

attach_dict = {
'color' :'#ff0000',
'author_name':'INVESTAR',
"author_link":'github.com/investar',
'title' :'오늘의 증시 KOSPI',
'title_link' :'http://finance.naver.com/sise/sise_index.nhn?code=KOSPI',
'text' :'2,326.13 △11.89 (+0.51%)',
'image_url' :'https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png'
}

attach_list = [attach_dict]

try:
# Call the conversations.list method using the WebClient
result = client.chat_postMessage(
channel=channel_id,
text=markdown_text,
## # You could also use a blocks[] array to send richer content
attachments=attach_list
)
# Print result, which includes information about the message (like TS)
print(result)

except SlackApiError as e:
print(f"Error: {e}")

@dasollee2525
Copy link

dasollee2525 commented Jul 25, 2022

위에 yunwoong7님 방법으로 attachments 첨부하는 파일 코드도 혹시 필요하신 분이 계실까 싶어 첨부합니다!

import requests
import json

def post_message(token, channel, text, attachments):
    attachments = json.dumps(attachments)
    response = requests.post("https://slack.com/api/chat.postMessage",
        headers={"Authorization": "Bearer "+token},
        data={"channel": channel,"text": text, "attachments": attachments}
    )

markdown_text = '''
This message is plain.
*This message is bold.*
`This message is code.`
_This message is italic._
~This message is strike.~
'''

attach_dict = {
    "color"      :'#ff0000',
    "author_name":'INVESTMENT',
    "title"      :'오늘의 증시 KOSPI',
    "title_link" :'http://finance.naver.com/sise/sise_index.nhn?code=KOSPI',
    "text"       :'2,326.13 △11.89 (+0.51%)',
    "image_url"  :'https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png'
}
attach_list = [attach_dict]

post_message('xoxb-', '#general', markdown_text, attach_list)

@hyul0408
Copy link

hyul0408 commented Aug 7, 2022

도움이 되실지 모르겠지만, incoming webhook방식을 사용하니 정상적으로 출력되는것 같습니다. 제가 참조한 웹주소를 남기는게 조심스러워 메일주시면 참조한 웹주소 보내드리겠습니다.

@hyul0408
Copy link

hyul0408 commented Aug 7, 2022

일단 제가 webhook방식으로 url 따서 해본 결과 교재처럼 정확한 프레임이 출력되진 않습니다. 그래도 혹시 도움이 될 거 같아 제가 작성한 코드랑 결과첨부하겠습니다!

import requests
import json

def send_message(markdown_message, attachments):
url='incoming webhook에 들어가 url copy'
data = {'text':markdown_message, 'text':attachments}
resp = requests.post(url=url, json=data)
return resp

markdown_text = '''
This message is plain.
This message is bold.
This message is code.
This message is italic.
This message is strike.
'''
attach_dict = {
"color" :'#ff0000',
"author_name":'INVESTMENT',
"title" :'오늘의 증시 KOSPI',
"title_link" :'http://finance.naver.com/sise/sise_index.nhn?code=KOSPI',
"text" :'2,326.13 △11.89 (+0.51%)',
"image_url" :'https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png'
}
jsonstring = json.dumps(attach_dict, indent=2)

send_message(markdown_text, jsonstring)

실행결과:
{
"color": "#ff0000",
"author_name": "INVESTMENT",
"title": "\uc624\ub298\uc758 \uc99d\uc2dc KOSPI",
"title_link": "http://finance.naver.com/sise/sise_index.nhn?code=KOSPI",
"text": "2,326.13 \u25b311.89 (+0.51%)",
"image_url": "https://ssl.pstatic.net/imgstock/chart3/day/KOSPI.png"
} (편집됨)

(4kB)
차트사진잘 나옴!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
good first issue Good for newcomers
Projects
None yet
Development

No branches or pull requests