もっとTwitterを活用したい

こんにちは。
デザイン・システム室の 大内航です。

モチベーション

弊社もTwitter公式アカウントを作って情報発信をしていますが、単に情報発信をするだけでなく、より多くのお客様に弊社のサービスを知ってもらうためにはどうしたらよいか?ということでTwitter APIを活用する様々なユースケースを考えてみます。

1.Twitter APIを有効化する

TwitterのAPIを利用したサービスは昔から数多くあります。しかし、TwitterのAPIは徐々に締め付けが厳しくなりました。2018年には特徴だったUserStream APIが廃止され、そのAPIを利用する多くのサービスが影響を受けたようです。(最近復活するかもという話があります)また、APIの有効化に関しても以前に比べるとかなり厳しくなっています。
手順自体はネット上にたくさんあるので割愛します。

2.実際にやりたいこと

実際にTwitter APIを使ってできそうなことを考えてみます。(Twitter APIは非常に多くの種類がありますが、今回は無料で扱えるもののみを紹介します。)

1.どんなフォロワーさんがいるか知りたい

今、弊社のアカウントをどういう層がフォローしてくださってるのか?フォロワー一覧を取得して調べてみたいことは多いと思います。実はTwitterのダッシュボードから確認できますが(性別・年代・地域・興味など)、十分なサンプル数がいないとうまいこと表示してくれないので、自前でやってみましょう。

package main

import (
	"fmt"

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

const (
	consumerKey       = `*****`
	consumerSecret    = `*****`
	accessToken       = `*****`
	accessTokenSecret = `*****`
	screen_name       = "YOUR_ACCOUNT",
)

func main() {

	config := oauth1.NewConfig(consumerKey, consumerSecret)
	token := oauth1.NewToken(accessToken, accessTokenSecret)
	httpClient := config.Client(oauth1.NoContext, token)
	twitterClient := twitter.NewClient(httpClient)

	var initialCursor int64 = -1

	for {
		follower, _, _ := twitterClient.Followers.List(&twitter.FollowerListParams{
			Cursor:              initialCursor,
			ScreenName:          screen_name,
			SkipStatus:          &[]bool{true}[0],
			IncludeUserEntities: &[]bool{false}[0],
			Count:               10,
		})

		if len(follower.Users) == 0 {
			break
		}

		initialCursor = follower.NextCursor

		for _, user := range follower.Users {
//単純にフォロワーを並べているだけだが、実際はこの後、例えばCOTOHA APIなどを利用してユーザーの属性を取得したりできる
			fmt.Printf("%s, %s, %d \n", user.ScreenName, user.Description, user.FollowersCount)
		}

	}
}

2.どのTweetがどのくらい見られている知りたい

Twitterの個別のTweetからも参照できる「インプレッション」の値は標準では参照できるAPIがありませんが、β版のTweetMetrics APIで取得できます。(非公式API・有料版APIではまた別の情報が取得できます。)

3.どんなTweetが人気か知りたい

①Twitterのトレンド情報に上がってくるものを人気とする、②RT数やFav数が高いものを人気とするの2通りあると思いますが、②の方はうまいこと上位のTweetを持ってくる方法がわからなかったので、①のトレンド情報はTrend APIで取得できます。

4.自分に関係することがつぶやかれたときに知りたい

例えば、自社の商品やサービスに付いてつぶやかれたときに、その内容を知りたい、という時があると思います。また、テレビやネットプロモーションをしたときのリアルタイムの反応を知りたいときもあるかもしれません。
1.Search APIで取得する
2.Filtered Stream APIで取得する
の2点があります。
今回は2の方でやります。(後ほどコードはあげます)

5.リツイートキャンペーンをしたい

Twitterではよく行われている「RT」と「フォロー」で抽選を行うキャンペーンですが、実際にやろうと思うとTwitter APIでもなかなか難しいです。多くはおそらく外部のツールを使ってやっていると思いますが、APIを使ってやるとしたら以下の3つのうちどれかになると思います。
1. Retweet APIを使う
2. Search APIを使う
3. Account Activity APIを使う
今回は2を使って行いたいと思います。
1.はユーザー集団を取得できますがいつリツートされたか

package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
	"os"
	"strings"

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

const (
	targetTweetStatus = ***************
	consumerKey       = `********`
	consumerSecret    = `********`
	accessToken       = `********`
	accessTokenSecret = `********`
	until             = "2020-1-31"
)

type Result struct {
	Name        string   `json:"name"`
	ScreenName  string   `json:"screen_name"`
	ID          int      `json:"id"`
	IDStr       string   `json:"id_str"`
	Connections []string `json:"connections"`
}

func friendshipLookup(client *http.Client, userList []string) ([]Result, error) {

	values := url.Values{}
	values.Add("screen_name", strings.Join(userList, ","))

	request, err := http.NewRequest("GET", "https://api.twitter.com/1.1/friendships/lookup.json"+"?"+values.Encode(), nil)
	if err != nil {
		return nil, err
	}
	response, err := client.Do(request)
	if err != nil {
		return nil, err
	}

	b, err := ioutil.ReadAll(response.Body)
	if err != nil {
		return nil, err
	}

	var result []Result
	json.Unmarshal(b, &result)
	response.Body.Close()

	return result, nil
}

func main() {
	var (
		targetTweetStatus = flag.Int64("int64", 0, "int64 flag")
		until             = flag.String("str", "default", "string flag")
	)
	config := oauth1.NewConfig(consumerKey, consumerSecret)
	token := oauth1.NewToken(accessToken, accessTokenSecret)
	httpClient := config.Client(oauth1.NoContext, token)
	twitterClient := twitter.NewClient(httpClient)

	targetTweet, _, _ := twitterClient.Statuses.Show(*targetTweetStatus, nil)

	tweetText := string([]rune(targetTweet.Text)[:45])
	fmt.Println(tweetText)
	var maxID int64 = 9000000000000000000

	for {
		search, _, _ := twitterClient.Search.Tweets(&twitter.SearchTweetParams{
			Count:   100,
			MaxID:   maxID,
			Query:   tweetText,
			SinceID: *targetTweetStatus,
			Until:   until,
		})

		if len(search.Statuses) == 0 {
			break
		}

		tmpLines := ""
		a := []string{}
		for _, status := range search.Statuses {
			a = append(a, status.User.ScreenName)
		}
		fmt.Println(strings.Join(a, ","))
		result, err := friendshipLookup(httpClient, a)
		if err != nil {
			fmt.Println(err)
		}
		for _, status := range search.Statuses {
			var connection string
			for _, user := range result {
				fmt.Println(user.ScreenName)
				if user.ScreenName == status.User.ScreenName {
					connection = strings.Join(user.Connections, ",")
					fmt.Println(connection)
				}
			}
			link := "https://twitter.com/" + status.User.ScreenName
			tmpLines += fmt.Sprintf("%s, %s, %s, %s, %d\n",
				link,
				status.User.Name,
				connection,
				status.CreatedAt,
				status.ID,
			)
			maxID = status.ID - 1
		}
	}
}

3.まとめ

今回はいくつかのユースケースに基づいてTwitter APIを利用してデータを取得する方法を列挙しましたが、実際にはデータを集計するだけではだめで、それを利用して企画の立案や評価を行う必要があります。続きがあれば次回以降進めていきたいと思います。

現在デザインシステム室では、新しいメンバーを募集しています。
少しでも興味を持たれた方、ぜひご応募ください。
お待ちしております!

募集要項およびエントリーフォーム >