概要
土曜の昼下がり、特に何をするでもなく、やる気が出なかったので、手元の日めくりカレンダーを毎日1回つぶやいてくれるTwitterBotでも作ろうかなと考えて、Goで作ってみました。ただ、そこらへんのbotサービスに登録するのではつまらないので、自分でロジックも考えてみようという意図です。あと、個人的に1時間に一回とか呟くbotは自分のタイムラインがうまってしまってノイズになるので、毎日1回ツイートするくらいのゆるゆるbotにしました。TwitterのAPIを処理してくれるGoのパッケージanaconda
を使うとともに、ticker
で時間の概念を導入してみました。
Twitter APIの取得
TwitterでTweetしたり、タイムラインを取得したりするためには、APIキーとアクセストークンが必要になります。Twitterアカウントを作ったら、APIを使うために次のリンクから登録しましょう。
https://apps.twitter.com/
実装で使うのは、API Key
,API Secret
,Access Token
,Access Token Secret
の4つになります。
Goファイルの作成
フォルダの構造は以下のようになり、keys.go
,text.go
,main.go
を3つのファイルを作ります。
tweetbot/
├── keys
│ └── keys.go
├── text
│ └── text.go
├── main.go
package keys
import (
"github.com/ChimeraCoder/anaconda"
)
func GetTwitterApi() *anaconda.TwitterApi {
anaconda.SetConsumerKey("")
anaconda.SetConsumerSecret("")
api := anaconda.NewTwitterApi("", "")
return api
}
先ほどのAPI Key
,API Secret
,Access Token
,Access Token Secret
を順番に入れていくだけです。
package text
import (
"time"
"fmt"
)
func ChooseTweet()string{
TweetList := [31]string{
"投稿の内容を書く" ,
//省略
}
d := time.Now().Day()
m := time.Now().Month()
TweetContent := TweetList[d-1]
TweetOfToday := fmt.Sprintf("【%d月%d日】\n %s",m,d, TweetContent)
return TweetOfToday
}
配列TweetList
から今日呟く内容を抽出する関数ChooseTweet()
を作ります。
Twitterでは、同じ内容を呟くと、Status is a duplicate
というエラーが出るので、最初に【何月何日】を追加することにしました。
package main
import (
"fmt"
"time"
. "fmt"
. "./keys"
. "github.com/***/tweetbot/text" //text.goをgithubにあげて、go getをした
)
func main() {
chStop := make(chan int, 1)
TimerFunc(chStop)
time.Sleep(time.Hour * 24 * 365)
chStop <- 0 // Tickerをstopさせるメッセージ
close(chStop)
time.Sleep(time.Second * 1)
fmt.Println("Application End.")
}
func TimerFunc(stopTimer chan int) {
go func() {
ticker := time.NewTicker(24 * time.Hour) // 1日間隔のTicker
LOOP:
for {
select {
case <-ticker.C:
api := GetTwitterApi()
text := ChooseTweet()
tweet, err := api.PostTweet(text, nil)
if err != nil {
panic(err)
}
Print(tweet.Text)
//}
case <-stopTimer:
fmt.Println("Timer stop.")
ticker.Stop()
break LOOP
}
}
fmt.Println("timerfunc end.")
}()
}
バックグラウンドで実行
$ go build main.go -o tweetbot
$ ./tweetbot & #バックグラウンドで実行
下記のコマンドでtwwetbotが動いているプロセスを確認できます。
$ ps aux |grep tweetbot
止めたいときは、kill
します。
$ kill プロセス番号
まとめ
毎日一回しかTweetしないなら、手動でいい説が濃厚...
今回作ったbotもぜひフォローしてください!
Twitter @inspireverybody
参考
https://qiita.com/konojunya/items/d51672f900f4912a5563
https://blog.y-yuki.net/entry/2017/04/29/000000