디시클리너 무조건 따라하기 - 1
goes(220.127)
2017-06-28 11:26
추천 11
자바스크립트로 만들어 보도록 할거야
요소 검사 들어가면 실행할 수 있고, 비동기 HTTP 요청도 되고, 비교적 쉬운 등 장점이 많기 때문이지
1. 관찰: 검색을 해보고 주소변화를 관찰해보자
일단 글쓴이가 goes인걸 검색해보면
http://gall.dcinside.com/board/lists/?id=programming&s_type=search_name&s_keyword=goes
이거잖아
각 페이지는 page=페이지수 로 되고
모든 페이지를 불러오려면 페이지에서 >>다음 표시가 없을때까지 계속 열람하면 되겠지
또 과부하를 막기 위해서인지 있는 다음검색> 기능도 있는데,
다음검색을 누르면 주소가 이렇게 바껴.
http://gall.dcinside.com/board/lists/?id=programming&page=1&search_pos=-706751&s_type=search_name&s_keyword=goes
search_pos=-706751이 추가되었고 page=1이 추가되었지?
페이지는 원래 1이였으니 요청할때 앞에거만 잘 붙여주면 될거야
2. 구현: jQuery, JavaScript
js는 기본적으로 비동기 요청이 되니까, 대충 이렇겠네
function 요청(page, search_pos) {
$.get {id: '갤러리이름', s_type: 'search_name', 's_keyword': '닉네임'}
콜백 {
1. 다음검색>의 page 1 요청(1, new_search_pos)
2. 현재 표시되어있는 페이지 번호들 전부 요청(new_page, search_pos)
3. 다음 > 링크에 있는 페이지 요청(new_page, search_pos)
4. 현재 페이지 안에 있는 모든 글 번호에 대해 글삭제(글번호)
}
}
function 글삭제(글번호) {
일단은 글 번호만 로깅하는걸로 하자
} |
일단 dcinside에는 jQuery를 쓰고있으니 그걸 잘 이용해보면 되겠군
소스는 개 길지만 사실 그냥 노가다일 뿐이야
function request(page, pos) {
$.ajax({
type:
'get',
// GET 메서드
dataType:
'html',
// 응답을 HTML로 파싱
url:
'/board/lists/',
headers: {
'X-Requested-With':
'?'
},
data: {
id:
'programming',
// 갤러리 이름
s_type:
'search_name',
// 글쓴이 검색
s_keyword:
'goes',
// 내 닉네임
search_pos: pos,
// 다음검색
page: page
// 페이지. 인자로 들어옴
}
/* 참고로 이렇게 넣으면 알아서 주소에 인코딩되서 들어감 */
}).success(
function(data) {
// 자 이제 jQuery를 받아온 응답에 대해 다룬다
// DOM 개체가 그대로 들어오기때문에 $()로만 싸면 그냥 평소에 하듯이, 대신 .find만 붙여주면 됨
if (
!data)
// 이건 디시에서 너무 빠르게 요청하면 막는거라서 대충 요청 다시하면 되는듯
return setTimeout(request,
Math.
random()
* 30000, page, pos)
var next_page_group, next_pos;
var $document;
$document = $(data);
$document.
find(
'#dgn_btn_paging a').each((x, y)
=> {
var $this = $(y);
var href
= new URLSearchParams(
$this.attr(
'href'));
if (
$this.hasClass(
'b_next')) {
var text
= $this.
find(
'.arrow_1').
text().trim();
if (text
== '다음') next_page_group
= href;
// 3-1
if (text
== '다음검색') next_pos
= href;
// 1-1
}
else if (
$this[
0].
className == '') {
request(href.get(
'page'), pos)
// 2
}
})
$document.
find(
'td.t_subject a:last').each((x, y)
=> {
var $this = $(y);
var href
= new URLSearchParams(
$this.attr(
'href'));
if (
$this.
find(
'b').
length)
return;
// 공지글
delete_article(href.get(
'no'))
// 4
})
if (next_page_group) request(next_page_group.get(
'page'), pos);
// 3-2
if (next_pos) request(
1, next_pos.get(
'search_pos'))
// 1-2
})
}
function delete_article(no) {
console.log(no);
}
request(
1,
0);
일단 delete_article은 콘솔에 글 번호만 로깅하는것으로 남겨놨어
실행해보자. 로그가 남으면 정상이겠지

남네
이제 글 지우기를 봐야겠지
글 지우는건 다음편에 남길테니 다음편에는 풀 코드가 올라오겠군
겟으로 보내면 안될텐데
오잉 되던데
추천
와 멋져용 개추 - dc App
검색은 당연히 get으로 되지 주소창에 주소만 제대로 쳐도 동작하는데
어 ㅁㅊ 수정이 안되잖아 코드에 버그있는데 a:last를 a로 바꿔야할거같아
개념글은 컴퓨터로 들어오면 수정 가능
비회원이라 그런가 안되네
올ㅋ