TwitterのREST APIを使って色々してみる


プレミアムモルツアカウントのTweetをRTしたらビールが1ケース当たった!!
こういうの本当に当たるんだ!(当たり前)

じゃあこれ自動でRTしたら勝手に応募できるじゃん?てことでやってみます。

今回のコードはGitHubにあります

使うライブラリはnpmならnpm install twitter、yarnならyarn add twitterでインストールできます。
まずは自分のアカウントのタイムラインでも取得してみます。

1.Twitter developer credentialを取得

twitterアプリケーション管理画面からCreate New Appします。

  • name
  • description
  • website
  • callback url

callback urlは任意ですがそれ以外の3つは必須です。適当に入れましょう。
websiteは自分のブログやらtwitterのページやらのurlを入れておけばokです。

登録ができたらkeys and access tokensタブを開いて以下の4つをメモしておきます。

  • consumer_key
  • consumer_secret
  • access_token_key
  • access_token_secret

access_token2つが表示されていない場合はcreate access tokensみたいなボタン(忘れた)を押すと生成されます。

2.JavaScriptを書いてみる

main.js
const Twitter = require('twitter')

const consumer_key = '登録したアプリケーションのconsumer_key'
const consumer_secret = '登録したアプリケーションのconsumer_secret'
const access_token_key = '登録したアプリケーションのaccess_token_key'
const access_token_secret = '登録したアプリケーションのaccess_token_secret'

const client = new Twitter({
  consumer_key,
  consumer_secret,
  access_token_key,
  access_token_secret
})

const params = {count: 50}//200件まで取得可能。デフォルトは20
client.get('statuses/home_timeline', params, function(error, tweets, response) {
  if (!error) {
    console.log(tweets)
  }
})

これで自分のタイムラインが取得できます。
client.getの第一引数に取得対象を指定すれば色々とって来れます。リファレンスはこちら

他にもclient.postclient.deleteが利用できます。使い方は基本的には同じです。

3.実際にプレモルに応募してみる(と言いつつテストまで)

せっかくなのでPromiseとかasync/awaitとかアローファンクションとか積極的に使っていきましょう。Promiseについてはこれとかを参照してみて下さい。

プレモルアカウントのTweetを取ってくるコードは以下の通り。先ほど書いたコードをPromise化して、RTで応募できそうな"応募"・"RT"という単語を含んだツイートのid(t.id_str)を取ってきます。
このidですが、レスポンスにはid_strではなく単にidというのもありますが、id_strでないとうまくいきません。

main.js
async function getTweets() {
  return new Promise((resolve, reject) => {
    const retweets = []
    const params = {count: 200, include_rts: false, screen_name: 'PremiumMalts_jp', exclude_replies: true}
    client.get('statuses/user_timeline', params, (error, tweets, response) => {
      if (!error) {
        const regexp = /(?=.*応募)(?=.*RT)/g
        tweets.forEach(t => {
          if (regexp.test(t.text)) retweets.push(t.id_str)
        })
        resolve(retweets)
      }
    })
  })
}

リツイートする部分は以下の通り。

main.js
async function retweet(id) {
  return new Promise((res, rej) => {
    const params = {id}
    client.post('statuses/retweet', params, (err, tweets, response) => {
      if (!err) res(response)
      else rej(err)
    })
  })
}

リツイートのAPIは対象ツイートがすでにリツイート済みであった場合は無視されます。
今回は時間とかの判別をしていないので、とりあえず取ってこれたツイートの最初の1つだけRTするようにします。

main.js
async function main() {
  const ret = await getTweets()
  const result = await retweet(ret[0])
}
main()

これでok。週一で動くようにcronとかで設定しておけば自動で応募できると思います笑