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

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

ただいまの
回答率

90.40%

  • Go

    572questions

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

  • Slack

    205questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 936

DDxlk

score 115

環境

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

したいこと

golangでslackbotを作りたいです

そこで

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

package main

import (
    "log"
    "os"

    "github.com/nlopes/slack"
)

func run(api *slack.Client) int {
    rtm := api.NewRTM()
    go rtm.ManageConnection()

    for {
        select {
        case msg := <-rtm.IncomingEvents:
            switch ev := msg.Data.(type) {
            case *slack.HelloEvent:
                log.Print("Hello Event")

            case *slack.MessageEvent:
                log.Printf("Message: %v\n", ev)
                rtm.SendMessage(rtm.NewOutgoingMessage("Hello world", ev.Channel))

            case *slack.InvalidAuthEvent:
                log.Print("Invalid credentials")
                return 1

            }
        }
    }
}

func main() {
    api := slack.New("[YOUR-API-TOKEN]")
    os.Exit(run(api))
}

このサイト曰く

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

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

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

今具体的にやりたいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2017/07/30 13:29

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+2

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

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

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

var eventMapping = map[string]interface{}{
    "message":         MessageEvent{},
    "presence_change": PresenceChangeEvent{},
    "user_typing":     UserTypingEvent{},

    "channel_marked":          ChannelMarkedEvent{},
    "channel_created":         ChannelCreatedEvent{},
    "channel_joined":          ChannelJoinedEvent{},
    "channel_left":            ChannelLeftEvent{},
    "channel_deleted":         ChannelDeletedEvent{},
    "channel_rename":          ChannelRenameEvent{},
    "channel_archive":         ChannelArchiveEvent{},
    "channel_unarchive":       ChannelUnarchiveEvent{},
    "channel_history_changed": ChannelHistoryChangedEvent{},

    "dnd_updated":      DNDUpdatedEvent{},
    "dnd_updated_user": DNDUpdatedEvent{},

    "im_created":         IMCreatedEvent{},
    "im_open":            IMOpenEvent{},
    "im_close":           IMCloseEvent{},
    "im_marked":          IMMarkedEvent{},
    "im_history_changed": IMHistoryChangedEvent{},

    "group_marked":          GroupMarkedEvent{},
    "group_open":            GroupOpenEvent{},
    "group_joined":          GroupJoinedEvent{},
    "group_left":            GroupLeftEvent{},
    "group_close":           GroupCloseEvent{},
    "group_rename":          GroupRenameEvent{},
    "group_archive":         GroupArchiveEvent{},
    "group_unarchive":       GroupUnarchiveEvent{},
    "group_history_changed": GroupHistoryChangedEvent{},

    "file_created":         FileCreatedEvent{},
    "file_shared":          FileSharedEvent{},
    "file_unshared":        FileUnsharedEvent{},
    "file_public":          FilePublicEvent{},
    "file_private":         FilePrivateEvent{},
    "file_change":          FileChangeEvent{},
    "file_deleted":         FileDeletedEvent{},
    "file_comment_added":   FileCommentAddedEvent{},
    "file_comment_edited":  FileCommentEditedEvent{},
    "file_comment_deleted": FileCommentDeletedEvent{},

    "pin_added":   PinAddedEvent{},
    "pin_removed": PinRemovedEvent{},

    "star_added":   StarAddedEvent{},
    "star_removed": StarRemovedEvent{},

    "reaction_added":   ReactionAddedEvent{},
    "reaction_removed": ReactionRemovedEvent{},

    "pref_change": PrefChangeEvent{},

    "team_join":              TeamJoinEvent{},
    "team_rename":            TeamRenameEvent{},
    "team_pref_change":       TeamPrefChangeEvent{},
    "team_domain_change":     TeamDomainChangeEvent{},
    "team_migration_started": TeamMigrationStartedEvent{},

    "manual_presence_change": ManualPresenceChangeEvent{},

    "user_change": UserChangeEvent{},

    "emoji_changed": EmojiChangedEvent{},

    "commands_changed": CommandsChangedEvent{},

    "email_domain_changed": EmailDomainChangedEvent{},

    "bot_added":   BotAddedEvent{},
    "bot_changed": BotChangedEvent{},

    "accounts_changed": AccountsChangedEvent{},

    "reconnect_url": ReconnectUrlEvent{},
}


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

AckErrorEvent
ConnectedEvent
ConnectingEvent
ConnectionErrorEvent
DisconnectedEvent
HelloEvent
IncomingEventError
InvalidAuthEvent
LatencyReport
MessageTooLongEvent
OutgoingErrorEvent
UnmarshallingErrorEvent


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/30 14:05

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

    キャンセル

  • 2017/07/30 15:44

    ならばまずはGo自体を勉強したり、実際に動かしてどんな結果になるか確認しましょう。
    また、サンプルの`Printf`のフォーマットは`%v`なので値が表示されますが、`%#v`に変えると型も一緒に出力されるので、型名でソースを検索するとどんなフィールドがあるのか分かります。

    http://golang-jp.org/pkg/fmt/

    > 例えば、受け取ったメッセージの内容の確認方法はどうやったら確認できるのでしょうか
    もっと具体的に。方法が分からないにしても以下のようにいくつか段階があるので、どこまでできて、どこでつまっているのか書いてください。たとえば↑の回答はslackから通知を受け取れている前提で書きましたが、通知の受け取り方が分からないのなら頓珍漢な回答でしょう?

    * ソースコードを書いてもどうやって動かせばいいか分からない
    * コンパイル方法が分からない
    * コンパイルできるけど実行方法が分からない
    * 実行したプログラムがslackから通知を受ける方法が分からない
    * slackから通知を受け取っているけどその内容が分からない

    キャンセル

同じタグがついた質問を見る

  • Go

    572questions

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

  • Slack

    205questions

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