質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

6616閲覧

PythonによるSlack APIを使ったファイルアップロードでのinvalid_authエラー

masayoshi555

総合スコア9

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/08/03 10:08

編集2021/08/03 11:09

やりたいこと

pythonにてslack apiを使って特定チャンネルにファイルをアップロードしたい

不明点

authテストOKなのに、POSTの結果invalid_authとなる。
ちなみに同じuser tokenとchannel idでメッセージの送信は成功しています。

slack api auth test:OK
{
"ok": true,
"url": "https://****.slack.com/",
"team": "****",
"user": "****",
"team_id": "****",
"user_id": "****",
"is_enterprise_install": false
}

OAuth & PermissionsのScopes設定

イメージ説明

コード(ファイルアップロード)

python

1import requests 2import glob 3 4token = "OAuth Tokens for Your Workspaceに記載のUser OAuth Token" 5channel_id = "conversations.list(https://api.slack.com/methods/conversations.list/test)で調べたchannel id" 6 7src_dir = glob.glob("絶対パスでフォルダ指定") 8for path in src_dir: 9 print(path) #/Users/admin/***/*** 10 11url = "https://slack.com/api/files.upload" 12params = { 13 'token': token, 14 'channels': channel_id #'filename'、initial_comment'、'title'の有無によらずエラー 15} 16files = {'file': open(path, 'rb')} 17r = requests.post(url, params=params, files=files) 18print("return ", r.json())

レスポンス

python

1return {'ok': False, 'error': 'invalid_auth'}

開発環境

M1 mac BigSur 11.4
anaconda-JupyterLab-python3.8.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

そもそも・・・
上記の記述は2021年2月24日の更新でパラメータにTokenを含めた記述は廃止されていました。

そこで、色々と調べたところ、
GitHubのslack-sdkページの"Uploading files to Slack"にそのままのサンプルコードがありました。(以下)

python

1import os 2from slack_sdk import WebClient 3from slack_sdk.errors import SlackApiError 4 5client = WebClient(token=os.environ['SLACK_BOT_TOKEN']) 6 7try: 8 filepath=path 9 response = client.files_upload(channels='#「投稿したいチャンネル名」', file='ファイルパス') 10 assert response["file"] # the uploaded file 11except SlackApiError as e: 12 # You will get a SlackApiError if "ok" is False 13 assert e.response["ok"] is False 14 assert e.response["error"] # str like 'invalid_auth', 'channel_not_found' 15 print(f"Got an error: {e.response['error']}")

問題はここから。
環境変数にSLACK_BOT_TOKENを何度exportしても再起動すると消えてしまい、暫定的に以下の流れでコードが動くことまでは確認できました。

・起動しているjupyter labをshotdown
・ターミナルでexport SLACK_BOT_TOKEN="取得したtoken"で環境変数に設定
・jupyter lab起動
・jupyter lab内のnotebookで%envを記載(Shift+enterで環境変数一覧が出てきてSLACK_BOT_TOKENが書いてあればOK)
・上記コードを記載してShift+enterすると、チャンネルに投稿されます

環境変数にSLACK_BOT_TOKENを永久的に保存する方法は別途調べます。
私は、自分のPCでワークすれば良いのでこうしますが、本来は仮想環境を作って上記行うと良いようです。
気になる方は自分で調べてください。

投稿2021/08/03 13:52

masayoshi555

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

調べてみました。

公式
https://api.slack.com/methods/auth.test
invalid_auth

Some aspect of authentication cannot be validated. Either the provided token is invalid or the request originates from an IP address disallowed from making the request.

認証の一部の側面を検証できません。提供されたトークンが無効であるか、要求が要求の実行を許可されていないIPアドレスから発信されています。


日本語版公式
トークンを特定の IP 範囲に制限する
https://api.slack.com/lang/ja-jp/securing-your-slack-app
こちらを参考に設定してみては如何でしょうか?

投稿2021/08/03 12:54

odataiki

総合スコア938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問