各サービスのAPIを触ったサンプル集
- 各サービスのAPIアクセス実装は、個別ディレクトリを作成し、pkgとして実装する
- 各サービスのトークンは
token/<サービス名>_<用途>.json
に記載し、pkgディレクトリに配置しない token/*
を.gitignore
に記載し、トークンの漏洩を防ぐ- トークンはjsonフォーマットで記載し、各サービス内にjsonファイルごとに
Token<用途>
型を定義する
msg := "hello"
err := line.SendMessage(msg)
if err != nil {
panic(err)
}
LINE Notifyの仕様上、メッセージは必須項目のため画像を送信するときにもメッセージが必要。
以下の例ではローカルにあるtmp.jpg
を送信するとき。
SendImage
の第2引数でファイルを指定するが、io.Reader
型であればよい。
msg := "send an image"
filename := "./tmp.jpg"
f, err := os.Open(filename)
if err != nil {
panic(err)
}
defer f.Close()
if err := line.SendImage(msg, f, filename); err != nil {
panic(err)
}
- トークルーム用のトークンは、
<用途>
をトークルーム名(を英数にしたもの)
を使う
URL = "https://graph.facebook.com/v2.11/<user name>/feed"
f, err := facebook.GetFeed(URL)
if err != nil {
panic(err)
}
nlopes/slackとパッケージ名が衝突したので、自作packageの名前はmyslack
とする。
golang で始める Slack bot 開発 - at kaneshinにアクセストークンの取得方法とライブラリの使い方が書いてあるので参照。自分が使いそうなものをまとめると以下。
slack_<bot名>.json
内のapi_token
をもとにRTM(Real Time Message) connectionを作成し、goroutine化する。
rtm, err := myslack.NewRTM()
if err != nil {
panic(err)
}
go rtm.ManageConnection()
送信先のchannel
を設定する必要があり、channel
のid
はchannels.listで取得できる。
Generate tokens to test with here
からトークンを作った状態でTest Method
を押すとスペースのchannel listが得られる。
msg := "This is a sample message"
rtm.SendMessage(rtm.NewOutgoingMessage(msg, channel))
rtm.IncomingEvents
チャンネルを介して、イベントループを回す。
rtm.IncomingEvents.Data.(type)
でそれぞれのイベントごとに処理を変えられる。
下記のev.Channel
でメッセージが送られてきたchannelへレスポンスを返せる。
for {
select {
case msg := <-rtm.IncomingEvents:
switch ev := msg.Data.(type) {
case *slack.HelloEvent:
log.Print("bot start")
case *slack.MessageEvent:
log.Printf("Message: %v\n", ev)
rtm.SendMessage(rtm.NewOutgoingMessage("new message", ev.Channel))
case *slack.InvalidAuthEvent:
log.Print("Invalid credentials")
return
}
}
}
- API tokenはbotごとに割り当てられるため、
<用途>
をbot名
としたものを使う
chan
を使うと簡単に書ける。以下ではslackからメッセージを受信したら、そのメッセージをLINEに送る例
package main
import (
"log"
"github.com/nlopes/slack"
"./line"
"./myslack"
)
func main() {
// メッセージをやり取りするためのchannel
ch := make(chan string)
// slack bot起動
go func() {
rtm, err := myslack.NewRTM()
if err != nil {
panic(err)
}
go rtm.ManageConnection()
for {
select {
case msg := <-rtm.IncomingEvents: // slackからのメッセージ受信
switch ev := msg.Data.(type) {
case *slack.MessageEvent:
log.Print(ev)
ch <- ev.Msg.Text
case *slack.HelloEvent:
log.Print("bot start")
case *slack.InvalidAuthEvent:
log.Print("Invalid credentials")
}
}
}
}()
for {
select {
case msg := <-ch: // LINEにメッセージを送る
log.Print("message recieved")
err := line.SendMessage(msg)
if err != nil {
panic(err)
}
}
}
}
func main() {
t := time.NewTicker(60 * time.Second)
defer t.Stop()
for {
select {
case <-t.C:
doSomething()
}
}
}