【Go】TwitterAppでツイートするプログラムを作った

Twitter bot作成とかで検索するとPHPを使ったのが多く、情報多いしPHPでやったほうがいいと思う

「Goの勉強してるし、きっと誰かPHPでできること作ってるよね」という気持ちで始めたところ、githubで「go-twitter」というものを見つけたので使ってみた
ありがたや

Appの認証に『oauth1』(https://github.com/dghubble/oauth1
APIへの通信に『go-twitter』(https://github.com/dghubble/go-twitter
を使った

つくろう

以下の2つをおこなう

「Twitter App の登録」
「Goのプログラム作成」

Goはコンパイルするやつだから多分スクリプトとは言わないんじゃないかな(適当

Twitter App の登録

プログラムでツイートするためには「Twitter Application Management」で自分のAppを登録する

このページを参考にした:https://webkaru.net/php/twitter-bot/

Appを登録したら「Keys and Access Tokens」のタブを開き、
プログラムで使う以下の4つを見つけてメモしておく
・Consumer Key
・Consumer Secret
・Access Token
・Access Token Secret

Goのプログラム作成

いきなりソース書くマン(おことわり)

ただ単に文章をツイートするだけなら以下のようになった

package main

import (
	"log"

	"github.com/dghubble/go-twitter/twitter"
	"github.com/dghubble/oauth1"
)

func main() {
	consumerKey := "Consumer Key"
	consumerSecret := "Consumer Secret"
	accessToken := "Access Token"
	accessSecret := "Access Token Secret"

	config := oauth1.NewConfig(consumerKey, consumerSecret)
	token := oauth1.NewToken(accessToken, accessSecret)

	httpClient := config.Client(oauth1.NoContext, token)

	client := twitter.NewClient(httpClient)

	txt := "ツイートする本文"

	//tweet, res, err := client.Statuses.Update("ツイートする本文", nil)
	t, r, e := client.Statuses.Update(txt, nil)
	if e != nil {
		log.Println("err", e)
	}
	// ツイート情報とhttpレスポンス
	log.Println("tweet", r)
	log.Println("res", r)
}

画像つきツイートもやってみよう+言い訳

この記事を書いてるときの私
・画像つきツイートは「go-twitter」が楽だ
・画像のアップロードは「anaconda」が楽だ

Go言語でTwitterをするなら「anaconda」のほうが知られてるらしい(今更)

「anaconda」で画像を複数付けてツイートの方法少し調べたがよくわからない

「go-twitter」の方はそれが簡単だった
「go-twitter」は画像のアップロード方法がよくわからない

「anaconda」は画像のアップロードが簡単だった

そこで「方法探すの面倒だから、画像アップロードはanaconda、ツイートはgo-twitterでいいや」となっている

ということで画像つきツイートの話

・画像アップロードを「anaconda」でやる
・mediaのIDを使って画像つきツイートを「go-twitter」でやる

なお、「それぞれのプログラムが単体で動いたほうが理解しやすいのでは?」という個人的な感覚で書き分けてる

画像アップロードを「anaconda」でやる

アップロードしてmediaのidを受け取るだけ

package main

import (
	"log"

	"github.com/ChimeraCoder/anaconda"
)

func main() {
	consumerKey := "Consumer Key"
	consumerSecret := "Consumer Secret"
	accessToken := "Access Token"
	accessSecret := "Access Token Secret"

	api := anaconda.NewTwitterApiWithCredentials(accessToken, accessSecret, consumerKey, consumerSecret)

	media, err := api.UploadMedia("画像をbase64に変換したコードをここに書く")
	if err != nil {
		log.Fatal(err)
	}
	// レスポンス全体
	// log.Println(media)

	// 画像のmedia id、typeは int64
	log.Println(media.MediaID)
}

mediaのIDを使って画像つきツイートを「go-twitter」でやる

画像なしツイートとほぼ同じ

package main

import (
	"log"

	"github.com/dghubble/go-twitter/twitter"
	"github.com/dghubble/oauth1"
)

func main() {
	consumerKey := "Consumer Key"
	consumerSecret := "Consumer Secret"
	accessToken := "Access Token"
	accessSecret := "Access Token Secret"

	config := oauth1.NewConfig(consumerKey, consumerSecret)
	token := oauth1.NewToken(accessToken, accessSecret)

	httpClient := config.Client(oauth1.NoContext, token)

	client := twitter.NewClient(httpClient)

	txt := "ツイートする本文"
	imgIDs := []int64{
		"ここにmedia idを書く",
		"ここにmedia idを書く 複数可",
	}
	params := &twitter.StatusUpdateParams{
		MediaIds: imgIDs, // MediaIDで画像を投稿
	}

	t, r, e := client.Statuses.Update(txt, params)
	if e != nil {
		log.Println("err", e)
	}
	log.Println("tweet", r)
	log.Println("res", r)
}

とりあえずおわり

ほんとは「go-twitter」か「anaconda」の片方だけで済ませたい

もしも解決したら更新しよう

記述量が増えると「どっかで書き損じがあるんじゃなかろうかー」という気持ちが芽生える

‘ω’)ノシ

2 件のコメント

  • anacondaでの複数画像ツイート
    url.Values(media_ids)に、media_idをカンマ区切りにしたstringをセットすれば出来ますよ

    • ありがとうございます!
      最近ちょっとプログラミングから離れててすぐに確認できませんが、次やるときに参考にします!

  • コメントを残す

    メールアドレスが公開されることはありません。