エンジニア日記

日々の開発あれこれ

Goでtwitterに投稿するプログラムを作成

Goでブログを更新したらブログのタイトルを入力して、定型文を投稿してくれるプログラムを作ってみた。

  • anacondaというtwitter投稿モジュールを使用
  • twitterのアクセストークンなどの情報は外部ファイルに定義
  • 投稿する定型文も外部ファイルとして読み込む
  • コマンドを叩きタイトルを入力する
  • 投稿する内容を表示し、実行可否を聞く
  • 回答に合わせて処理を行う

anacondaをダウンロード

1
go get github.com/ChimeraCoder/anaconda

ソース

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "github.com/ChimeraCoder/anaconda"
    "os"
)

type Config struct {
    ConsumerKey string `json:"consumer_key"`
    ConsumerSecret string `json:"consumer_secret"`
    AccessToken string `json:"access_token"`
    AccessTokenSecret string `json:"access_token_secret"`
}

func main(){

    // ブログのtitleを受け取る
    var title string
    fmt.Print("title: ")
    fmt.Scan(&title)

    // 投稿のフォーマットファイルを読み込み、タイトルを反映して内容の確認
    root_path := "/hoge/fuga/"
    buff_contents, err := ioutil.ReadFile(root_path+"twitter_post/post_contents.txt")
    if err != nil {
        fmt.Println(err)
        os.Exit(-1)
    }
    contents := string(buff_contents)
    contents = fmt.Sprintf(contents, title)
    fmt.Print("\n"+contents+"\n")

    // twitterに投稿するか判断
    fmt.Println("twitterに投稿しますか? (Y/n)")
    var answer string
    fmt.Scan(&answer)
    if answer != "Y" {
        fmt.Println("投稿せずに処理を終了します。")
        os.Exit(1)
    }

    // twitterのaccess_tokenなどを設定ファイルから取得
    file, err := ioutil.ReadFile(root_path+"twitter_post/config.json")
    if err != nil {
        fmt.Println(err)
        os.Exit(-2)
    }
    var config Config
    json.Unmarshal(file, &config)

    // twitter投稿
    anaconda.SetConsumerKey(config.ConsumerKey)
    anaconda.SetConsumerSecret(config.ConsumerSecret)
    api := anaconda.NewTwitterApi(config.AccessToken, config.AccessTokenSecret)
    _, twitter_err := api.PostTweet(contents, nil)
    if twitter_err != nil {
        fmt.Println(twitter_err)
        os.Exit(-3)
    }
    fmt.Println("Twitterに投稿しました。")
}

少しはまったこと

_, err := api.PostTweet(contents, nil)
と実装したところ下記コンパイルエラーとなった。

1
twitter_post/twitter_post.go:58: no new variables on left side of :=

原因は同じ変数名の宣言は同じブロックでは1度しかできないためのエラーだった。

でも、
file, err := ioutil.ReadFile(root_path+“twitter_post/config.json”)
この処理の時点でerrを宣言するのは2回目なのでこのときにエラーが起こらないのはなぜだろうと思っていたところ、

省略形式の時は宣言する変数のうち少なくともひとつがブランク変数(_)ではない、 新しい変数であれば、他は再宣言ではなく単なる代入として扱えます。

とのことでした。