2012年2月14日火曜日

NAVERまとめのブログパーツを作った。

※2012/02/15 なんかサーバに繋がらなくなってるなぁ。なんでだろ。

公式を見ても、人気のまとめのブログパーツしかないみたいな感じだったので、
よく確認もしないで作った。
全然反省とかはしていない。
公式のものがあるなら、それを使ったほうがいいし、
公式のものがないなら、それが出来るまでの箸休めです。

動作は、このページの右側にあるやつを見て確認してください。
使い方やなんやらは、
http://matome.naver.jp/odai/2132921992271736701
からどうぞ。

最初は php でやろうかなーとか思ったんですが、
勉強をかねて、node.js でやりました。
node.js で jsdom + jQuery でスクレイピングしているので、
blogparts.no.de からのアクセスとかを 403  されたら使えなくなります。

jsdom + jQuery でのスクレイピングは、
過去に思いっきり自分用というか、当時の会社用で、
×××の○○○○○をごっそり抜き出すようなものを作ったことがあるのですが、
他の人がアクセスするようなものを作ったことが無かったので、
http で サーバを立てるところからお勉強でした。

NAVERのサーバにあるCSSを link rel したり png ファイル読み込もうとしたんですが、
うまくいかない感じだったので、
ソースに直で 長ったらしい CSS 書いたり、

こちら
[JavaScript] dataスキームURI生成(画像データのBase64変換)
で base64に画像変換してみたりしました。

取り合えず、動いたので良かったです。

あ、ソースコードはこんな感じです。インチキくさい。
修正すべき点とかご指摘いただけたらと思います。不慣れなもんで。フヒヒヒヒ。てへぺろ。

var http   = require("http"),
    url    = require("url"),
    qs     = require("querystring"),
    XHR    = require("xmlhttprequest").XMLHttpRequest;
    jsdom  = require("jsdom"),
    jq     = "http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js";
var style = function(){
    var str  = "";
        str += "*{font-size:10px;}";
        str += ".MdMTMTtlList01{margin-left:0;padding-left:0;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Item,.MdMTMTtlList02 .mdMTMTtlList02Item,.MdMTMTtlList03 .mdMTMTtlList03Item{display:table;*display:inline;width:100%;}";
        str += ".MdMTMTtlList01{overflow:hidden;*zoom:1;margin-bottom:-15px;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Item{margin:16px 0 0 0;padding:0 0 15px 0;border-bottom:1px solid #f2f2f2;margin-bottom:-1px;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Item:first-child{margin-top:0;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Thumb,.MdMTMTtlList02 .mdMTMTtlList02Thumb,.MdMTMTtlList03 .mdMTMTtlList03Thumb{display:table-cell;*display:inline;*zoom:1;width:60px;height:60px;padding:0 13px 0 0;vertical-align:middle;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Thumb a,.MdMTMTtlList02 .mdMTMTtlList02Thumb a,.MdMTMTtlList03 .mdMTMTtlList03Thumb a{display:block;width:60px;height:60px;overflow:hidden;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Txt,.MdMTMTtlList02 .mdMTMTtlList02Txt,.MdMTMTtlList03 .mdMTMTtlList03Txt{display:table-cell;*display:inline;*zoom:1;vertical-align:middle;word-wrap:break-word;table-layout:fixed;width:100%;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Ttl,.MdMTMTtlList02 .mdMTMTtlList02Ttl,.MdMTMTtlList03 .mdMTMTtlList03Ttl{display:inline;font-size:10px;font-weight:bold;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Ttl a:link,.MdMTMTtlList01 .mdMTMTtlList01Ttl a:visited,.MdMTMTtlList02 .mdMTMTtlList02Ttl a:link,.MdMTMTtlList02 .mdMTMTtlList02Ttl a:visited,.MdMTMTtlList03 .mdMTMTtlList03Ttl a:link,.MdMTMTtlList03 .mdMTMTtlList03Ttl a:visited{text-decoration:none;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Ttl a:hover,.MdMTMTtlList01 .mdMTMTtlList01Ttl a:active,.MdMTMTtlList01 .mdMTMTtlList01Ttl a:focus,.MdMTMTtlList02 .mdMTMTtlList02Ttl a:hover,.MdMTMTtlList02 .mdMTMTtlList02Ttl a:active,.MdMTMTtlList02 .mdMTMTtlList02Ttl a:focus,.MdMTMTtlList03 .mdMTMTtlList03Ttl a:hover,.MdMTMTtlList03 .mdMTMTtlList03Ttl a:active,.MdMTMTtlList03 .mdMTMTtlList03Ttl a:focus{text-decoration:underline;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Thumb+.mdMTMTtlList01Txt{width:593px;max-width:593px;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01Draft{color:#959595;font-size:10px;font-weight:bold;}";
        str += ".MdMTMTtlList01 .mdMTMTtlList01TimeStamp{color:#afafaf;font-size:10px;}";
        str += ".MdMTMTtlList01 .MdSocialCountList01{margin-top:2px;}";
        str += ".MdMTMTtlList01 .MdMsgDisp01{display:table-caption;margin-bottom:4px;}";
        str += ".MdSocialCountList01{margin-left:0;padding-left:0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Li{display:inline-block;*display:inline;*zoom:1;margin-left:7px;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Li:first-child{margin-left:0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Ico{display:inline-block;*display:inline;*zoom:1;overflow:hidden;margin:0;padding:0;border:none;background:url('data:image/png;base64,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') no-repeat 0 0;text-align:left;vertical-align:middle;text-indent:-9999px;*text-indent:0;*line-height:9999px;*word-wrap:normal;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Hatena .mdSocialCountList01Ico{width:12px;height:12px;margin-top:-4px;*margin-top:0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Twitter .mdSocialCountList01Ico{width:12px;height:12px;margin-top:-4px;*margin-top:0;background-position:-15px 0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Facebook .mdSocialCountList01Ico{width:12px;height:12px;margin-top:-4px;*margin-top:0;background-position:-30px 0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Comment .mdSocialCountList01Ico{width:14px;height:13px;margin-top:-2px;*margin-top:0;background-position:-50px 0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Good .mdSocialCountList01Ico{width:13px;height:14px;margin-top:-4px;*margin-top:0;background-position:-70px 0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Comment,.MdSocialCountList01 .mdSocialCountList01Good,.MdSocialCountList01 .mdSocialCountList01View{margin:0 -2px 0 0;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Label{margin:0 5px 0 0;color:#7b7b7b;font-family:Tahoma,Arial,Helvetica,sans-serif;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Num{font-weight:bold;color:#7b7b7b;font-family:Tahoma,Arial,Helvetica,sans-serif;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Hatena .mdSocialCountList01Num,.MdSocialCountList01 .mdSocialCountList01Twitter .mdSocialCountList01Num,.MdSocialCountList01 .mdSocialCountList01Facebook .mdSocialCountList01Num{margin-left:4px;}";
        str += ".MdSocialCountList01 .mdSocialCountList01Comment .mdSocialCountList01Num,.MdSocialCountList01 .mdSocialCountList01Good .mdSocialCountList01Num{margin-left:5px;}";
    return str;
}
var app = http.createServer(function(req,res){
    res.writeHead(200,{"Content-Type":"text/html"});
    var prm = url.parse(req.url,true);
    if(req.method == "GET" && prm.query && prm.query.mode){
        var mode  = prm.query.mode;
        if(mode != "matome.naver"){res.statusCode=403;res.write("403 Forbidden");res.end();return;}
        var usr   = prm.query.usr.replace(/script|\"|\'|\(|\)|\{|\}|\:|\;|\,|function/gi,"");
        if(!usr || usr == ""){res.statusCode=403;res.write("403 Forbidden");res.end();return;}
        var naver = "http://matome.naver.jp/mymatome/" + usr;
        var xhr = new XHR();
            xhr.onreadystatechange = function(){
                if(this.readyState == 4){
                    var con  = this.responseText;
                    var doc  = jsdom.jsdom(con);
                    var win  = doc.createWindow();
                    var body = "";
                    jsdom.jQueryify(win,jq,function(win,$){
                        body = $(".mdMypageMTMList01Item").html();
                        res.write("<!DOCTYPE html><html lang='ja'><head><meta charset='UTF-8'>");
                        res.write("<style>" + style() + "</style>");
                        res.write("</head><body>");
                        res.write(body);
                        res.write("</body></html>");
                        res.end();
                    });
                }
            };
            xhr.open("GET",naver);
        xhr.send();
    }else{
        res.end();
    }
});
app.listen(80);

0 件のコメント:

コメントを投稿