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

順次、選択、そして繰り返し

プログラミングのことやITのこと、たまに演劇のことも書きます。

Twitter4Jを用いて、ハッシュタグを検索するWebアプリ作ってみた

Java

少し気になったので作ってみた。

まずは環境設定。

Twitter4J - A Java library for the Twitter API
↑公式ページからダウンロードしてくる。

Eclipseのlibフォルダにjarファイルを入れるだけで簡単だった。

TwitterAPIを使用するので、以下の4つが必要みたい。

  1. Consumer key
  2. Consumer secret
  3. Access token
  4. Access token secret

Twitter Developers
↑このサイトで取得する。

twitter4j.propertiesに取得したキーを書いて、
srcフォルダ直下にtwitter4j.propertiesを置く
Twitter4J - 設定

基本的に公式サイトの通りに書けば動くはず。


index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>トップページ</title>
<link rel="stylesheet" type="text/css" href="./css/index.css">
</head>
<body>

	<label>検索したいハッシュタグを入力してください</label>
	<form action="./twitter" method="post">
		#<input type="text" name="searchTarget" id="tweets">
		<input type="submit" value="送信">
	</form>

</body>
</html>

f:id:sndstudy:20151109211536p:plain

例えば#ごちうさを検索したいときは……。

f:id:sndstudy:20151109211822p:plain

f:id:sndstudy:20151109211842p:plain

上記のように出力される。

サーブレット(TwitterServlet.java)

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;

/**
 * ツイッターサーブレット
 *
 */
public class TwitterServlet extends HttpServlet{

	/**
	 * post処理
	 */
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		//受信した文字列をUTF-8にエンコーディング
		req.setCharacterEncoding("UTF-8");

		//検索したいハッシュタグ
		String searchTarget = "#" + req.getParameter("searchTarget");

		//フォワード先
		String forwardPage = "./WEB-INF/jsp/twitter.jsp";

		//Twitterのインスタンス取得
        Twitter twitter = new TwitterFactory().getInstance();

        //Queryのインスタンス生成
        Query query = new Query();

        //検索ワードを設定する
        query.setQuery(searchTarget);

        //検索結果を格納する変数を設定
        QueryResult queryResult = null;

        try {
        	//検索を実行
			queryResult = twitter.search(query);
		} catch (TwitterException e1) {
			e1.printStackTrace();
		}

        //検索した結果のヒット数を標準出力(デフォルトはMAX15件)
		System.out.println("ヒット数:" + queryResult.getTweets().size());

		List<String> result = new ArrayList<String>();

		//Listに検索結果を格納する
		for(Status tweet : queryResult.getTweets()){

			result.add(tweet.getText());

		}

		req.setAttribute("result", result);

		RequestDispatcher dispatch = req.getRequestDispatcher(forwardPage);

		//フォワード
		dispatch.forward(req, resp);

	}

}

出力JSP(twitter.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%List<String> searchResult = (List<String>)request.getAttribute("result"); %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="./css/index.css">
<title>出力結果</title>
</head>
<body>

	<% for(int i = 0; i < searchResult.size(); i++){ %>
		<div class="resultOutput">
			<%=searchResult.get(i) %>
		</div>
	<%} %>

</body>
</html>

発見したこと
→同じ内容のツイートを連続投稿出来ないこと
Twitterの仕様だと思うが、多分荒らし対策とかなんだろうな。


地味に苦戦した点
→外部CSSの修正部分が反映されない

IDを変更して、実行したら何故か出力結果で四角で囲まれなかったことがあった。

【Eclipse】Eclipseで、外部JS / 外部CSS / 画像の変更が、反映させれない ( ソフトウェア ) - プログラム の個人的なメモ - Yahoo!ブログ


とりあえずサーバのクリーンで修正部分が反映された。



次は非同期通信で検索結果がどんどん更新されるように実装を行ってみたい。