1週間Go言語を勉強して登壇してみた vol.2
Go言語 × SlackAPI
この記事ではGo言語とslackAPIを用いてメッセージを送ってみようと思う
Slackとは
主にビジネス向けのチャットツールを使っている Slackは2013年8月のリリース後、わずか2年半でDAU200万を突破、2016年5月時点ではDAU300万を突破した、アメリカ発のサービスである。
背景
このままではLTでGoの文法紹介になってしまうため 何かものを作ろうと思った。
台風が最近多く天気が不安なことがあるのでlivedoorの天気予報RSSを利用して明日の天気と気温を通知してくれるサービスを作ってみた。
SlackAPI(Incomming WebHooks)を使用する(LT登壇まであと3日)
- Incomming WebHooksとは?
=Slackが発行するURLへPOSTするとSlackにメッセージが投稿される簡単にメッセージを送ることができるAPIである。
上記からTokenを取得する。
Goを使ってslackに通知してみた(LT登壇まであと2日)
http.clientを使ってGETリクエストを送信してみた。
実際のソースは以下である
package main import ( "bytes" "net/http" "net/url" "fmt" ) var( token string = ""//Token追記 apiUrl string = "https://slack.com/api/chat.postMessage" ) func main() { data := url.Values{} data.Set("token",token) data.Add("channel","#general") data.Add("username","testBot") data.Add("text", "test") client := &http.Client{} r, _ := http.NewRequest("POST", fmt.Sprintf("%s",apiUrl), bytes.NewBufferString(data.Encode())) r.Header.Add("Content-Type", "application/x-www-form-urlencoded") resp, _ := client.Do(r) fmt.Println(resp.Status) }
実行するとこれだけでslackにメッセージを送ることができます。
Goでslackに天気予報通知してみた(LT登壇まであと1日)
登壇まであと残すところあと1日
以下のlivedoorRSSを用いて東京の天気予報を取得する。
http://weather.livedoor.com/forecast/rss/area/130010.xml
package main //packageをimport import ( "bytes" "net/http" "net/url" "fmt" "encoding/xml" "io/ioutil" "log" ) //変数宣言 var( //SlackAPIトークン token string = "" //SlackApiのメッセージリクエストURL apiUrl string = "https://slack.com/api/chat.postMessage" //livedoor天気予報のRSS(東京) FEED_URL string = "http://weather.livedoor.com/forecast/rss/area/130010.xml" ) //構造体 type WeatherHack struct { Title string `xml:"channel>title"` Description []string `xml:"channel>item>description"` } func main() { //getWeather関数にRSSのURLを渡す wh, err := getWeather(FEED_URL) //error処理 if err != nil { log.Fatalf("Log: %v", err) return } //URLに生成するデータを追加 data := url.Values{} data.Set("token",token) data.Add("channel","#general") data.Add("username","天気予報Bot") data.Add("icon_url","http:~~~.jpg") data.Add("text", wh.Description[2]) fmt.Println(data) //http.clientを使用してGETリクエスト送信 client := &http.Client{} r, _ := http.NewRequest("POST", fmt.Sprintf("%s",apiUrl), bytes.NewBufferString(data.Encode())) r.Header.Add("Content-Type", "application/x-www-form-urlencoded") resp, _ := client.Do(r) fmt.Println(resp.Status) } //天気情報を取得する func getWeather(feed string) (p *WeatherHack, err error) { //http.Getメソッドを利用してGETリクエストを送る res, err := http.Get(feed) if err != nil { return nil, err } b, err := ioutil.ReadAll(res.Body) if err != nil { return nil, err } wh := new(WeatherHack) err = xml.Unmarshal(b, &wh) return wh, err }
上記をターミナルにて以下コマンドを実行する
go run ファイル名.go
実行ができたら 200 OKと返ってくる
slackに通知が来ているので確認してみると 以下のように天気が通知されていることがわかります。
無事本田翼さんから天気予報が届いたことが確認できました。
Goをしてみたまとめ
コンパイル型を使ったことがそんなに多くないので型宣言を忘れがちになった
1週間でここまでしたがまだまだメソッドなど多く奥が深い
GETリクエスト以外にもPOSTだけで5通りもの方法がある
エラーがわかりやすいため学習が比較的スムーズにできた
Goを一週間してきたことをまとめてみましたが まだまだここからがスタートなので次は並列処理、ポインタの理解をより深めてマスターして記事を公開していきます。