Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
56
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@crane496

ユーザーを指定してその人のTweetを全て取得する

学部3年の後期実験の一つである情報可視化実験において、データセットとして用いるために特定の人のtweetを全て取得したかったのでその方法についてまとめてみた。

TwitterAPIを用いない方法

twitter公式にログインして、設定→ユーザー情報→tweet履歴をリクエストから
全てのtweetが含まれているcsvファイルを取得できる。自分のアカウントのtweetを取得するだけならこの方法が最も早い。20151209-1.PNG

試した方法

情報を可視化するためにd3.jsを用いていたので言語はJavaScriptを用いた。
JavaScriptでtwitterAPIを叩く方法についてはこのページを参考にした。
ここからoauth.js, sha1.jsをダウンロードして適切な場所に置き、さらにこちらからtwitterのApplication登録してConsumer key等を取得して先ほどのコードに打ち込むとAPIが叩けるようになる。

まず、statuses/user_timelineを用いてユーザーのtweetを全取得しようとしたがこれは過去3200tweetまでしか取得出来ないという問題があった。また、search/tweetsを用いて日付指定することで過去のtweetを取得しようとしたが、これは過去一週間までしか遡れないという問題があった。

成功した方法

公式のクライアントでは過去の日付を指定してtweet検索できることから、何らかのAPIがあるはずだと調べていると、search/universal APIというものがあった(詳しくは こちら)。
これを用いると、過去一週間より前も遡ることができた。
このAPIを用いるには公式クライアントのConsumer keyが必要であるので、ここから適当に選ぶ。それに対応するAccess Tokenを取得したいので、こちらなどを参考に取得する(ban等された時のリスクを考え捨て垢でやることをお勧めする。)
コードはこんな感じ(抜粋なのでそのままでは動かない恐れあり。)

get_all_tweet.html
<html lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Get tweet </title>
<style type="text/css">
</style>
<script src="lib/oauth.js"></script> 
<script src="lib/sha1.js"></script>
<script src="getTwitterAPI.js"></script>
</head>
<body>
<script type="text/javascript">
var screen_name = "XXXXXXXXXXX";
var count = 50;
var max_id = 999999999999999999;
var max_id_old;
var url = "https://api.twitter.com/1.1/search/universal.json?q=from%3A" + screen_name  + " max_id%3A" + max_id + "&count=" + count +  "&modules=status";


var hoge = setInterval(get_tweet,5000);
function get_tweet(){
    console.log(max_id);
    url = "https://api.twitter.com/1.1/search/universal.json?q=from%3A" + screen_name  + " max_id%3A" + max_id + "&count=" + count +"&modules=status";
    getTwitterAPI(url,"get_all_tweet");
    if(max_id == max_id_old){
        clearInterval(hoge);    
    }
    max_id_old = max_id;
}
function get_all_tweet(json){
   json.modules.forEach(function(d,i){
        console.log(d.status.data);
        max_id = d.status.data.id;
   });
}
</script>
</body>
</html>

getTwitterAPI()を実行するとコールバック関数の第一引数にurlを叩いて帰ってきたObjectが渡される。当然一回APIを叩くだけでは全てのtweetを取得することは出来ないので、max_idに取得できたtweetのidを格納し更新し、複数回実行することで全てのtweetを順番に取得した。取得し終わったらmax_idが更新されなくなるので、そうなるまで実行させれば良い。(APIの詳細の仕様や返ってくるdataについては公式のドキュメント等を参照してください。)

おわりに

この手法を用いることで、tweetを全て取得することに成功したが、割と危ない手法を用いている気がするので利用する時は注意して頂きたい。

56
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
56
Help us understand the problem. What is going on with this article?