プレミアムモルツアカウントの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を書いてみる
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.post
とclient.delete
が利用できます。使い方は基本的には同じです。
##3.実際にプレモルに応募してみる(と言いつつテストまで)
せっかくなのでPromiseとかasync/awaitとかアローファンクションとか積極的に使っていきましょう。Promiseについてはこれとかを参照してみて下さい。
プレモルアカウントのTweetを取ってくるコードは以下の通り。先ほど書いたコードをPromise化して、RTで応募できそうな"応募"・"RT"という単語を含んだツイートのid(t.id_str
)を取ってきます。
このidですが、レスポンスにはid_str
ではなく単にid
というのもありますが、id_str
でないとうまくいきません。
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)
}
})
})
}
リツイートする部分は以下の通り。
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するようにします。
async function main() {
const ret = await getTweets()
const result = await retweet(ret[0])
}
main()
これでok。週一で動くようにcronとかで設定しておけば自動で応募できると思います笑