Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Twitter4Jで堀北真希さんの画像を収集してみる!

去年Twitterのタイムラインで画像がデフォルト表示される仕様となってから、「これ可愛い…」と思った画像をふぁぼる機会が増えた気がします(^^;

自分の場合はファンである堀北真希さんが中心なわけですが…。

f:id:kikutaro777:20140126025631j:plain

そういった仕様に伴ってか、「可愛いと思ったらリツイート!」「気に入ったらリツイート!」等のツイートも着々と増えてる感じがします(^^;

こういうのはTwitterらしい面白さがあってとても良いのですが、気が付くと無意識に手動で画像収集したりして時間を浪費してしまったり…(-_-;

そこでプログラムを使ってもう少し効率よく収集できないかな…と思って、ちょっと試してみました。

Twitter利用規約

ちなみに今回書いてるのは、あくまでも個人的な画像取得コードなのですが、こういうのって利用規約とかに引っかからないのかなと気になったり。

ポリシーと規約違反
https://support.twitter.com/groups/56-policies-violations

開発者向けは

Developer Rules of the Road
https://dev.twitter.com/terms/api-terms

全て英語なのか…。

I. Twitter Contentにある「Exporting Twitter Content to a datastore as a service or other cloud based service, however, is not permitted.」とか、知らなかったり(^^;
そういうサービスありそうと思っただけに。

目を通した後に気が付いたのですが、日本語訳されてる方々が!!これは助かる(^^;

Twitter API開発者利用規則 和訳

とりあえず問題ない感じかと。※解釈違ってたらご指摘下さい

画像取得サンプル

処理の流れとしては

  1. Twitterで検索(キーワード、特定のbot、ハッシュタグ…etc)
  2. 検索結果に含まれる画像情報を取得
  3. ファイルにして保存

という簡単なもので試しました。
以下、mainだけで書いてるし、エラーハンドリングはしてない雑なサンプルなので注意(^^;

package mysample.mytwitter4j;
import java.io.IOException;
import java.net.MalformedURLException;
import twitter4j.MediaEntity;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import java.net.URL;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * Twitter4Jで検索結果の画像を取得してみるサンプル
 * @author kikutaro
 */
public class App 
{
    //取得件数
    static final int TWEET_NUM = 10;
    
    //保存対象の画像拡張子
    static final String TARGET_EXTENSION = ".jpg";
    
    //検索クエリ
    //hogehogeの部分で、画像流してるbotのIDなどを指定
    //単なるキーワードやハッシュタグも指定可能
    static final String MY_QUERY = "from:hogehoge";
    
    public static void main( String[] args ) throws TwitterException, MalformedURLException, IOException
    {
        Twitter twitter = new TwitterFactory().getInstance();
        
        //検索実行
        Query query = new Query(MY_QUERY);
        query.setCount(TWEET_NUM);
        QueryResult result = twitter.search(query);
        
        //検索結果からmedia entity情報をチェックして保存
        for(Status sts : result.getTweets()){
            MediaEntity[] arrMedia = sts.getMediaEntities();
            for(MediaEntity media : arrMedia){
                //ファボ数でフィルタとかも良さそう
                //if(sts.getFavoriteCount() > 5)
                
                //とりあえず拡張子だけでフィルタ
                if(media.getMediaURL().endsWith(TARGET_EXTENSION)){
                    URL website = new URL(media.getMediaURL());
                    ReadableByteChannel rbc = Channels.newChannel(website.openStream());
                    //保存ファイル名にStatusが持つ作成日を付与
                    DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
                    FileOutputStream fos = 
                        new FileOutputStream("ImageFromTwitter" + df.format(sts.getCreatedAt()) + TARGET_EXTENSION);
                    fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
                }
            }
        }
    }
}

Twitter4JのAPIでほとんど何でもできてしまいますね(^^;

ちなみに検索のクエリは色々な形式で指定できそうです。Twitter APIのサイトも参考になるかと。
https://dev.twitter.com/docs/using-search

実行結果

で、とあるbotのIDを指定して実行すると、以下のプロジェクトフォルダが
(ダウンロード先とか特に指定してないので)

f:id:kikutaro777:20140126042340j:plain

こんな感じに堀北さんで溢れます(´;ω;`)ぶわっ

f:id:kikutaro777:20140126042243j:plain

幸せ…。

ちゃんとしたbotであれば、しっかり堀北さんの画像だけが流れてくるので安心(^^)

ちなみに昨今話題の某自画撮りハッシュタグを試しに指定してみたら…

f:id:kikutaro777:20140126043851j:plain

違う世界が広がりました(^^;

当然ですが、こうしたハッシュタグ指定などによる検索だと、全く関係ないグロイ画像を付けて発信されているツイートも含んでしまうので、十分に気を付けて下さい(^^;

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村