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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

Slack

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

API

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

Q&A

解決済

2回答

868閲覧

Pythonのrequestsライブラリを利用してSlackAPIを操作し、ファイル(csvなど)をSlackのワークスペースのチャンネルにアップロードしたいです。

shihatu

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

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

Slack

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

API

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

0グッド

0クリップ

投稿2023/09/20 08:45

実現したいこと

Pythonのrequestsライブラリを利用してSlackAPIを操作し、ファイル(csvなど)をSlackのワークスペースのチャンネルにアップロードしたいです。

前提

下記URLページ内の「requestsライブラリでSlackAPIを操作する方法」を実現させたいです
https://miyabikno-jobs.com/slackbot-upload-file/#Slackbot%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95

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

下記の「発生している問題・エラーメッセージ」のメッセージが返ってきました。
ですが、Slack上には何も反映されていません。ほかに原因が思いつく方いらっしゃいますか?

{'ok': True, 'file': {'id': 'F05T11Q4LER', 'created': 1695197899, 'timestamp': 1695197899, 'name': 'test.csv', 'title': 'test', 'mimetype': 'text/plain', 'filetype': 'text', 'pretty_type': 'プレーンテキスト', 'user': 'U05T0TVCXJ9', 'user_team': 'T05TDE5G308', 'editable': True, 'size': 527, 'mode': 'snippet', 'is_external': False, 'external_type': '', 'is_public': False, 'public_url_shared': False, 'display_as_bot': False, 'username': '', 'url_private': 'https://files.slack.com/files-pri/T05TDE5G308-F05T11Q4LER/'test.csv, 'url_private_download': 'https://files.slack.com/files-pri/T05TDE5G308-F05T11Q4LER/download/test.csv', 'permalink': 'https://testtakeru.slack.com/files/U05T0TVCXJ9/F05T11Q4LER/test.csv', 'permalink_public': 'https://slack-files.com/T05TDE5G308-F05T11Q4LER-cf8679c50c', 'edit_link': 'https://testtakeru.slack.com/files/U05T0TVCXJ9/F05T11Q4LER/test.csv/edit', 'preview': 'import requests\r\n#@SLACKTOKEN\r\nTOKEN = @SLACKTOKEN\r\nCHANNEL = "test"\r\ncntAir = 1\r', 'preview_highlight': '<div class="CodeMirror cm-s-default CodeMirrorServer" oncopy="if(event.clipboardData){event.clipboardData.setData(\'text/plain\',window.getSelection().toString().replace(/\\u200b/g,\'\'));event.preventDefault();event.stopPropagation();}">\n<div class="CodeMirror-code">\n<div><pre>import requests</pre></div>\n<div><pre>#xoxb-5931481547008-5908393168099-7ZD7ZZFsrCqNXN3xkP9g2lxQ</pre></div>\n<div><pre>TOKEN = "@SLACKTOKEN"</pre></div>\n<div><pre>CHANNEL = "test"</pre></div>\n<div><pre>cntAir = 1</pre></div>\n<div><pre></pre></div>\n</div>\n</div>\n', 'lines': 21, 'lines_more': 16, 'preview_is_truncated': False, 'comments_count': 0, 'is_starred': False, 'shares': {}, 'channels': [], 'groups': [], 'ims': [], 'has_more_shares': False, 'has_rich_preview': False, 'file_access': 'visible'}}

該当のソースコード

import requests TOKEN = "@SLACK-BOT-TOKEN" CHANNEL = "test" url = "https://slack.com/api/files.upload" files = {'file': open( r'@DirPath\test.csv','br')} filename = 'test.csv' headers = {"Authorization": "Bearer " + TOKEN} data = { 'channel': CHANNEL, } r = requests.post(url=url, headers=headers, data=data, files=files) print(r.json())

試したこと

また、Slackのpermissionは添付画像のように設定しています。
ファイルのパスは間違っていないことは確認できました。

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

ちなみに以下に記載のメッセージを送るAPIはうまくいっています。

windows
anaconda

import requests TOKEN = "xoxb-5931481547008-5918947439621-8tPxmy674mPnkHQ4LPS12Beq" CHANNEL = "test" cntAir = 0 if cntAir >= 1: message = 'There are '+ str(cntAir) + ' airplane transports.' else: message = '0' url = "https://slack.com/api/chat.postMessage" headers = {"Authorization": "Bearer "+TOKEN} data = { 'channel': CHANNEL, 'text': message } r = requests.post(url, headers=headers, data=data) print(r.json())

イメージ説明

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

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

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

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

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

guest

回答2

0

原因はchannelsをchannelとしていたことでした。メッセージを送る際はchannelでうまくいったので、画像を送る際もchannelでうまくいくと思っていました。

投稿2023/09/20 23:55

shihatu

総合スコア2

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

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

0

ベストアンサー

ファイルのアップロードとメッセージの送信は全く別ものです
アップロードに成功しても自動でメッセージが投稿されるわけではないので、ファイルのアップロード後にメッセージを送信しないといけません。

py

1import requests 2 3TOKEN = "@SLACK-BOT-TOKEN" 4CHANNEL = "test" 5url = "https://slack.com/api/files.upload" 6 7files = {'file': open( r'@DirPath\test.csv','br')} 8filename = 'test.csv' 9headers = {"Authorization": "Bearer " + TOKEN} 10 11data = { 12 'channel': CHANNEL, 13} 14 15r = requests.post(url=url, headers=headers, data=data, files=files,timeout=10) 16response = r.json() 17 18if not response['ok']: 19 print('ファイルのアップロードに失敗しました:'+response.get('error','')) 20else: 21 print('log:ファイルアップロード成功') 22 upload_done_message = ('ファイルをアップロードしました。ダウンロードリンクはこちら:' 23 + response['file']['permalink']) 24 25 r = requests.post( 26 'https://slack.com/api/chat.postMessage', 27 headers=headers, 28 data={ 29 'channel': CHANNEL, 30 'text' : upload_done_message 31 }, 32 timeout=10 33 ) 34 35 response = r.json() 36 if not response['ok']: 37 print('メッセージの送信に失敗しました:'+response.get('error','')) 38 else: 39 print('log:メッセージ送信完了')

ファイルの送信とメッセージ投稿を一発で行う方法

=>channelsにチャンネルを記述&initial_commentを追加する。
https://api.slack.com/methods/files.upload

py

1import requests 2 3TOKEN = "@SLACK-BOT-TOKEN" 4CHANNEL = "test" 5url = "https://slack.com/api/files.upload" 6 7files = {'file': open( r'@DirPath\test.csv','br')} 8filename = 'test.csv' 9headers = {"Authorization": "Bearer " + TOKEN} 10initial_comment = 'ファイルをアップロードしました。' 11data = { 12 'channels' : CHANNEL, 13 'filename' : filename, 14 'initial_comment' : initial_comment 15} 16 17r = requests.post(url="https://slack.com/api/files.upload", headers=headers, data=data, 18 files=files, timeout=10) 19response = r.json() 20if not response['ok']: 21 print('ファイルのアップロードに失敗しました:'+response.get('error','')) 22else: 23 print('log:アップロード成功。')

投稿2023/09/20 12:52

編集2023/09/20 13:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

shihatu

2023/09/20 23:52

回答ありがとうございます。すみません、質問内容の補足情報である「メッセージを送るAPIはうまくいきました」という情報は、この方法でメッセージのみ送ることができたということ、またSlackとの通信はうまくいった経験があるということを単に書きたかっただけで、やりたいこととしては、ファイルを送るのみです。 わかりにくい説明ですみません。 また、問題も解決しました。 原因はchannelsをchannelとしていたことでした。メッセージを送る際はchannelでうまくいったので、画像を送る際もchannelでうまくいくと思っていました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問