LoginSignup
44

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-04

プレミアムモルツアカウントの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とかで設定しておけば自動で応募できると思います笑

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44