Changeset 35705 for lang/java

Show
Ignore:
Timestamp:
10/24/09 16:03:00 (5 years ago)
Author:
fumokmm
Message:

ひとまず、HatenaHaikuAPIHTML#getKeywordList()のみ動作確認完了。

Location:
lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j
Files:
1 added
5 modified

Legend:

Unmodified
Added
Removed
  • lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j/HatenaHaikuAPI.java

    r35666 r35705  
    329329        private <T> T _getUserTimeline(ReduceOp<Status, T> op, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    330330                try { 
    331                         QueryParameter param = new QueryParameter(isHot); 
     331                        QueryParameter param = new QueryParameter(); 
     332                        if (isHot) { 
     333                                param.setSort(QueryParameter.HOT);      // 人気順 
     334                        } 
    332335                        param.setPage(page); 
    333336                        param.setCount(count); 
  • lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j/HatenaHaikuAPIHTML.java

    r35677 r35705  
    99 
    1010import java.io.IOException; 
     11import java.text.MessageFormat; 
    1112import java.text.ParseException; 
    1213import java.util.ArrayList; 
    13 import java.util.Date; 
    1414import java.util.List; 
    1515 
     
    189189        public <T> T getPublicTimeline(ReduceOp<Status, T> op, int page) throws HatenaHaikuException { 
    190190                try { 
    191                         QueryParameter param = new QueryParameter(); 
     191                        QueryParameter param = new QueryParameter(true); 
    192192                        param.setPage(page); 
    193193                        String resultXml = HttpUtil.doGet(URL2_PUBLIC_TIMELINE, param, isNeedHttpLog()); 
     
    242242        public <T> T getAlbumTimeline(ReduceOp<Status, T> op, int page) throws HatenaHaikuException { 
    243243                try { 
    244                         QueryParameter param = new QueryParameter(); 
     244                        QueryParameter param = new QueryParameter(true); 
    245245                        param.setPage(page); 
    246246                        String resultXml = HttpUtil.doGet(URL2_ALBUM_TIMELINE, param, isNeedHttpLog()); 
     
    298298        public <T> T getFriendsTimeline(ReduceOp<Status, T> op, String userId, int page) throws HatenaHaikuException { 
    299299                try { 
    300                         QueryParameter param = new QueryParameter(); 
     300                        QueryParameter param = new QueryParameter(true); 
    301301                        param.setPage(page); 
    302302                        String resultXml = HttpUtil.doGet(URL2_FRIENDS_TIMELINE, param, isNeedHttpLog()); 
     
    413413        private <T> T _getUserTimeline(ReduceOp<Status, T> op, String userId, int page, boolean isHot) throws HatenaHaikuException { 
    414414                try { 
    415                         QueryParameter param = new QueryParameter(isHot); 
     415                        QueryParameter param = new QueryParameter(true); 
     416                        if (isHot) { 
     417                                param.setSort(QueryParameter.HOT);      // 人気順 
     418                        } 
    416419                        param.setPage(page); 
    417420                        String resultXml = HttpUtil.doGet(URL2_USER_TIMELINE, param, isNeedHttpLog()); 
     
    618621        private <T> T _getKeywordTimeline(ReduceOp<Status, T> op, String keyword, int page, KeywordTimelineMode mode) throws HatenaHaikuException { 
    619622                try { 
    620                         QueryParameter param = new QueryParameter(mode == KeywordTimelineMode.HOT || mode == KeywordTimelineMode.HOT_URL); 
     623                        QueryParameter param = new QueryParameter(true); 
     624                        if (mode == KeywordTimelineMode.HOT || mode == KeywordTimelineMode.HOT_URL) { 
     625                                param.setSort(QueryParameter.HOT);      // 人気順 
     626                        } 
    621627                        param.setPage(page); 
    622628                        param.setWord(keyword); 
     
    635641        } 
    636642 
    637         /** 
    638          * キーワードタイムライン取得モード 
    639          *  
    640          * @author fumokmm 
    641          * @since v1.2.0 
    642          */ 
    643         public static enum KeywordTimelineMode { NONE, HOT, ALBUM, URL, HOT_URL } 
    644          
    645643        //------------------------------------------------------------- 
    646644        // ステータス関係 
     
    701699        /** 
    702700         * キーワードリストを取得します。(1ページ目)<br/> 
    703          * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i> 
     701         * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i><br/> 
     702         * <br/> 
     703         * <h2>利用できる項目</h2> 
     704         * <ul> 
     705         * <li>投稿数({@link Keyword#getEntryCount()})</li> 
     706         * <li>キーワードページのリンク({@link Keyword#getLink()} {@link Keyword#getMobileLink()})</li> 
     707         * <li>キーワードタイトル({@link Keyword#getTitle()})</li> 
     708         * <li>idページかどうか({@link Keyword#isIdPage()})</li> 
     709         * </ul> 
    704710         *  
    705711         * @see <a href="http://h.hatena.ne.jp/keywords">キーワードリスト</a> 
     
    714720        /** 
    715721         * キーワードリストを取得します。(指定ページ)<br/> 
    716          * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i> 
     722         * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i><br/> 
     723         * <br/> 
     724         * <h2>利用できる項目</h2> 
     725         * <ul> 
     726         * <li>投稿数({@link Keyword#getEntryCount()})</li> 
     727         * <li>キーワードページのリンク({@link Keyword#getLink()} {@link Keyword#getMobileLink()})</li> 
     728         * <li>キーワードタイトル({@link Keyword#getTitle()})</li> 
     729         * <li>idページかどうか({@link Keyword#isIdPage()})</li> 
     730         * </ul> 
    717731         *  
    718732         * @see <a href="http://h.hatena.ne.jp/keywords">キーワードリスト</a> 
     
    728742        /** 
    729743         * 指定したワードに部分一致するキーワードリストを取得します。(指定ページ)<br/> 
    730          * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i> 
     744         * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i><br/> 
     745         * <br/> 
     746         * <h2>利用できる項目</h2> 
     747         * <ul> 
     748         * <li>投稿数({@link Keyword#getEntryCount()})</li> 
     749         * <li>キーワードページのリンク({@link Keyword#getLink()} {@link Keyword#getMobileLink()})</li> 
     750         * <li>キーワードタイトル({@link Keyword#getTitle()})</li> 
     751         * <li>idページかどうか({@link Keyword#isIdPage()})</li> 
     752         * </ul> 
    731753         *  
    732754         * @see <a href="http://h.hatena.ne.jp/keywords">キーワードリスト</a> 
     
    743765        /** 
    744766         * 指定したワードに部分一致するキーワードリストを取得します。(指定ページ)<br/> 
    745          * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i> 
     767         * <i>http://h.hatena.ne.jp/keywords.body?word=【検索文字列】&page=【ページ数】</i><br/> 
     768         * <br/> 
     769         * <h2>利用できる項目</h2> 
     770         * <ul> 
     771         * <li>投稿数({@link Keyword#getEntryCount()})</li> 
     772         * <li>キーワードページのリンク({@link Keyword#getLink()} {@link Keyword#getMobileLink()})</li> 
     773         * <li>キーワードタイトル({@link Keyword#getTitle()})</li> 
     774         * <li>idページかどうか({@link Keyword#isIdPage()})</li> 
     775         * </ul> 
    746776         *  
    747777         * @see <a href="http://h.hatena.ne.jp/keywords">キーワードリスト</a> 
     
    755785        public <T> T getKeywordList(ReduceOp<Keyword, T> op, String searchWord, int page) throws HatenaHaikuException { 
    756786                try { 
    757                         QueryParameter param = new QueryParameter(); 
     787                        QueryParameter param = new QueryParameter(true); 
    758788                        param.setWord(searchWord); 
    759789                        param.setPage(page); 
    760790                        String resultXml = HttpUtil.doGet(URL2_KEYWORD_LIST, param, isNeedHttpLog()); 
     791                        resultXml = resultXml.replaceAll(new String(new char[]{ (char)0x1b }), ""); 
     792                        resultXml = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><keyword_list>" + resultXml + "</keyword_list>"; 
    761793                        return toKeywordList(op, XmlUtil.getRootElement(resultXml)); 
    762794 
     
    920952        protected Keyword toKeyword(Element elemKeyword) throws HatenaHaikuException { 
    921953                Keyword keyword = createKeyword(); 
     954 
     955                // <li><a href="">あああああ</a></li> 
     956                //   or 
     957                // <li><a href="">あああああ</a><span>(122)</span></li> 
     958                 
     959                Element anchor = XmlUtil.getFirstChildElement(elemKeyword, "a"); 
     960                Element span = XmlUtil.getFirstChildElement(elemKeyword, "span"); 
     961                MessageFormat countFormat = new MessageFormat("({0,number,integer})"); 
     962                 
     963                int entryCount = 0; 
     964                try { 
     965                        if (span != null) { 
     966                                entryCount = ((Long)(countFormat.parse(span.getTextContent()))[0]).intValue(); 
     967                        } 
     968                } catch (ParseException e) {} 
     969                String link = "http://h.hatena.ne.jp" + anchor.getAttribute("href"); 
     970                String title = anchor.getTextContent(); 
     971                 
    922972                // 投稿数 
    923                 keyword.setEntryCount(Integer.parseInt(XmlUtil.getText(elemKeyword, "entry_count"))); 
    924                 // フォロワー数 
    925                 keyword.setFollowersCount(Integer.parseInt(XmlUtil.getText(elemKeyword, "followers_count"))); 
     973                keyword.setEntryCount(entryCount); 
    926974                // キーワードページのリンク 
    927                 keyword.setLink(XmlUtil.getText(elemKeyword, "link")); 
    928                 // 関連キーワード 
    929                 keyword.setRelatedKeywords(XmlUtil.getTextList(elemKeyword, "related_keywords")); 
     975                keyword.setLink(link); 
    930976                // キーワードタイトル 
    931                 keyword.setTitle(XmlUtil.getText(elemKeyword, "title")); 
     977                keyword.setTitle(title); 
     978                 
    932979                return keyword; 
    933980        } 
     
    942989         */ 
    943990        protected <T> T toKeywordList(ReduceOp<Keyword, T> op, Element elemKeywords) throws HatenaHaikuException { 
    944                 for (Element elemKeyword : XmlUtil.getChildElementsByTagName(elemKeywords, "keyword")) { 
    945                         op.add(toKeyword(elemKeyword)); 
     991                for (Element elemLi : XmlUtil.getChildElementsByTagName(elemKeywords, "li")) { 
     992                        op.add(toKeyword(elemLi)); 
    946993                } 
    947994                return op.value(); 
     
    9601007        } 
    9611008         
     1009        /** 
     1010         * キーワードタイムライン取得モード 
     1011         *  
     1012         * @author fumokmm 
     1013         * @since v1.2.0 
     1014         */ 
     1015        static enum KeywordTimelineMode { NONE, HOT, ALBUM, URL, HOT_URL } 
     1016         
    9621017} 
  • lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j/HatenaHaikuAPILight.java

    r35698 r35705  
    485485        private <T> T _getUserTimeline(ReduceOp<Status, T> op, String userId, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    486486                try { 
    487                         QueryParameter param = new QueryParameter(isHot); 
     487                        QueryParameter param = new QueryParameter(); 
     488                        if (isHot) { 
     489                                param.setSort(QueryParameter.HOT);      // 人気順 
     490                        } 
    488491                        param.setPage(page); 
    489492                        param.setCount(count); 
     
    760763        private <T> T _getKeywordTimeline(ReduceOp<Status, T> op, String keyword, int page, int count, Date since, boolean isHot) throws HatenaHaikuException { 
    761764                try { 
    762                         QueryParameter param = new QueryParameter(isHot); 
     765                        QueryParameter param = new QueryParameter(); 
     766                        if (isHot) { 
     767                                param.setSort(QueryParameter.HOT);      // 人気順 
     768                        } 
    763769                        param.setPage(page); 
    764770                        param.setCount(count); 
  • lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j/QueryParameter.java

    r35467 r35705  
    2323        private static final int MAX_COUNT = 200; 
    2424        /** 人気順(HOT) */ 
    25         private static final String HOT = "hot"; 
     25        static final String HOT = "hot"; 
     26 
     27        /** 最大値を突破するかどうか */ 
     28        private boolean breakthroughMaxLimit; 
    2629         
    2730        /** その日時よりも新しい投稿のみに絞り込むための日時を指定します。  */ 
     
    5255         * コンストラクタです。 
    5356         *  
    54          * @param isHot 人気順取得用かどうか 
    55          * @since v1.0.0 
    56          */ 
    57         QueryParameter(boolean isHot) { 
    58                 if (isHot) { 
    59                         this.sort = HOT; 
    60                 } 
     57         * @param breakthroughMaxLimit 最大値を突破するかどうか 
     58         * @since v1.2.0 
     59         */ 
     60        QueryParameter(boolean breakthroughMaxLimit) { 
     61                this.breakthroughMaxLimit = breakthroughMaxLimit; 
    6162        } 
    6263 
     
    9495         * <li>指定されたページが0の場合、デフォルトページ(1ページ目)を取得します。</li> 
    9596         * </ul> 
     97         * ただし、breakthroughMaxLimitがtrueに指定されている場合、最大数制限は適用されません。 
    9698         *  
    9799         * @param page 取得するページ 
     
    99101         */ 
    100102        public void setPage(int page) { 
    101                 this.page = Math.min(Math.max(page, MIN_PAGE), MAX_PAGE); 
     103                if (breakthroughMaxLimit) { 
     104                        this.page = Math.max(page, MIN_PAGE); 
     105                } else { 
     106                        this.page = Math.min(Math.max(page, MIN_PAGE), MAX_PAGE); 
     107                } 
    102108        } 
    103109 
     
    119125         * <li>指定された取得数が0の場合、デフォルトの取得件数で取得します。</li> 
    120126         * </ul> 
     127         * ただし、breakthroughMaxLimitがtrueに指定されている場合、最大数制限は適用されません。 
    121128         *  
    122129         * @param count 取得数 
     
    124131         */ 
    125132        public void setCount(int count) { 
    126                 this.count = Math.min(Math.max(count, MIN_COUNT), MAX_COUNT); 
     133                if (breakthroughMaxLimit) { 
     134                        this.count = Math.max(count, MIN_COUNT); 
     135                } else { 
     136                        this.count = Math.min(Math.max(count, MIN_COUNT), MAX_COUNT); 
     137                } 
    127138        } 
    128139         
  • lang/java/misc/hatenahaiku4j/branches/for-HTML-scraping/src/hatenahaiku4j/sample/Sample001.java

    r35666 r35705  
    55import hatenahaiku4j.HatenaHaikuAPILight; 
    66import hatenahaiku4j.HatenaHaikuException; 
     7import hatenahaiku4j.Keyword; 
    78import hatenahaiku4j.LoginUser; 
    89import hatenahaiku4j.Status; 
     
    108109 
    109110        /** 
     111         * キーワード情報を標準出力に出力します。 
     112         *  
     113         * @param status キーワード情報 
     114         */ 
     115        public static void printKeyword(Keyword keyword) { 
     116                StringBuilder sb = new StringBuilder(); 
     117                sb.append("【").append(keyword.getTitle()).append("】"); 
     118                sb.append("(" + keyword.getEntryCount() + ")"); 
     119                sb.append(" "); 
     120                sb.append(keyword.getLink()); 
     121                System.out.println(sb.toString()); 
     122        } 
     123 
     124        /** 
    110125         * 区切りを標準出力に出力します。 
    111126         *