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

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

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

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

Slack

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

Q&A

解決済

1回答

8092閲覧

slackのbotで投稿したメッセージに対して、bot自身でリプライしたい

taro_gun

総合スコア3

Python

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

Slack

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

0グッド

0クリップ

投稿2019/08/18 09:40

編集2019/08/20 08:21

前提・実現したいこと

slackのincoming webhookを使って、botが投稿したメッセージに対して、bot自身がスレッドでリプライしたい

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

スクリプトは動いているが、返信する方のメッセージが投稿されない

該当のソースコード

Python

1def send_error_log(message, unixTime): 2 requests.post( 3 "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx", 4 headers={'content-type': 'application/json'}, 5 data=json.dumps( {"username":"Error-bot", "icon_emoji":":ghost:", "text":message, "ts":unixTime} ) 6 ) 7def send_error_replay(message, parent_ts): 8 requests.post( 9 "https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxx", 10 headers={'content-type': 'application/json'}, 11 data=json.dumps( {"username":"Error-bot", "icon_emoji":":ghost:", "text":message, "thread_ts": parent_ts} ) 12 ) 13errorCounter = 0 14if errorCounter == 0: 15 parent_ts = str(time.time()) + "0000" 16 send_error_log("メッセージを送信しました", parent_ts) 17 errorCount += 1 18elif errorCounter > 0: 19 send_error_replay("返信しました", parent_ts)

試したこと

send_error_logの"ts"を"thread_ts"に変更。tsの時は問題なくメッセージは届いたが、変更後は逆に届かない。
return.postを出力。エラーメッセージは、invalid_thread_ts

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

以下を参考にしましたが、把握しきれてないと思います。
https://api.slack.com/docs/message-threading#using_the_web_api

python環境: 2.7

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

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

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

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

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

mistn

2019/08/18 14:23

requests.post の返り値を出力してみてください。メッセージが送信されないなら何かしらのエラーが返されているかもしれません。
taro_gun

2019/08/19 02:22

ありがとうございます。 出力しましたが、Noneで返ってきます。ちなみに、ちゃんとメッセージが投稿される場合も、返り値はNoneでした
taro_gun

2019/08/20 08:18

申し訳ございません。ご指摘いただいたように、ちゃんと調べたところ、invalid_thread_ts と返ってきました。 そこで少し進捗があったのですが、すでにslack内に投稿されてるメッセージのタイムスタンプを調べました。そのメッセージに対して返信しようと、send_error_replayのthread_tsに、調べたタイムスタンプをいれてみたところ、スレッドに書き込まれました。 どうやら、私のタイムスタンプの指定が悪かったようです。
guest

回答1

0

自己解決

send_error_replyのthread_tsに適切なタイムスタンプを渡せていなかったのが原因でした。
適切なタイムスタンプは、slack API メソッドのconversations.historyを使って、取得できました。
自分でタイムスタンプを無理やり指定しようとしていたのが、そもそもお門違いだったようです。

以下、コードです。
①get_slack_messageを追加しました。
slackのチャンネル内にあるメッセージを取得する関数です。親メッセージとなる投稿だけを取得できるようにしました。

python

1def get_slack_message(unixTime): 2 url = "https://slack.com/api/conversations.history" 3 token = "xoxp-???????????????????????" #各自のtoken 4 channel_id = "??????????" #チャンネルのID 5 6 payload = {"token":token, "channel":channel_id,"latest":unixTime, "limit":1} 7 res = requests.get(url, params=payload) 8 json_data = res.json() 9 return json_data

②if文の箇所を修正しました
親メッセージの投稿直後のタイムスタンプを変数に代入。その変数をget_slack_messageで用いて、親メッセージだけ取得。正しいタイムスタンプを抽出しました。

python

1errorCounter = 0 2if errorCounter == 0: 3 send_error_log("メッセージを送信しました") 4 errorCounter += 1 5 time.sleep(1) #投稿後最低1秒経過しないとメッセージ検索ができなかったため 6 parent_ts_tentative = time.time() 7elif errorCounter > 0: 8 parent_message = get_slack_message(parent_ts_tentative) 9 parent_ts = parent_message['messages'][0]['ts'] 10 send_error_replay("返信しました", parent_ts)

③send_error_logの"ts"は削除しました

以上で無事解決できました。mistn様、色々至らない点をご指摘いただき、誠にありがとうございました。

投稿2019/08/20 14:42

編集2019/08/20 14:45
taro_gun

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問