blogger
[구글 블로거] RSS 피드 파싱하는 방법
일반 웹사이트에 구글 블로그 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=[검색 단어]
0 댓글