일반 웹사이트에 구글 블로그 RSS 피드를 파싱해서 삽입할 수 있는 소스 코드입니다. 이걸 이용하면 뉴스 구독 및 크롤링할 수 있 습니다.

맨 하단에 있는 example.com 을 여러분의 구글 블로거 피드 URL로 변경해서 사용해 주세요.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Blogger 게시물 및 페이지용 JSON 파서</title>
</head>
<body>

<div id="result-container">Loading…</div>
<script>
function generatePostsData(json) {
    var config = {
        containerID: 'result-container', // 생성된 데이터를 표시하는 컨테이너 ID
        avatarSize: 50, // 기본 아바타 사이즈
        noThumbnail: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABIAQMAAABvIyEEAAAABGdBTUEAALGPC/xhBQAAAAZQTFRFOjo6JycnNkxyjQAAADZJREFUKM9j+A8DDFRnNTCAACP9WewPGNgfkMmiwN7GH0CGfCPdWZT5V/7/DwZyWeSHFa1SHQDDGF2E0US40gAAAABJRU5ErkJggg==',
        text: {
            anon: 'Anonymous',
            untagged: 'Untagged',
            monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        }
    };

    var html = "",
        item = "",
        w = window,
        d = document,
        feed = json.feed,
        container = d.getElementById(config.containerID),
        postTotal = +feed.openSearch$totalResults.$t, // 게시물/페이지 피드의 합계 (all)
        postStartIndex = +feed.openSearch$startIndex.$t, // 게시물/페이지 피드의 시작 색인
        postPerPage = +feed.openSearch$itemsPerPage.$t, // 페이지당 또는 피드 요청당 게시물/페이지 피드의 최대 결과
        blogID = /\:blog-?(\d+)(\.|$)/.exec(feed.id.$t) ? /\:blog-?(\d+)(\.|$)/.exec(feed.id.$t)[1] : false, // 블로그 ID
        blogTitle = feed.title.$t, // 게시물/페이지 피드 제목
        blogTags = false, // 사용 가능한 게시물/페이지 태그(all)
        blogSubTitle = feed.subtitle.$t, // 게시물/페이지 피드의 부제목
        blogAuthorName = feed.author[0].name ? feed.author[0].name.$t : config.text.anon, // 블로그/포스트 작성자 이름
        blogAuthorAvatar = feed.author[0].gd$image.src.replace(/\/s\d+(\-c)?\//, '/s' + config.avatarSize + '-c/'), // 블로그/포스트 작성자 프로필 아바타 URL
        blogGeneratorName = feed.generator.$t, // 블로그 생성기 이름(Blogger)
        blogGeneratorURL = feed.generator.uri; // 블로그 생성기 URL(http://www.blogger.com)

    // 블로그/게시물 작성자 프로필 아바타 URL의 http:// 또는 https:// 제거.
    blogAuthorAvatar = blogAuthorAvatar.replace(/^https?\:/, "");

    // 컨테이너를 찾을 수 없을 때 출력 메시지
    if (!container) {
        alert('Container not found.');
        return;
    }

    // 블로그 태그 가져오기
    if (feed.category && feed.category.length) {
        blogTags = [];
        for (var h = 0, hen = feed.category.length; h < hen; ++h) {
            blogTags.push(feed.category[h].term);
        }
        // 블로그 태그를 알파벳순으로 정렬
        blogTags = blogTags.sort();
    }

    // 아직 게시물/페이지가 없을 때 출력 메시지
    if (!feed.entry || feed.entry.length === 0) {
        container.innerHTML = '<p>No posts/pages yet.</p>';
        return;
    }

    // 마크업 생성 시작...
    html += '<h1>' + blogTitle + '</h1>';
    html += '<h2>' + blogSubTitle + '</h2>';
    html += '<p><b>Blog ID:</b> ' + blogID + '</p>';
    html += '<p><b>Blog Tags:</b> ' + (blogTags !== false ? blogTags.join(', ') : config.text.untagged) + '</p>';
    html += '<p><b>Blog Author Name:</b> ' + blogAuthorName + '</p>';
    html += '<p><b>Blog Author Avatar URL:</b> ' + blogAuthorAvatar + '</p>';
    html += '<p><b>Total Posts:</b> ' + postTotal + '</p>';
    html += '<p><b>Posts Per Page:</b> ' + postPerPage + '</p>';
    html += '<p><b>Posts Start Index:</b> ' + postStartIndex + '</p>';
    html += '<hr>';
    html += '<ol>';

    var posts = feed.entry;

    for (var i = 0, ien = posts.length; i < ien; ++i) {
    
        var post = posts[i], // 단일 게시물/페이지 개체
            postID = post.id.$t, // 게시물/페이지 ID
            postPublish = post.published.$t, // ISO 형식의 게시물/페이지 게시 시간
            postUpdate = post.updated.$t, // ISO 형식의 게시물/페이지 업데이트 시간
            postDate = postPublish, // 사람이 읽을 수 있는 형식의 게시물/페이지 게시 시간
            postURL = false, // 게시물/페이지 URL
            postTags = false, // 게시물/페이지 태그
            postCommentTotal = post.thr$total ? +post.thr$total.$t : 0, // 게시물/페이지 댓글 합계
            postCommentFeedURL = false, // 게시물/페이지 댓글 피드 URL
            postThumbnail = post.media$thumbnail ? post.media$thumbnail.url : config.noThumbnail, // 게시물/페이지 미리보기 이미지
            postAuthorName = post.author[0].name ? post.author[0].name.$t : config.text.anon, // 게시물/페이지 작성자 이름
            postAuthorURL = post.author[0].uri ? post.author[0].uri.$t : false, // 게시물/페이지 작성자 프로필 URL
            postAuthorAvatar = post.author[0].gd$image.src.replace(/\/s\d+(\-c)?\//, '/s' + config.avatarSize + '-c/'), // 게시물/페이지 작성자 프로필 아바타 URL
            postTitle = post.title.$t, // 게시물/페이지 제목
            postContent = post.content ? post.content.$t : post.summary.$t.replace(/<br *\/?>|[\s]+/gi, ' ').replace(/<.*?>|[<>]/g, ""), // 게시물/페이지 콘텐츠
            postEditURL = false; // 게시물/페이지 편집 URL

        // 사람이 읽을 수 있는 게시물/페이지 날짜 형식 생성
        var date = postDate.split('T')[0].split('-');
        postDate = date[2] + ' ' + config.text.monthNames[(+date[1]) - 1] + ' ' + date[0];

        // 게시물/페이지 썸네일 URL에서 선행 http:// 또는 https:// 제거.
        postThumbnail = postThumbnail.replace(/^https?\:/, "");

        // 게시물/페이지 작성자 프로필 아바타 URL에서 선행 http:// 또는 https:// 제거.
        postAuthorAvatar = postAuthorAvatar.replace(/^https?\:/, "");

        for (var j = 0, jen = post.link.length; j < jen; ++j) {
            item = post.link[j];
            if (item.rel == 'self') {
                // 원본 게시물/페이지 ID 가져오기
                postID = item.href.split('/').pop();
                // 게시물/페이지 편집 URL 가져오기
                postEditURL = item.href.replace(/\/feeds\/(\d+)\/(post|page)s?\/(default|summary)\/(\d+)/, '/$2-edit.g?blogID=$1&$2ID=$4');
            }
            // 게시물/페이지 URL 가져오기
            if (item.rel == 'alternate') {
                postURL = item.href;
            }
            // 게시물/페이지 댓글 피드 URL 가져오기
            if (item.rel == 'replies' && item.type == 'application/atom+xml') {
                postCommentFeedURL = item.href;
            }
        }

        // 게시물/페이지 콘텐츠에서 외부 이미지 URL을 가져오기
        if (post.content && postThumbnail == config.noThumbnail) {
            var image = /<img +(.*?)src=(['"])([^'"]+?)(['"])(.*?) *\/?>/i.exec(post.content.$t);
            postThumbnail = image && image[3] ? image[3] : config.noThumbnail;
        }

        // 게시물/페이지 태그 가져오기
        if (post.category && post.category.length) {
            postTags = [];
            for (var k = 0, ken = post.category.length; k < ken; ++k) {
                postTags.push(post.category[k].term);
            }
            // 게시물/페이지 태그를 알파벳순으로 정렬
            postTags = postTags.sort();
        }

        // 마크업 생성 시작...
        html += '<li>';
        html += '<p><b>ID:</b> ' + postID + '</p>';
        html += '<p><b>Publish:</b> ' + postPublish + '</p>';
        html += '<p><b>Update:</b> ' + postUpdate + '</p>';
        html += '<p><b>Date:</b> ' + postDate + '</p>';
        html += '<p><b>URL:</b> ' + postURL + '</p>';
        html += '<p><b>Tags:</b> ' + (postTags !== false ? postTags.join(', ') : config.text.untagged) + '</p>';
        html += '<p><b>Comment Total:</b> ' + postCommentTotal + '</p>';
        html += '<p><b>Comment Feed URL:</b> ' + postCommentFeedURL + '</p>';
        html += '<p><b>Thumbnail:</b> ' + postThumbnail + '</p>';
        html += '<p><b>Author:</b> ' + postAuthorName + '</p>';
        html += postAuthorURL !== false ? '<p><b>Author URL:</b> ' + postAuthorURL + '</p>' : "";
        html += '<p><b>Author Avatar URL:</b> ' + postAuthorAvatar + '</p>';
        html += '<p><b>Edit URL:</b> ' + postEditURL + '</p>';
        html += '<p><b>Title:</b> ' + postTitle + '</p>';
        html += '<p><b>Content:</b></p>';
        html += '<div>' + postContent + '</div>';
        html += '</li>';
    }
    html += '</ol>';

    // 생성된 데이터를 컨테이너에 표시합니다.
    container.innerHTML = html;
}

</script>

<!-- example.com 을 여러분의 블로거 URL로 변경해 주세요. --//>
<script src="//example.com/feeds/posts/default?alt=json-in-script&orderby=published&max-results=10&callback=generatePostsData"></script>
</body>
</html>

블로그 피드를 먼저 활성화해야 합니다. 설정 > 사이트 피드 섹션의 "블로그 피드 허용"에서 "전부 허용"을 선택해서 활성화합니다.

전체 게시물을 가져올 때는 https://example.com/feeds/posts/default 입니다. 여기서 특정 키워드에 대한 피드를 얻을 수 있습니다.

전체 게시물에서 키워드별 피드의 경우 다음 엔드포인트를 사용하세요.

https://example.com/feeds/posts/default?q=[검색 단어]
https://example.com/feeds/BLOGID/posts/default?q=[검색 단어]
키워드는 q 쿼리 매개변수에 검색 문자열로 전달되어야 합니다.

라벨로 가져올 때는 아래 형식으로 가져올 수 있습니다.
https://example.com/feeds/posts/default/-/[라벨]
해당 라벨에서 키워드별 피드를 출력할 때는 다음을 사용하세요.
https://example.com/feeds/posts/default/-/[라벨]?q=[검색 단어]


출처: https://github.com/taufik-nurrohman/dte-project/blob/master/blogger-json-experiment/json-parser-for-blogger-posts-1.html

0 댓글