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である。

Incoming Webhooks | Slack

上記から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に通知が来ているので確認してみると 以下のように天気が通知されていることがわかります。

f:id:suga-tech3:20160827175318p:plain

無事本田翼さんから天気予報が届いたことが確認できました。

Goをしてみたまとめ

  • コンパイル型を使ったことがそんなに多くないので型宣言を忘れがちになった

  • 1週間でここまでしたがまだまだメソッドなど多く奥が深い

  • GETリクエスト以外にもPOSTだけで5通りもの方法がある

  • エラーがわかりやすいため学習が比較的スムーズにできた

Goを一週間してきたことをまとめてみましたが まだまだここからがスタートなので次は並列処理、ポインタの理解をより深めてマスターして記事を公開していきます。