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

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

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

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

Slack

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

Q&A

解決済

2回答

4186閲覧

slackにapi経由でファイルを投稿したいが投稿されない

persimmon0330

総合スコア2

Python

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

Slack

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

0グッド

0クリップ

投稿2021/12/27 22:07

編集2021/12/28 04:46

前提・実現したいこと

slackに画像付きファイルをuser token を使って添付したい。

発生している問題・エラーメッセージ

エラーは表示されないが、送信されていない。

該当のソースコード

python

1png_1 = './hogehoge/hogehogeランキング.png' 2 3plt.savefig(png_1) 4 5# ファイル名 6filename = 'test' 7 8access_token = 'xoxp-hogehoge' 9channel_id = 'hogehoge' 10 11 12files = {'file': open(png_1, 'rb')} 13param = { 14 'token': access_token, 15 'channels': channel_id, 16 'filename': filename, 17 # Botのメッセージ 18 'initial_comment': "test upload", 19 # Slack上のタイトル 20 'title': "test_title" 21} 22 23requests.post(url="https://slack.com/api/files.upload", params=param, files=files)

試したこと

https://miyabikno-jobs.com/slackbot-upload-file/
を参照した
hogehogefolderには投稿したい画像は保存されている

補足情報(FW/ツールのバージョンなど)

user_tokenは
admin
channels:history
channels:read
channels:write
chat:write
files:read
files:write
groups:history
groups:read
groups:write
を追加済み

現在
{'ok': False, 'error': 'invalid_auth'}
が出ている状況です

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

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

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

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

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

guest

回答2

0

Slack の API は、API 呼び出しに問題がある場合にも 200 OK の HTTP ステータスで応答し、response body にエラーコードを含める形になっています。

requests.post が返す値をチェックしてみてください。そこにエラーコードが含まれているはずです。エラーコードの一覧はこちらのドキュメントを参考にしてください。 https://api.slack.com/methods/files.upload#errors

おそらく not_in_channel とかその辺がかえってきているのではないかと思います。

もし requests でやることにこだわりがなければ、公式 SDK でやってみてください。前に日本語で記事を書きました。

https://qiita.com/seratch/items/2dd8e5676b09e8863618

投稿2021/12/27 23:17

seratch

総合スコア215

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

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

persimmon0330

2021/12/28 02:24

ご回答いただきありがとうございます。 試してみたところinvalid_authと出力されているのですが、原因究明の方法とかはありますでしょうか⁇ よろしくお願いします
seratch

2021/12/28 02:38

これはドキュメントにもある通り、トークンが正しくない場合などに出るエラーですね。正しいトークンを使っているかとトークンの渡し方を見直してみてください。 あと、繰り返しとなりますが、公式 SDK の WebClient を使えば特にハマることなく実装できると思います。
persimmon0330

2021/12/28 04:49

所属しているチームが伝統的にrequestsで書いているので、できればrequestsで書きたいです。 他のtokenなどでも試してみましたが、うまくいかなかったのですが、コードにおかしなところ等ありますでしょうか⁇
seratch

2021/12/28 07:21

試してみましたが、問題なくファイルをアップロードできました。コード例を含むので、ここではなく新しいレスとして投稿しました。確認してみてください。
guest

0

ベストアンサー

元のコードが動かない理由はトークンの問題ではないかと思っていますが(最初か最後に空白が入っていたりしませんか?)、以下のスクリプトを試してみるとよいかと思います。

トークンに問題がないなら、TODO: となっているところの値さえ差し替えれば動作するはずです。トークンに問題がある場合は 1. token が正しいか確認 の時点でエラーコードが返ってくるかと思います。

python

1import os 2import requests 3import json 4 5token = os.environ["SLACK_BOT_TOKEN"] 6 7# 1. token が正しいか確認 8response = requests.post( 9 url="https://slack.com/api/auth.test", 10 headers={"Authorization": f"Bearer {token}"}, 11) 12print(json.dumps(response.json(), indent=4, sort_keys=True)) 13 14# ファイルをアップロード 15 16# TODO: このファイルパスはご自身のものに差し替えてください 17filepath = "./slack-logo.png" 18# TODO: このチャンネル ID もご自身のものに差し替えてください 19channel_ids = ",".join(["C03E94MKU"]) 20 21with open(filepath, "rb") as f: 22 # 2A. request header を使ったトークン指定(推奨) 23 response = requests.post( 24 url="https://slack.com/api/files.upload", 25 headers={"Authorization": f"Bearer {token}"}, 26 params={"channels": channel_ids}, 27 files={"file": f}, 28 ) 29 print(json.dumps(response.json(), indent=4, sort_keys=True)) 30 31with open(filepath, "rb") as f: 32 # 2B. 元のサンプルのようにパラメータに token を含める方法 33 response = requests.post( 34 url="https://slack.com/api/files.upload", 35 params={"channels": channel_ids, "token": token}, 36 files={"file": f}, 37 ) 38 print(json.dumps(response.json(), indent=4, sort_keys=True)) 39

投稿2021/12/28 07:20

編集2021/12/28 09:54
seratch

総合スコア215

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

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

persimmon0330

2021/12/28 09:24

{ "is_enterprise_install": false, "ok": true, "team": "hogehoge", "team_id": "hogehoge", "url": "https://hogehoge.slack.com/", "user": "hogehoge", "user_id": "hogehoge" } { "error": "invalid_auth", "ok": false } となっているので、token自体は問題ないような気がしているのですが、何かわかりますでしょうか
seratch

2021/12/28 10:02

んー、ちょっとなんとも言えないですね。まずは切り分けのために公式 SDK でならアップロードできるのかどうかを試してみては? あとは考えられることとしては Python のバージョンや requests のバージョン、openssl のバージョンが古すぎるなどの理由で蹴られているかもしれません。
persimmon0330

2021/12/29 13:29

requests等を更新したり、いろいろごちゃごちゃしたら、うまくいきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問