Challenge Engineer Life !

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

Twitter4Jとcron4jで定期的につぶやいたり、画像取得する

昨日は「Twitter4Jで堀北真希さんの画像を収集してみる!」で、作業の効率化(そんな暇あれば業務を効率化しろって話ですが…)を行ったわけですが、昨日のままだと単発実行で終わってしまうので、定期実行したいなと思いました。

定期実行できればbotも簡単に作れる…と思って(^^;

スレッドでwaitさせてゴニョゴニョするのが良いのかな、と思いながら、最近たまたまLinuxを少し触ってたので「cronみたいなのないのかなー」と思って調べたら…なんとcron4jなんてものが(^^;!

cron4j

java cron4jでぐぐったら「Java Advent Calendar 2011」で@s_kozakeさんが書かれたエントリが一番上に出てきて、読んだら便利そうなので使ってみることにしました。
2011年って自分はJavaやってない頃ですが、Advent Calendarみるとお馴染みの方々が(^^;

cron4jのご紹介 -システムアーキテクトのごった煮-

以下サイトも参考になりました。

Java cron 実装 - cron4j ライブラリでタスクのスケジュール実行を簡単実装する : NETBUFFALO

わざわざライブラリ使わずとも、ってのもあると思いますが、上記ブログにもあるように、OS依存しないメリットはあるかなと。どうせならLinuxでも使いたいし…(^^;
その上でcronと同じ設定記述できるのが良い感じ。

※ちなみに後で教えてもらったのですが、Quartzという有名なジョブスケジュールライブラリがあるようです(^^;知りませんでした。一番最後に教えて頂いた情報を追記しました。

というわけで、早速、1分ごとにつぶやくサンプル作りました。

※毎回補足してますが、Twitter4Jの設定は過去に書いた以下で行ってます。

書くと言っても、以下だけ…。

package com.mycompany.myfirstsampleoftwitter4j;

import it.sauronsoftware.cron4j.Scheduler;
import java.io.IOException;
import java.net.MalformedURLException;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Date;

/**
 * Twitter4Jとcron4jで定期つぶやき
 * @author kikutaro777
 */
public class App 
{   
    public static void main( String[] args )
    {
        final Twitter twitter = new TwitterFactory().getInstance();
        
        Scheduler s = new Scheduler();
        s.schedule("* * * * *", new Runnable() {
            public void run() {
                //System.out.println(new Date());
                try {
                    twitter.updateStatus("cron4jで1分ごとにつぶやいてみる。" + new Date());
                } catch (TwitterException ex) {
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        s.start();
    }
}

JDK8で試さずにごめんなさい…。ということで、普通に無名クラスで書いてますが、こんな風に書けるとは。実行すると

DateFormatクラスも使わず時間表示が雑ですが、1分(ちょうど)ごとにつぶやけてます!bot完成!笑

ちなみに最初は以下のようにnew Date()の部分がないツイートにしてたのですが

2回目の実行で以下エラーとなりました。

[Mon Jan 27 22:39:00 JST 2014]{"errors":[{"code":187,"message":"Status is a duplicate."}]}

1 27, 2014 10:39:00 午後 com.mycompany.myfirstsampleoftwitter4j.App$1 run
SEVERE: null
403:The request is understood, but it has been refused. An accompanying error message will explain why. This code is used when requests are being denied due to update limits (https://support.twitter.com/articles/15364-about-twitter-limits-update-api-dm-and-following).
message - Status is a duplicate.
code - 187

Relevant discussions can be found on the Internet at:
http://www.google.co.jp/search?q=b2b52c28 or
http://www.google.co.jp/search?q=1206f222
TwitterException{exceptionCode=[b2b52c28-1206f222], statusCode=403, message=Status is a duplicate., code=187, retryAfter=-1, rateLimitStatus=null, version=3.0.5}
at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:162)
at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61)
at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98)
at twitter4j.TwitterImpl.post(TwitterImpl.java:1965)
at twitter4j.TwitterImpl.updateStatus(TwitterImpl.java:264)
at com.mycompany.myfirstsampleoftwitter4j.App$1.run(App.java:48)
at it.sauronsoftware.cron4j.RunnableTask.execute(Unknown Source)
at it.sauronsoftware.cron4j.TaskExecutor$Runner.run(Unknown Source)
at java.lang.Thread.run(Thread.java:724)

duplicate = 複製してる、から駄目とのことで、最初オブジェクトとか内部的な話かと思ってググってたのですが、@megascusさんより

とコメント頂いて、日付を入れたら成功した、という流れでした(^^;
ありがとうございます。

またテスト実行を繰り返していたら@kisさんより

とアドバイス頂きました。なんと!!それはあまり意識していなかった(^^;けど調べたら確かにそういうのあるっぽく。別途テスト用のアカウント作ろうと思います。

run()の中を昨日書いた「Twitter4Jで堀北真希さんの画像を収集してみる!」の画像取得処理にしたところ、無事に定期画像取得もできました。

定期画像取得は、某自画撮りハッシュタグ…のようにタイムラインの流れがホットなもので行うと色々面白い感じがします(^^)

補足

@eiryuさんや@yusukeさんから「Quartz」なるものの存在を教えて頂きました。
「Java Quartz」でググると日本語が多いんですね。しかも秒単位とかcron4jより細かいレベルで指定できそうです。

明日は同じサンプルをこれで書き直してみようかな。

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