この記事は3年以上前に書かれた記事で内容が古い可能性があります
golangでbot作成
兎にも角にもgoに慣れよう、とのことで、slack botをgoで作ってみた。
以下の記事を大変参考にしました。
今更やけど、Go言語でSlack APIを使ってみた!!
動きとしては、とあるキーワード(今回は#golang)のtweetsを拾ってslackにポストするもの。
# go get anaconda
tweet apiを使うにはanacondaがいいらしい。
% go get github.com/ChimeraCoder/anaconda
# GOPATH/GOROOTの定義
% export GOPATH=""
# goのファイル構造
ファイル構造はこんな感じに。
. ├── bin ├── pkg │ └── darwin_amd64 │ └── github.com └── src ├── github.com │ ├── ChimeraCoder │ ├── azr │ ├── dustin │ └── garyburd ├── main.go └── passwordlist │ └── passwordlist.go
実行ファイルはsrcの下に置くのがお決まり
Goコードの書き方
Goコードはワークスペース内に置いておく必要があります。ワークスペースはルートに以下の3つのディレクトリを持つディレクトリ階層です。
srcはパッケージに構成された(1ディレクトリに1パッケージ)Goのソースファイルを含み、
pkgはパッケージオブジェクトを含み、
binは実行形式コマンドを含みます。
# 実行ファイルの用意
package main import ( "encoding/json" "io/ioutil" "net/http" //"fmt" "net/url" "github.com/ChimeraCoder/anaconda" "passwordlist" ) func twitter_search() []string { anaconda.SetConsumerKey(passwordlist.ConsumerKey) anaconda.SetConsumerSecret(passwordlist.ConsumerSecret) api := anaconda.NewTwitterApi(passwordlist.AccessToken, passwordlist.AccessTokenSecret) v := url.Values{} v.Set("count", "10") searchResult, _ := api.GetSearch("#golang", v) twtlst := make([]string, 10) for i, tweet := range searchResult.Statuses { twtlst[i] = "\n\n" + tweet.CreatedAt + " " + tweet.Text + "\n\n" _ = twtlst //avoiding error //fmt.Printf("[%s] %s\n", tweet.CreatedAt, tweet.Text) } return twtlst } var ( IncomingUrl string = passwordlist.Incomingurl ) type Slack struct { Text string `json:"text"` Username string `json:"username"` Icon_emoji string `json:"icon_emoji"` Icon_url string `json:"icon_url"` Channel string `json:"channel"` } func main() { output_text := "" output_text_2 := "" for _, ot := range twitter_search() { output_text_2 = output_text + ot output_text = output_text_2 _ = output_text } //fmt.Print(output_text) params, _ := json.Marshal(Slack{ output_text, passwordlist.Username, passwordlist.Icon_emoji, passwordlist.Icon_url, passwordlist.Channel}) resp, _ := http.PostForm( IncomingUrl, url.Values{"payload": {string(params)}}, ) body, _ := ioutil.ReadAll(resp.Body) defer resp.Body.Close() println(string(body)) }
# 変数を他パッケージから読み込む
先ほどの引用、よく見ると「1ディレクトリに1パッケージ」と書いてある。
srcはパッケージに構成された(1ディレクトリに1パッケージ)Goのソースファイルを含み、
素直に、src配下にディレクトリを作成して変数を収めるファイルを配置
変数を収めるコードの冒頭にパッケージ名を定義する(goファイルはどれもパッケージの必要)
package passwordlist var ConsumerKey = "ホゲホゲ ...
この時、変数の冒頭は必ず「大文字」で記述する!
じゃないとこうなる
./main.go:10: imported and not used: "passwordlist" ./main.go:15: undefined: consumerKey
読み込むファイルでは、packageとしてimportすること、
「パッケージ名.変数名」で記載することを忘れない
import ( "passwordlist" ) var ( IncomingUrl string = passwordlist.Incomingurl )
# 実行
これで問題なく動くはず
% go run main.go
意味はわからないがtweetは拾えている。