読者です 読者をやめる 読者になる 読者になる

ハッシュタグリアルタイム検索に関して考えてみる

 Twitter4jで下記みたいな処理を書いてみていたんだけど
どうもハッシュタグにより検索しても最新情報がとれない
(自分が検索やりたかったハッシュタグだと10時間前のがとれたりとかorz*1

 イケメン先生にも相談してみても、難か解決しないぞorz

 
https://twitter.com/yusukey/status/220446960811909120:twitter:detail:right


 結論から言うと下記のような話

  • 駄目な例*2
   	Date date = new Date();
    	String[] arr=null;
    	Query q= new Query();
    	q.setQuery("%23twitter4j");
    	
    	q.setResultType(q.RECENT);
    	q.since(dfq.format(date));
    	q.until(dfq.format(date));
    	q.setLang("ja");

    	List<Tweet> list=twitter_main.m_twitter.search(q).getTweets();
	for(Tweet tw:list){
		String screen_name = tw.getFromUser();//twitter_id
		User user = m_twitter.showUser(screen_name);//呼びまくるとTwポイントが直ぐ枯渇する
		String user_name = user.getName();//ニックネーム
		String twMsg= tw.getText();//呟き
		Date date = tw.getCreatedAt();//発言日付
		URL imageURL = user.getProfileImageURL();//アイコン画像
  • 成功した例
    	HttpClient httpClient = new DefaultHttpClient();
    	String url = "http://otter.topsy.com/search.json?page=1&perpage=20&q=%23twitter4j&window=h";
    	StringBuilder uri = new StringBuilder(url);
    	HttpGet request = new HttpGet(uri.toString());
    	HttpResponse httpResponse = null;
    	 
    	try {
    	    httpResponse = httpClient.execute(request);
    	} catch (Exception e) {
    	    Log.e(TAG,"doInBackground",e);
    	    return null;
    	}
    	 
    	int status = httpResponse.getStatusLine().getStatusCode();
    	 
    	if (HttpStatus.SC_OK == status) {
    	    try {
    	        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    	        httpResponse.getEntity().writeTo(outputStream);
    	        String data;
    	        data = outputStream.toString(); // JSONデータ
    	        JSONObject rootObject = new JSONObject(data);
            	JSONObject itemsObject = rootObject.getJSONObject("response");
    	        JSONArray list = itemsObject.getJSONArray("list");
    	        int len_list = list==null ? 0:list.length(); 

    	        for (int cnt = 0; cnt < len_list; cnt++) {
			JSONObject item = list.getJSONObject(cnt);
			String screen_name = item.getString("trackback_author_nick");//twitter_id
			String user_name = item.getString("trackback_author_name");//ニックネーム
			String twMsg= item.getString("content");//呟き
			Date date = new Date(Long.valueOf(item.getString("firstpost_date"))*1000);//発言日時
			URL imageURL = new URL(item.getString("topsy_author_img"));  //アイコン画像

 結局別のサービスを使いましょうというお話でして*3

 このサービスはアカウントとらないと
3000アクセスまでらしい*4

    	HttpClient httpClient = new DefaultHttpClient();
    	String url = "http://otter.topsy.com/credit.json";
    	StringBuilder uri = new StringBuilder(url);
    	HttpGet request = new HttpGet(uri.toString());
    	HttpResponse httpResponse = null;
    	 
	try {
    	    httpResponse = httpClient.execute(request);
    	} catch (Exception e) {
    	    LogUtil.error(TAG,"doInBackground",e);
    	    return false;
    	}
    	 
    	int status = httpResponse.getStatusLine().getStatusCode();
    	 
    	if (HttpStatus.SC_OK == status) {
    	    try {
    	        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    	        httpResponse.getEntity().writeTo(outputStream);
    	        String data;
    	        data = outputStream.toString(); // JSONデータ
    	        JSONObject rootObject = new JSONObject(data);
            	JSONObject itemsObject = rootObject.getJSONObject("response");
            	String item = itemsObject.getString("remaining");
            	if(Integer.valueOf(item) > 0){
            		return true;
            	}
		return false;

 念のため、limitがきたらTwitter4jの検索の処理で呼ぶ形にはしておく。なかなか難しいですね><
 
追記)
 http://otter.topsy.com/search.json? の結果は順不同でくるみたいなのでソートが必要でした

List<TopsyBean> tp_list = new ArrayList<TopsyBean>();
Collections.sort(tp_list, new TopsyBeanComparator());


なイメージ

 その上でTwの呟きでリンク踏ませて実行させるような事をしたい場合は
id:sakura_bird1 さんがやられているような

対応が必要。
t.coの展開も必要なので

辺りの展開処理も必要ですね。。

 色々とやる事は多いな。。。

追記2)
複数条件は、twitter4jのQueryと同じく


ワード1 OR ワード2
でOKらしい。今一引っかかっているかどうかは微妙だけど(twitter4jの方では動く事は確認

twitter4j のほうだと「-除外ワード」を設定可能。ただしハッシュタグと併用は出来ないみたい

//NG
検索ワード -%23ハッシュタグ
//OK
検索ワード -ハッシュタグ

追記3)

[http://twitter.com/kimukou2628/status/267910405916078081:twitter:tree]

追記4)

pageを後ろに持って行ったらパラメータエラーは出なくなったけど
pageは動いてないようなので使わないほうがいいかも

なんかIOSで呟かれている絵文字を拾ってエラってしまっているよう。

EditText/TextViewに絵文字を入力&表示する - Qiita
なことはできるけど、
 IOS=>PHP=>MySQLに入れるランキングとかでエラったりしてるので
あんま対応は微妙だな(汗 とかは思ったりも・・。
Html.fromHtml あたりで手動で処理すればいけるのかな??
結構悩ましい問題かも・・

でストック中だな。。。

*1:近似したハッシュタグがあると駄目なよう

*2:Twitterだと最小単位が日らしい

*3:Twitterだと1時間以内のTwだけとりたいとかは出来ないようだったので

*4:30日までお試し有料アカウントだと7000アクセスまで