LoginSignup
2
4

More than 3 years have passed since last update.

Twitter API v2 でキーワードから直近1週間分ツイートを収集する

Posted at

8月12日(米現地時間)、Twitter API v2 がアーリーアクセスで正式リリースされました。
https://developer.twitter.com/en/docs/twitter-api/early-access

そこで早速、直近1週間分のツイートのキーワード検索ができる recent search API でツイート集計・保存するコードを作ったので、一例として共有します。

ソースコード

node.js
'use strict'

const fs = require('fs');
const axios = require('axios');
const Qs = require('qs');
const sleep = msec => new Promise(resolve => setTimeout(resolve, msec));

// Set target query
const target_query = 'qiita.com';

// Format nested params correctly
axios.interceptors.request.use(config => {
  config.paramsSerializer = params => {
    // Qs is not included in the Axios package
    return Qs.stringify(params, {
      allowDots: true,
      arrayFormat: "brackets",
      encode: false
    });
  };
  return config;
});

// Set API config
const config_common = {
  method: 'get',
  baseURL: 'https://api.twitter.com/2/tweets',
  url: '/search/recent',
  headers: { 
    Authorization: 'Bearer <YOUR_BEARER_TOKEN>', 
  }
};
const init_config = Object.create(config_common);
const loop_config = Object.create(config_common);

// Set params
init_config.params = {
    query: target_query,
    start_time: '<STRAT_TIME>',  // ex. 2020-09-01T00:00:00.000Z
    end_time: '<END_TIME>',      // ex. 2020-09-03T00:00:00.000Z
    expansions: 'author_id',
    tweet: {
      fields: 'created_at',
    },
  };

let output = [];

const getReq = cfg => {
  return axios(cfg)
    .then(function (res) {
      output = output.concat(res.data.data);

      if (res.data.meta.result_count === 10 && Date.parse(res.data.data[res.data.meta.result_count-1].created_at) > Date.parse(init_config.params.start_time)) {
        // Update params
        loop_config.params = {
          query: target_query,
          until_id: res.data.meta.oldest_id,
          expansions: 'author_id',
          tweet: {
            fields: 'created_at',
          },
        }
        return true;
      }
      else {
        return false;
      }
    })
    .catch(function (error) {
      console.log(error);
    });
}

const loop = async(result) => {
  await sleep(3000);
  if(result) {
    const result = await getReq(loop_config);
    await loop(result);
  }
  else await fs.writeFile('tweetList.json', JSON.stringify(output, null, '    '), (err)=>{
    if(err) console.log(`error: ${err}`);
  });
}

// Run
(async () => {
  const result = await getReq(init_config);
  await loop(result);
})();

実行後、保存したデータ(qiita.comをクエリにした例)

[
    {
        "id": "1300598977407016961",
        "text": "RT @omiita_atiimo: 畳み込みよ、さようなら。畳み込み層を全てSelf-Attentionに取り替えた新時代のモデル「SAN」の解説記事を書きました!\n\nhttps://t.co/BXydQsNpf5\n\nSAだけで従来のCNNよりも優れた精度/ロバスト性を示して…",
        "created_at": "2020-09-01T00:58:54.000Z",
        "author_id": "1123585826623868934"
    },
    {
        "id": "1300598327080177670",
        "text": "RT @ErdLaravel: Laravel 爆速プロトタイプ作成ツール「 https://t.co/4QQvMWoqiJ 」\nER図テーブル設計で『Migrationコード』を自動生成!!\n世界 900人以上を超える開発者に使用してもらっています。\nDB設計の勉強にも使って…",
        "created_at": "2020-09-01T00:56:19.000Z",
        "author_id": "1042801642460987392"
    },
    {
        "id": "1300598272239652866",
        "text": "RT @ErdLaravel: Laravel 爆速プロトタイプ作成ツール「 https://t.co/4QQvMWoqiJ 」\nER図テーブル設計で『Migrationコード』を自動生成!!\n世界 900人以上を超える開発者に使用してもらっています。\nDB設計の勉強にも使って…",
        "created_at": "2020-09-01T00:56:06.000Z",
        "author_id": "712515194925219840"
    },
    ...
}
2
4
0

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
2
4