LoginSignup
12
6

More than 5 years have passed since last update.

Goで定期的にTweetするTwitter Botを作ってみる

Last updated at Posted at 2018-09-17

概要

土曜の昼下がり、特に何をするでもなく、やる気が出なかったので、手元の日めくりカレンダーを毎日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
keys.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を順番に入れていくだけです。

text.go
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というエラーが出るので、最初に【何月何日】を追加することにしました。

main.go
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

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6