タイムラインと投稿時間の表示

1,393 views
Skip to first unread message

鈴木

unread,
Dec 15, 2012, 1:47:53 PM12/15/12
to Twitter4J J
プログラム初心者です。
現在私は特定のアカウントのタイムラインとその投稿時間を表示するプログラムを作ろうと思っています。

タイムラインを表示する事はできましたか投稿時間の表示の方がなかなか上手く行きません「xx分前」と表示したいです。

どこにどう投稿時間を表示するプログラムを追加したらよいでしょうか?(使用してるtwitter4jのバージョンが2.1.7のせいでしょうか?



以下ソースコード

---------------------------
twitter4j.properties
--------------------------
debug=true
oauth.consumerKey=*************************
oauth.consumerSecret=**************************
oauth.accessToken=****************************
oauth.accessTokenSecret=***************************




--------------------------
Timeline.java
--------------------------



import java.util.List;

import twitter4j.*;

public class Timeline{
private Twitter twitter;

public Timeline(){
this.getInstance();
}

private void getInstance(){
TwitterFactory factory = new TwitterFactory();
twitter = factory.getInstance();
}

public static void main(String[] args){
GetHomeTimeline main = new Timeline();
main.twitterAPITest();
}

public void twitterAPITest(){
try{
this.Timeline();
}catch(TwitterException te){
te.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}

public void Timeline() throws TwitterException{
List<Status> statuses = twitter.Timeline();
System.out.println("TimeLine");

System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");

for (Status status : statuses) {
System.out.println(status.getUser().getName());
System.out.println(status.getText());


System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
}
}
}

Yamamoto Yusuke

unread,
Dec 15, 2012, 7:32:31 PM12/15/12
to twitt...@googlegroups.com
どのようにうまくいかないのでしょうか?
・期待する値が表示されない
・実行時に例外が出る
・コンパイルできない
、などもう少し状況を説明していただけますか?

2.1.7でも動くとは思いますが来年3月で動かなくなる(内部で使っているTwitter API1.0が廃止になる)のでこれからは3.0.xを使ってください。
-- 
山本 裕介
@yusuke

--
Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
現在のバージョン - 安定: 3.0.2, 開発中: 3.0.3-SNAPSHOT
http://jira.twitter4j.org/issues/?filter=10030
バグトラッキング: http://twitter4j.org/jira/browse/TFJ

このメールは次の Google グループの参加者に送られています: Twitter4J J
このグループにメールで投稿: twitt...@googlegroups.com
このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja



鈴木

unread,
Dec 15, 2012, 8:23:55 PM12/15/12
to twitt...@googlegroups.com
山本 裕介さん
同じ投稿を2回していましたすみません。削除してもらっても構いません。
 
具体的には


        
System.out.println("-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");

            for (Status status : statuses) {
                System.out.println(status.getUser().getName());    //ユーザー名の表示
                System.out.println(status.getText());           //つぶやきテキストの表示
                System.out.println(○○分前の投稿);           //何分前の投稿なのかを表示
       
        
System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");
            }
        }
}
 
のような形にしたいです。自分でいろいろと調べたのですがコンパイルエラーの連発でした。
どのプログラムを付け足せばいいのでしょうか?
プログラムを付け足すのはSystem.out.printlnの部分だけではないと思いますが・・・
 

Yamamoto Yusuke

unread,
Dec 15, 2012, 8:28:02 PM12/15/12
to twitt...@googlegroups.com
貼り付けて頂いたコードを手元でコンパイルするのはちょっと大変なのでコンパイルエラーを貼り付けていただけますか?

同じ投稿を2回していましたすみません。削除してもらっても構いません。
スパム対策で初投稿の方は手動で承認しないと流れないようになっているんですよね。わかりにくくてすいません。
-- 
山本 裕介
@yusuke

鈴木

unread,
Dec 16, 2012, 10:41:44 AM12/16/12
to twitt...@googlegroups.com

申し訳ございません。通常に動作するプログラム(私が最初に投稿したソースプログラム)に上書きしていました。

再現しようともう一度自分で調べたのですが参考にしたサイトも見当たらず、結果的になにもエラー文を提示する事ができなくなりました。

      たとえコンパイルエラーや実行エラーのものでもきちんと保存するべきでした。すみません。 

 

Naoya Hatayama

unread,
Dec 16, 2012, 9:41:29 PM12/16/12
to twitt...@googlegroups.com
畑山です。
 
パッと見で明らかにおかしいのは、
GetHomeTimeline main = new Timeline();
List<Status> statuses = twitter.Timeline();
ですね。
前者は型が合ってません。後者はメソッド名が違います。

2012年12月16日日曜日 3時47分53秒 UTC+9 鈴木:

鈴木

unread,
Dec 17, 2012, 11:15:54 AM12/17/12
to twitt...@googlegroups.com
>畑山さん
ご指摘ありがとうございます。修正いたしました。
 
 
import java.util.List;
import twitter4j.*;
public class GetHomeTimeline{
 private Twitter twitter;
 public GetHomeTimeline(){
  this.getInstance();
 }
 private void getInstance(){
  TwitterFactory factory = new TwitterFactory();
  twitter = factory.getInstance();
 }
 public static void main(String[] args){
  GetHomeTimeline main = new GetHomeTimeline();
  main.twitterAPITest();
 }
 public void twitterAPITest(){
  try{
   this.getHomeTimeline();

  }catch(TwitterException te){
   te.printStackTrace();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void getHomeTimeline() throws TwitterException{
  List<Status> statuses = twitter.getHomeTimeline();

     System.out.println("TimeLine");
     System.out.println("--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------");

鈴木

unread,
Dec 18, 2012, 9:10:48 AM12/18/12
to twitt...@googlegroups.com
なんとかつぶやきの投稿時間を表示できるようになりました。
無事コンパイル、実行まで行けました。今更ですが、開発環境はeclipseです。
--------------------------
ソースコード
--------------------------
import java.util.List;
import twitter4j.*;
public class GetHomeTimeline{
 private Twitter twitter;
 public GetHomeTimeline(){
  this.getInstance();
 }
 private void getInstance(){
  TwitterFactory factory = new TwitterFactory();
  twitter = factory.getInstance();
 }
 public static void main(String[] args){
  GetHomeTimeline main = new GetHomeTimeline();
  main.twitterAPITest();
 }
 public void twitterAPITest(){
  try{
   this.getHomeTimeline();
  }catch(TwitterException te){
   te.printStackTrace();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void getHomeTimeline() throws TwitterException{
  List<Status> statuses = twitter.getHomeTimeline();
     System.out.println("TimeLine");
     System.out.println("-------------------------------------------------------");
     for (Status status : statuses) {
         System.out.println(status.getUser().getName());
         System.out.println(status.getText());
         System.out.println(status.getCreatedAt()+" ");

         System.out.println("---------------------------------------------------");
     }
 }
}

 
 
 
 
実行結果
[Tue Dec 18 22:34:52 JST 2012]Will use class twitter4j.internal.logging.StdOutLoggerFactory as logging factory.
[Tue Dec 18 22:34:52 JST 2012]Will use twitter4j.internal.http.HttpClientImpl as HttpClient implementation.
[Tue Dec 18 22:34:52 JST 2012]Request:
・・・
・・・
・・・
Tue Dec 18 22:34:53 JST 2012]Content-Encoding: gzip
[Tue Dec 18 22:34:53 JST 2012]Content-Type: application/json;charset=utf-8
[Tue Dec 18 22:34:53 JST 2012][{"created_at":"Tue Dec 18 12:36:16 +0000 2012","id":281015020387717120,"
TimeLine
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
xxxxxxxxxxxx /*ユーザー名*/
RT @xxxxxxxxxx: 【16日のアニメ紅白歌合戦での件その2】 /*つぶやき内容*/
また今回は事前に殺害予告をして金属バットを振り回していたとして威力業務妨害及び殺人未遂として所属事務所グリックへ通報致しました。 #アニメ紅白 #平野綾 #スフィア #犯罪 #声優
Tue Dec 18 21:36:16 JST 2012  /*つぶやきの投稿時間*/
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
ここで私はつぶやきの取得した時間を「○○分前」と表示したいのですがご教授お願いします。

Naoya Hatayama

unread,
Dec 18, 2012, 7:25:56 PM12/18/12
to twitt...@googlegroups.com
テキトーですがこんなかんじですかね。
forループの中に書いてください。
 
long now = System.currentTimeMillis();
long createdAt = status.getCreatedAt().getTime();
long diff = now - createdAt;
int min = (int) (diff / (60 * 1000));
System.out.println(min + "分前");

2012年12月18日火曜日 23時10分48秒 UTC+9 鈴木:

Yamamoto Yusuke

unread,
Dec 18, 2012, 8:29:31 PM12/18/12
to twitt...@googlegroups.com
--------
TimeSpanConverter tsc = new TimeSpanConverter();
tsc.toTimeSpanString(status.getCreatedAt())
--------
なんてできたりします。
http://twitter4j.org/javadoc/twitter4j/util/TimeSpanConverter.html
--
山本 裕介
@yusuke
http://samuraism.jp/

鈴木

unread,
Jan 6, 2013, 1:39:13 AM1/6/13
to twitt...@googlegroups.com

Naoya Hatayamaさん

Yusuke Yamamotoさん ありがとうございました。

年を越してしまい今更ですがお礼申し上げます。

鈴木

unread,
Jan 21, 2013, 4:34:23 AM1/21/13
to twitt...@googlegroups.com
 せっかくですのでTLを表示するプログラムに「RT、企業によるプロモーション、ハッシュタグ」を含むつぶやきを表示しない機能をつけたいのですが、最初から用意されているオープンソースやメドッドはありますか?
 
もう一つの方法として下記のプログラムを強引に編集する方法もあると思うのですが・・・。
 
public void getHomeTimeline() throws TwitterException{
List<Status> statuses = twitter.getHomeTimeline();
System.out.println("TimeLine");
System.out.println("-------------------------------------------------------");

Yamamoto Yusuke

unread,
Jan 21, 2013, 4:42:57 AM1/21/13
to twitt...@googlegroups.com
APIとして「企業によるプロモーションであるかどうか」を判別するような仕組みは用意されていません。
(お金を払ってタイムラインに露出させるプロモツイート自体は公式APIではそもそも取得できません)

ハッシュタグを含むかどうかは status.getHashtagEntities().length != 0 で判別できます。
-- 
山本 裕介
@yusuke

--
Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
現在のバージョン - 安定: 3.0.3, 開発中: 3.0.4-SNAPSHOT

鈴木

unread,
Jan 22, 2013, 6:23:41 AM1/22/13
to twitt...@googlegroups.com
 
企業のプロモーションのツイートはお金を払ってタイムラインに露出していたんですね。納得です。
ハッシュタグを含むかどうかを調べる 『status.getHashtagEntities().length != 0』を
 
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
public void getHomeTimeline() throws TwitterException{
List<Status> statuses = twitter.getHomeTimeline();
System.out.println("TimeLine");
System.out.println("-------------------------------------------------------");
for (Status status : statuses) {
System.out.println(status.getUser().getName());
System.out.println(status.getText()); ←
System.out.println(status.getCreatedAt()+" ");

System.out.println("---------------------------------------------------");
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上記コードの『System.out.println(status.getText());』をif文で組み合わせてハッシュタグを含むつぶやきの表示を防ぐという方針で行きたいのですが可能でしょうか?

鈴木

unread,
Jan 29, 2013, 3:07:55 PM1/29/13
to twitt...@googlegroups.com
自力で色々と考えてみましたが上手く行きませんでした。
for (Status status : statuses) { } の中に
System.out.println(status.getHashtagEntities());を加えるのでしょうか?
 
 
 

import java.util.List;

import twitter4j.*;

public class GetHomeTimeline{
 private Twitter twitter;

 public GetHomeTimeline(){
  this.getInstance();
 }

 private void getInstance(){
  TwitterFactory factory = new TwitterFactory();
  twitter = factory.getInstance();
 }

 public static void main(String[] args){

  GetHomeTimeline main = new GetHomeTimeline();
  main.twitterAPITest();
 }

 public void twitterAPITest(){
  try{
   this.getHomeTimeline();


  }catch(TwitterException te){
   te.printStackTrace();
  }catch(Exception e){
   e.printStackTrace();
  }
 }


 public void getHomeTimeline() throws TwitterException{
  List<Status> statuses = twitter.getHomeTimeline();
     System.out.println("TimeLine");

     System.out.println("-------------------------------------------------------------------------------------------------------------------------------------------------------------------");

     for (Status status : statuses) {
         System.out.println(status.getUser().getName());
         System.out.println(status.getText());

         System.out.println(status.getCreatedAt()+" ");
         //tuika


         long now = System.currentTimeMillis();
         long createdAt = status.getCreatedAt().getTime();
         long diff = now - createdAt;
         int min = (int) (diff / (60 * 1000));
         System.out.println(min + "分前");
        

         //A
         if(status.getHashtagEntities().length != 0){
           System.out.println(status.getText());
          
         }
        
         //B
         if (status.getHashtagEntities())
         {
          System.out.println(status.getText());
          
         }
        
         //C
         if(getHashtagEntities())
         {
          System.out.println(status.getText());
         }
        
         System.out.println("-----------------------------------------------------------------------------------------------------");
     }
 }
}

 
 
 
 

Mocel

unread,
Feb 1, 2013, 6:02:41 AM2/1/13
to twitt...@googlegroups.com
こんにちは。

ソースを読みましたが、見たところ特に問題ないように見えます。
//A とコメントが添えられている部分でいけるんじゃないでしょうか。

B や C を見ると getHashtagEntities() がどういうメソッドなのか把握されていないように見受けられますが、もししっかり把握されていないのでしたら Java の配列と getHashtagEntities() メソッドが返す値について調べてみたほうがいいのでは、と思います。

ではでは。

-Mocel

鈴木

unread,
Feb 2, 2013, 8:45:50 PM2/2/13
to twitt...@googlegroups.com
Mocel さん投稿ありがとうございます。まだまだ勉強不足でした。
javaのテキストを読むだけではなかなか頭に入りませんね・・・。
 
//Aをもう少し具体的に用いてみた結果
 
 
 
 import java.util.List;
import twitter4j.*;
public class GetHomeTimeline{
 private Twitter twitter;
 public GetHomeTimeline(){
  this.getInstance();
 }
 private void getInstance(){
  TwitterFactory factory = new TwitterFactory();
  twitter = factory.getInstance();
 }
 public static void main(String[] args){
  GetHomeTimeline main = new GetHomeTimeline();
  main.twitterAPITest();
 }
 public void twitterAPITest(){
  try{
   this.getHomeTimeline();
  }catch(TwitterException te){
   te.printStackTrace();
  }catch(Exception e){
   e.printStackTrace();
  }
 }
 public void getHomeTimeline() throws TwitterException{
  List<Status> statuses = twitter.getHomeTimeline();
     System.out.println("TimeLine");
     System.out.println("--------------------------------------------------------------------------------");
     
     for (Status status : statuses) {
       if(status.getHashtagEntities().length == null){
         System.out.println(status.getUser().getName());
         System.out.println(status.getText());
         System.out.println(status.getCreatedAt()+" ");

         long now = System.currentTimeMillis();
         long createdAt = status.getCreatedAt().getTime();
         long diff = now - createdAt;
         int min = (int) (diff / (60 * 1000));
         System.out.println(min + "分前");
       System.out.println("---------------------------------------------------------------");
       }
       }
 }
}
 
このような形になりました。  if(status.getHashtagEntities().length == null){
の部分でハッシュタグがヌル(無かったら)一気にタイムラインとユーザ名等を表示する算段です。
しかし if(status.getHashtagEntities().length == null){の行が原因でエラーを吐き出してしまいました。
List<Status> statuses = twitter.getHomeTimeline();のようなリストを追加したらよいのでしょうか・・・?

Yusuke Yamamoto

unread,
Feb 2, 2013, 9:18:44 PM2/2/13
to twitt...@googlegroups.com, twitt...@googlegroups.com
どんなエラーが出ていますか?


-- 
山本 裕介
@yusuke
http://samuraism.jp/
Sent from my iPhone5
--
Twitter4J の最新情報をフォロー: http://twitter.com/t4j_news
現在のバージョン - 安定: 3.0.3, 開発中: 3.0.4-SNAPSHOT
http://jira.twitter4j.org/issues/?filter=10030
バグトラッキング: http://twitter4j.org/jira/browse/TFJ
 
このメールは次の Google グループの参加者に送られています: Twitter4J J
このグループにメールで投稿: twitt...@googlegroups.com
このグループから退会する: http://groups.google.com/group/twitter4j-j?hl=ja
---
このメールは Google グループのグループ「Twitter4J J」の登録者に送られています。
このグループから退会し、メールの受信を停止するには、twitter4j-j...@googlegroups.com にメールを送信します。
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
 
 

鈴木

unread,
Feb 2, 2013, 9:35:48 PM2/2/13
to twitt...@googlegroups.com
エラー分は以下の通りです。 

Exception in thread "main" java.lang.Error: Unresolved compilation problem:
 メソッド getHashtagEntities() は型 Status で未定義です

 at GetHomeTimeline.getHomeTimeline(GetHomeTimeline.java:39)
 at GetHomeTimeline.twitterAPITest(GetHomeTimeline.java:24)
 at GetHomeTimeline.main(GetHomeTimeline.java:19)

 
getHashtagEntities() の型Statusも新しく用意しなければならないのでしょうか。 

Yamamoto Yusuke

unread,
Feb 2, 2013, 9:49:53 PM2/2/13
to twitt...@googlegroups.com
Eclipseのインクリメンタルコンパイラに関連するエラーのような気がします。
プロジェクトのクリーン、再ビルドをしたらコードエディタに何かエラーが表示されないでしょうか?

また、Twitter4J 3.0.xではツイートにハッシュタグがない場合、getHashtagEntities()はnullではなく長さ0の配列を返します。
if(status.getHashtagEntities().length == null){ ではなく
if(status.getHashtagEntities().length == 0){ になります。お試しください。
-- 
山本 裕介
@yusuke

鈴木

unread,
Feb 2, 2013, 10:07:53 PM2/2/13
to twitt...@googlegroups.com
実行ボタンを押したら
「必要なプロジェクトでエラー: GetHomeTimeline 起動を続行しますか?」
というダイアルがでます。
 
 
が、twitter4jのバージョンが古かったので 3.0.1にし、if(status.getHashtagEntities().length == 0){と変更し実行したところ
上手くハッシュタグが含まれないようになTLになりました。
 
 
たった今全て解決いたしました。お騒がせしてしまいました。もうしわけありません。
 
ついでにif(status.getHashtagEntities().length == 0){ 
と同じようにリツイートされたつぶやきも表示されないようにしたいのですが
 
 
 retweetStatus()
getRetweetedStatus()
 
と色々ありますがどれが最適でしょうか?
 

Mocel

unread,
Feb 3, 2013, 8:48:27 AM2/3/13
to twitt...@googlegroups.com
こんにちは。

リツイートされたものかどうかは Status#isRetweet() で判定できます。ほかの方法はありません。

if (status.isRetweet()) {
  // リツイートされたステータス
}

とか書いたりします。

retweetStatus() は自分からリツイートするメソッド、getRetweetedStatus() というメソッドは 3.0 系には存在しませんが、たぶん昔存在していてもうすぐ廃止になる API を利用するものではないでしょうか。

ではでは。

鈴木

unread,
Feb 3, 2013, 9:47:42 AM2/3/13
to twitt...@googlegroups.com
Mocelさん解説ありがとうございます。別件の方もアドバイスありがとうございました。
Reply all
Reply to author
Forward
0 new messages