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

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

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

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Slack

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

Q&A

解決済

2回答

568閲覧

golangでslackbot作りたいのですがよくわかりません

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Slack

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

0グッド

0クリップ

投稿2017/07/30 03:41

編集2017/07/30 03:57

#環境
言語: go 1.8.3
開発環境: gogland
slackAPI: https://github.com/nlopes/slack

#したいこと
golangでslackbotを作りたいです

######そこで
右も左もわからないのでとりあえずこのサイトを見ました
そこに書いてあったサンプルコードの全文が以下です。

go

1package main 2 3import ( 4 "log" 5 "os" 6 7 "github.com/nlopes/slack" 8) 9 10func run(api *slack.Client) int { 11 rtm := api.NewRTM() 12 go rtm.ManageConnection() 13 14 for { 15 select { 16 case msg := <-rtm.IncomingEvents: 17 switch ev := msg.Data.(type) { 18 case *slack.HelloEvent: 19 log.Print("Hello Event") 20 21 case *slack.MessageEvent: 22 log.Printf("Message: %v\n", ev) 23 rtm.SendMessage(rtm.NewOutgoingMessage("Hello world", ev.Channel)) 24 25 case *slack.InvalidAuthEvent: 26 log.Print("Invalid credentials") 27 return 1 28 29 } 30 } 31 } 32} 33 34func main() { 35 api := slack.New("[YOUR-API-TOKEN]") 36 os.Exit(run(api)) 37}

このサイト曰く

情報はチャネルの IncomingEvents に enqueue されるので、それを dequeue して型によって振る舞いを変えます。

とのことなのですが、要は
"何か(hello eventのような)イベントがあれば、<-rtm.IncomingEventsというチャネルに送られてくるから、それを読み取って実装しましょう"
ということですか?

もしそうであるとすれば、<-rtm.IncomingEventsの中身ってどうやったらわかりますか?
apiのソースコードを見ればわかるのかと思うのですが、どのページを見たら使い方がわかるのかがわかりません。

#今具体的にやりたいこと
slackで送られて来たメッセージの中身を読み取って、hogehogeが含まれていたらpiypiypと送信すると言ったようなことをしたいです。コードで教えていただけ
ませんか。
加えて、コードだけですとそのあと自分で拡張できないので、ソースコードどの部分を見たらその関数が書いてあるかなども教えていただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

"何か(hello eventのような)イベントがあれば、<-rtm.IncomingEventsというチャネルに送られてくるから、それを読み取って実装しましょう"
ということですか?

もしそうであるとすれば、<-rtm.IncomingEventsの中身ってどうやったらわかりますか?
apiのソースコードを見ればわかるのかと思うのですが、どのページを見たら使い方がわかるのかがわかりません。

chan に送信する場合は <- を使うので、ソースコード websocket_managed_conn.goIncomingEvent <- で検索すると分かります。ただこのパッケージは文字列から生成するイベントの struct を reflect を使って動的に作るという、少し玄人なコードになっているので全てのイベントを探すのに苦労するかもしれません。実際は websocket_managed_conn.go の以下の部分が発生し得るイベントになります。

go

1var eventMapping = map[string]interface{}{ 2 "message": MessageEvent{}, 3 "presence_change": PresenceChangeEvent{}, 4 "user_typing": UserTypingEvent{}, 5 6 "channel_marked": ChannelMarkedEvent{}, 7 "channel_created": ChannelCreatedEvent{}, 8 "channel_joined": ChannelJoinedEvent{}, 9 "channel_left": ChannelLeftEvent{}, 10 "channel_deleted": ChannelDeletedEvent{}, 11 "channel_rename": ChannelRenameEvent{}, 12 "channel_archive": ChannelArchiveEvent{}, 13 "channel_unarchive": ChannelUnarchiveEvent{}, 14 "channel_history_changed": ChannelHistoryChangedEvent{}, 15 16 "dnd_updated": DNDUpdatedEvent{}, 17 "dnd_updated_user": DNDUpdatedEvent{}, 18 19 "im_created": IMCreatedEvent{}, 20 "im_open": IMOpenEvent{}, 21 "im_close": IMCloseEvent{}, 22 "im_marked": IMMarkedEvent{}, 23 "im_history_changed": IMHistoryChangedEvent{}, 24 25 "group_marked": GroupMarkedEvent{}, 26 "group_open": GroupOpenEvent{}, 27 "group_joined": GroupJoinedEvent{}, 28 "group_left": GroupLeftEvent{}, 29 "group_close": GroupCloseEvent{}, 30 "group_rename": GroupRenameEvent{}, 31 "group_archive": GroupArchiveEvent{}, 32 "group_unarchive": GroupUnarchiveEvent{}, 33 "group_history_changed": GroupHistoryChangedEvent{}, 34 35 "file_created": FileCreatedEvent{}, 36 "file_shared": FileSharedEvent{}, 37 "file_unshared": FileUnsharedEvent{}, 38 "file_public": FilePublicEvent{}, 39 "file_private": FilePrivateEvent{}, 40 "file_change": FileChangeEvent{}, 41 "file_deleted": FileDeletedEvent{}, 42 "file_comment_added": FileCommentAddedEvent{}, 43 "file_comment_edited": FileCommentEditedEvent{}, 44 "file_comment_deleted": FileCommentDeletedEvent{}, 45 46 "pin_added": PinAddedEvent{}, 47 "pin_removed": PinRemovedEvent{}, 48 49 "star_added": StarAddedEvent{}, 50 "star_removed": StarRemovedEvent{}, 51 52 "reaction_added": ReactionAddedEvent{}, 53 "reaction_removed": ReactionRemovedEvent{}, 54 55 "pref_change": PrefChangeEvent{}, 56 57 "team_join": TeamJoinEvent{}, 58 "team_rename": TeamRenameEvent{}, 59 "team_pref_change": TeamPrefChangeEvent{}, 60 "team_domain_change": TeamDomainChangeEvent{}, 61 "team_migration_started": TeamMigrationStartedEvent{}, 62 63 "manual_presence_change": ManualPresenceChangeEvent{}, 64 65 "user_change": UserChangeEvent{}, 66 67 "emoji_changed": EmojiChangedEvent{}, 68 69 "commands_changed": CommandsChangedEvent{}, 70 71 "email_domain_changed": EmailDomainChangedEvent{}, 72 73 "bot_added": BotAddedEvent{}, 74 "bot_changed": BotChangedEvent{}, 75 76 "accounts_changed": AccountsChangedEvent{}, 77 78 "reconnect_url": ReconnectUrlEvent{}, 79}

これは、処理中に文字列で与えられるメッセージタイプに対してどの struct を生成し、json ででコードするかを管理しているテーブルです。
またこれ以外にもイベントが発生する様で、ソースを見たところ

go

1AckErrorEvent 2ConnectedEvent 3ConnectingEvent 4ConnectionErrorEvent 5DisconnectedEvent 6HelloEvent 7IncomingEventError 8InvalidAuthEvent 9LatencyReport 10MessageTooLongEvent 11OutgoingErrorEvent 12UnmarshallingErrorEvent

こちらも .IncomingEvents <- でソースコードを検索すると見つかるかと思います。

投稿2017/08/02 13:49

mattn

総合スコア5030

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

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

0

apiのソースコードが分からないとありますが、importで指定したgithub.com/nlopes/slackがそのままURLになっています。
(厳密には何でもURLにできるわけではありませんが、github.comの場合はURLとして扱われます。)
なので、ソースは https://github.com/nlopes/slackにあります。
このページの下の方にあるMinimal RTM usageapi.RTM()を使った最小のサンプルがあるので参考になると思います。

投稿2017/07/30 04:41

shiena

総合スコア1825

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

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

退会済みユーザー

退会済みユーザー

2017/07/30 05:05

githubにあるのはわかってるんですが、apiを使用するにあたってのソースコードの歩き肩がわからないんです。 minimal usageはほとんど参考にしたサイトと同じようなことしか書いてないです。 例えば、受け取ったメッセージの内容の確認方法はどうやったら確認できるのでしょうか
shiena

2017/07/30 06:44

ならばまずはGo自体を勉強したり、実際に動かしてどんな結果になるか確認しましょう。 また、サンプルの`Printf`のフォーマットは`%v`なので値が表示されますが、`%#v`に変えると型も一緒に出力されるので、型名でソースを検索するとどんなフィールドがあるのか分かります。 http://golang-jp.org/pkg/fmt/ > 例えば、受け取ったメッセージの内容の確認方法はどうやったら確認できるのでしょうか もっと具体的に。方法が分からないにしても以下のようにいくつか段階があるので、どこまでできて、どこでつまっているのか書いてください。たとえば↑の回答はslackから通知を受け取れている前提で書きましたが、通知の受け取り方が分からないのなら頓珍漢な回答でしょう? * ソースコードを書いてもどうやって動かせばいいか分からない * コンパイル方法が分からない * コンパイルできるけど実行方法が分からない * 実行したプログラムがslackから通知を受ける方法が分からない * slackから通知を受け取っているけどその内容が分からない
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問