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

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

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

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Slack

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

Q&A

解決済

1回答

1509閲覧

lineとslackを連携

YUOKAWARA

総合スコア1

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Slack

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

0グッド

1クリップ

投稿2021/04/15 22:45

お世話になっております。
pythonを使用しLINE-BOt,SlackAPI,Botを連携させ、画像を転送したいと考えております。

環境
・Macbook Air M1
・OS Bigsur
・python 3.8系
・デプロイ heroku (runtime.txtはpython3.8.9)

こちらのサイトを見ながら作業をしております。
参考サイト

参考サイトと同じく、Lineに投稿した画像をSlackに転送するというのが理想ですが、こちらがうまくいきません。

該当箇所ソースコード

python

1 2import os 3 4import requests, json 5import slackweb 6from flask import Flask, request, abort 7from linebot import LineBotApi, WebhookHandler 8from linebot.exceptions import InvalidSignatureError, LineBotApiError 9from linebot.models import MessageEvent, TextMessage, ImageMessage 10 11app = Flask(__name__) 12 13CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"] 14CHANNEL_SECRET = os.environ["LINE_CHANNEL_SECRET"] 15WEB_HOOK_LINKS = os.environ["SLACK_WEB_HOOKS_URL"] 16BOT_OAUTH = os.environ["SLACK_BOT_OAUTH"] 17POST_CHANNEL_ID = os.environ["SLACK_POST_CHANNEL_ID"] 18USER_OAUTH = os.environ["SLACK_USER_OAUTH"] 19 20line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN) 21handler = WebhookHandler(CHANNEL_SECRET) 22### 以下省略 ### 23 24# image file 25@handler.add(MessageEvent, message=ImageMessage) 26def handle_image_message(event): 27 """ 28 Image Message 29 """ 30 31 #get talk 32 user_id, user_name, msg_type, room_id = get_event_info(event) 33 34 #send lineImage recieve 35 message_id = event.message.id 36 message_content = line_bot_api.get_message_content(message_id) 37 img = message_content.content #画像データ 38 39 #slack 40 send_msg = "[bot-line] {user_name} 画像を送信.\n".format(user_name=user_name) \ 41 + "---\n" \ 42 + "送信元: {msg_type} ( {room_id} )\n".format(msg_type=msg_type, room_id=room_id) \ 43 + "送信者: {user_name} ( {user_id} )".format(user_name=user_name, user_id=user_id) 44 45 file_name = "send_image_{message_id}".format(message_id=message_id) 46 #send image 47 url = 'https://slack.com/api/files.upload' 48 files = {'file': img} 49 param = { 50 'user': user_id, 51 'token': BOT_OAUTH, 52 'channels': POST_CHANNEL_ID, 53 'filename': file_name, 54 'initial_comment': send_msg, 55 'title': file_name, 56 } 57 print("!!! send slack log !!!", param) 58 res = requests.post(url, params=param, files=files) 59 print("res", res) 60

実行すると、responseには200のステータスが返ってきますが、画像は表示されません。
res.json()でdebugで確認した際、
OK:false invalid_authという表示がでましたので、Slack APIのauth scopeを確認して以下の権限にしております。

Bot Token Scopes
channels:read
chat:write
chat:write.customize
files:write
incoming-webhook
remote_files:write

User Token Scopes
files:write
files:read
chat:write

権限設定、tokenの変更もかけましたが事象が変わらずでした。何かアドバイスをいただければ幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

こちら自己解決いたしました。

結論からいうと、headerにUser OAuth Tokenを設定することで改善いたしました。
parameterには記載せずです。
こちら改善したコードを記載します。

python

1### 該当部分のみ記載 ### 2@handler.add(MessageEvent, message=ImageMessage) 3def handle_image_message(event): 4 """ 5 Image Message 6 """ 7 8 #get talk 9 user_id, user_name, msg_type, room_id = get_event_info(event) 10 11 #send lineImage recieve 12 message_id = event.message.id 13 message_content = line_bot_api.get_message_content(message_id) 14 img = message_content.content #画像データ 15 # img = "/Users/okawarayu/Desktop/py_line_slack/sp_test_height.JPG" 16 17 #slack 18 send_msg = "[bot-line] {user_name} 画像を送信.\n".format(user_name=user_name) \ 19 + "---\n" \ 20 + "送信元: {msg_type} ( {room_id} )\n".format(msg_type=msg_type, room_id=room_id) \ 21 + "送信者: {user_name} ( {user_id} )".format(user_name=user_name, user_id=user_id) 22 23 file_name = "send_image_{message_id}".format(message_id=message_id) 24 25 # getimg = requests.get(img) 26 # pillowimg = Image.open(BytesIO(getimg.content)) 27 # flipped_img = ImageOps.flip(pillowimg) 28 # flipped_img.show() 29 30 #send image 31 url = 'https://slack.com/api/files.upload' 32 headers = {"Authorization" : "Bearer "+ USER_OAUTH} 33 files = {'file': img} 34 param = { 35 'user': user_id, 36 # 'token': BOT_OAUTH, 37 'channels': POST_CHANNEL_ID, 38 'filename': file_name, 39 'initial_comment': send_msg, 40 'title': file_name, 41 } 42 print("!!! send slack log !!!", param) 43 res = requests.post(url, params=param, files=files, headers=headers) 44 print("res", res.json())

投稿2021/04/16 01:07

YUOKAWARA

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問