Twitter Api リムられチェック node.js

目次

Twitter

今更ながら、Twitterを頑張っているのですが、フォロワーを増やすのに相互フォローをよくすると思いますが、

中にはフォローされたらすぐフォローを外す悪質なユーザーがいます。

そんなの無視してもいいのですが、なんとなくイラッとするので、スクリプトを書いて(とりあえず)チェックするようにしてみました。

よくwebでログインしてチェックできるようなサービスがありますが、 なんとなく怪しいので、自分でやることにします。

非エンジニアでも、Twitter APIのトークン等だけ発行すればできなくも無い気がします、

実装はNode環境でJavascriptです。



応用すれば、このままスクリプトでアンフォローも可能そうですが、今回はフォロワーとフォローをチェックし、 自分がフォローしているユーザーの一覧を表示する実装となります。


必要なもの


準備

Twitter Developerに登録し、APP登録を行いますが、審査が入ります(ちゃんと記入すればだいたい通ると思います)。

Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報でしっかりまとめていただいているので

割愛致しますので、上記を参考にしてください。 ※今後余裕があったら自分で記事書きます。

そして、必要な

api key

secret

access token

access token secret

この4つをメモしておきましょう。


nodeパッケージインストール


プロジェクトフォルダ作成

$ mkdir twitter-bot
$ cd twitter-bot


初期化

$ yarn init


twitter クライアントインストール

$ yarn add twitter


キーなどの処理にdotenvインストール

$ yarn add dotenv

.env ファイルを作成し、

API_KEY=xxxxxxxxxxx
API_SECRET_KEY=xxxxxxxxxxxx
ACCESS_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ACCESS_TOKEN_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxx

こんな感じで、先程メモした内容を記載します


この辺までは以前のTwitter Api で検索したツイートを「いいね」する node.jsと同様です。


コード

index.js を作成(ファイル名はなんでも良し)

require('dotenv').config();

var Twitter = require('twitter');

// 初期化
var client = new Twitter({
  consumer_key: process.env.API_KEY,
  consumer_secret: process.env.API_SECRET_KEY,
  access_token_key: process.env.ACCESS_TOKEN,
  access_token_secret: process.env.ACCESS_TOKEN_SECRET
})

// 最大取得件数を指定。200がMAXだそうです
const count = 200

// Twitter API 実行
function fetchUser(url, params) {
  return new Promise((resolve, reject) => {
    client.get(url, params)
      .then(list => {
        // 連打すると制限に引っかかりレスポンスがかえってこなくなるので、3秒待つことにした
        setTimeout(() => {
          resolve(list)
        }, 3000)
      })
      .catch(error => {
        reject(error)
      })
  })
}


// 最高200件までしかとれないので、cursorを使って先のデータがなくなるまで
// Promise で 繰り返しデータを取得する
async function getUser(url) {
  var users = []
  var next_cursor = 1
  var params = {count: count}

  while(next_cursor != 0) {
    const list = await fetchUser(url, params)

    for (user of list.users) {
      users.push(user.name)
    }
    next_cursor = list.next_cursor
    params = {count: count, cursor: next_cursor}
    console.log(next_cursor)
  }

  return users
}

// フォローとフォロワーの配列の差分を返す
function getDiff(x, y, ope){
  x.forEach(item =>{
    if(!y.includes(item)){
      ope(item);
    }
  })
}

// promiseで実装
async function diff() {
  var friends = []
  var followers = []

  await getUser('friends/list').then((r) => {
    friends = r
  })
  await getUser('followers/list').then((r) => {
    followers = r
  })

  getDiff(friends, followers, item => console.log('friends include and followers do not inclode :' +item));
}

// 実行
diff()

process.on('unhandledRejection', console.dir);


実行

$ node index.js
> friends include and followers do not inclode :Newton Faulkner
> friends include and followers do not inclode :John Butler Trio
> friends include and followers do not inclode :Dropbox
> friends include and followers do not inclode :ARATA ISHIKAWA
> friends include and followers do not inclode :孫正義
> friends include and followers do not inclode :Google Devs Japan
> friends include and followers do not inclode :Lotus
> friends include and followers do not inclode :STS9

こんな感じで、自分がフォローのみしているユーザーの一覧が帰ってきますので、 あとは、Twitter上等で名前で検索し、どうするか考えましょうw

有名人は相互フォローではないですよね。さすがに

※注意 連続でやりすぎると、APIの制限等にかかり、停止、バンされる可能性があるので、自己責任でお願いします。ご注意下さい。

[ { message: 'Rate limit exceeded', code: 88 } ]

こんな結果が帰ってくるときは、数分待ってから実行しましょう


まとめ

自分的にもこんなチェックスクリプトを実装するなんて、なんてねちっこいんだろうっと思いますが、 きっと同じ境遇の方もいらっしゃるだろうと思い、

Twitter APIのお試しがてら、実装してみました。

Token等の審査が少々手間ですが、 インスタのGraphAPIと違い、Twitter APIは、叩けるようになれば色々できそうで楽しいですよ。

是非試してみて下さい。

U-chan ( Nobuyuki Ukai )

学生時代は建築やデザインを専攻していたが、Yahoo!Japanにエンジニアとして運良く入社し、2年半で波情報を配信する波伝説に転職。3年後、Yahoo!時代の先輩の立ち上げたベンチャーに転職。数年後、伊豆下田に移住し、ゲストハウスを開業しながらリモートでエンジニアを続けたが、焼肉店の開業とともに株式会社UKAIを立ち上げ、法人成り。その後、カフェとゲストハウスをもう一軒開業し、現在は焼肉店、カフェ、ゲストハウス2件目を運営。今季は自社Webサイトの立ち上げ予定!

comments powered by Disqus