본문 바로가기
Today I learned

2021 04 30 - 티스토리 최근 3개월 포스팅여부 가져오기 (작성중)

by soheemon 2021. 4. 30.
나도 깃허브 잔디밭처럼 포스팅 목록을 가져오고 싶다아-- 

라는 생각으로 시작한 토이프로젝트..

 

// 좀 무식한 방법이지만, 글목록 가져오자고 API를 팔 수도 없는 노릇이고.. 그냥 티스토리에서 날짜별 글 목록 HTML을 반환하는 API를 끌어다 썼다. 때문에 필요한 데이터만 가져오기위해 정규식으로 파싱을 한다.

// 정규식때문에 고생을 많이했다. 정규식은 해도해도 헷갈린다..

 

아직 최근 3개월 날짜를 가져오는 로직은 작성중

깃허브처럼 예쁘게 보여줄 방법도 고민중...

(function(){
var utils = {
	nowYear : 2021,
	getRecent3Month : function (baseMonth){
      if(!(baseMonth <= 12 && baseMonth >= 1)) return

      var month = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
      var resultArr = []
      var monthIndex	= baseMonth - 1 // index는 0부터 시작하니 달에 맞추기 위해 index보정 -1
      for(var loopCount = 0; loopCount < 3; loopCount++, monthIndex--){
          if(monthIndex == -1) monthIndex = 11
          resultArr.push(month[monthIndex])
      }
      return resultArr
    },
	getPost : function(index, month, result){
		if(!month) return
		var post = "";
		$.ajax({ 
			url: "/archive/" + utils.nowYear + month,
			method: "GET",
			success: function(response){
				result[index]['status'] = true
				result[index]['post'] = response
				result[index]['month'] = month
			}
		})
	},
	ControlPost : function (){
		this.status = false
		this.post = ''
		this.month = 0
	},
	PostListData : function(month, postingList){
		this.month = month
		this.postingList = postingList
	},
	getPostInfo : function(postData){
		if(!postData) return
		return postData.match(/<td class=" cal_day [\s|\S]*?">([\s|\S]*?)<\/td>/g)
	},
	getPostingDay : function(postList){
		if(!postList) return
		var resultArr = []
		var reg = /<td class=" cal_day [a-z|0-9|_].*">[0-9]{1,2}<\/td>/
		for(var i = 0; i < postList.length; i++){
			//console.log(postList[i])
			resultArr.push(!(reg.test(postList[i])))
		}
		return resultArr
	}

}
// 공통로직

// ajax로 비동기로 쏜다.
var recentMonth = utils.getRecent3Month(new Date().getMonth() + 1)
var result = [new utils.ControlPost(), new utils.ControlPost(), new utils.ControlPost()]	//비동기로 쏜거 전부 왔는지 확인.
for(var index = 0; index < 3; index++){
	utils.getPost(index, recentMonth[index], result)
}

// 3개월치가 전부 올 때까지 기다린다. interval로 체크하며 기다린다.
var postListInfo = []	//최종적으로 최근 3개월의 포스팅여부를 가져올 배열입니다! PostListData배열입니다.
var ckGaInterval = setInterval(function(){
	// 3개월치가 전부 왔당!
	if(result[0]['status'] && result[1]['status'] && result[2]['status']){
		for(var index = 0; index < 3; index++){
			var rawPost = utils.getPostInfo(result[index]['post'])
			postListInfo.push(new utils.PostListData(result[index]['month'], utils.getPostingDay(rawPost)))
		}
		/* 결과를 가지고 처리할 로직*/
		console.log(postListInfo)
		/* 결과를 가지고 처리할 로직*/
		clearInterval(ckGaInterval)	
	}
}, 1000);

//10초동안 안끝나면 그냥 얼레벌레 끝..
setTimeout(function(){
    clearInterval(ckGaInterval);
}, 10000);
})()
<!DOCTYPE html>
<html lang="en">
<head>

<style>	
.line{
	float: left;
	display: inline-block;
	display: grid;
    grid-template-rows: 7;
    grid-template-columns: 1;
	margin-right: 5px
}
.line span{
display: inline-block;
width: 15px;
height: 15px;
margin-bottom: 5px;
border:1px solid #eaeaea;
}


</style>
</head>
<body>	
<div class=lineWrap>	
 <div class="line">
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
 </div>
  <div class="line">
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
		 <span></span>
 </div>
</div>
</body>
<script>
	
</script>

</html>

댓글