1편 : https://arca.live/b/revivedwitch/58910947

2-1편 : https://arca.live/b/revivedwitch/58933084



아 어제는 전날에 밤을 새버렸어가지고 자느라 제작일기 쓰는걸 까먹었음



1편엔 카페에서 공지 가져오기 기능을 구현했고, 2-1편에서는 아카라이브 로그인을 구혔했어

이번 2-2편에서는 2-1편에서 얘기한대로 깨챈에 글쓰기 기능구현을 할꺼야
추가로 이전에 2-1편에서는 아카라이브에서 봇검증으로 막아둬서 못쓴다고 했던거 해결해왔음!!!!!



이번에 구현하는 기능인 글쓰기도 로그인 구현방식과 굉장히 유사해

필요한 데이터를 모으고 형식에 맞춰서 가공한다음에 서버에 요청을 보낸다

이 한줄로 기능 구현 설명이 끝난거야


자 그럼 글쓰기 구현을 어떻게 하는지 하나씩 살펴보자
우선 로그인이랑 똑같이 우리가 글을 작성했을때 어떻게 아카라이브 서버에 request가 전달되는지 확인을 해보자

자 이렇게 우리가 글을 작성할때 아카라이브 서버에 전달되는 정보들을 가져와봤어


여기서 Headers항목의 General쪽을 봐보면 로그인이랑 똑같이 POST로 서버에 request를 보낸걸 볼 수 있어
그리고 이 POST로 보낸 request에는 어떤 정보가 담겨있나 보려면 Payload 항목의 Form Data를 보면되는데 

이 Payload를 살펴보면 어떤 데이터가 같이 서버로 보내지는지 알 수 있어


위의 Payload를 보니깐 로그인이랑 똑같이 _csrf가 전달되고, 나머지 token, contentType, category, title, content 얘네들은 새로운 애들이지
csrf값을 가져오는건 2-1편에 있으니 스킵하고 이번에 새로 추가된 친구들의 데이터는 어떻게 가져오는지 보자


첫번째로 token을 어떻게 가져오는지 알아보려면 글쓰기 페이지의 HTML을 봐야해

우리가 필요한 부분의 HTML을 가져왔어
파란색으로 강조된 영역의 HTML을 보면 얘가 우리가 글을 쓸때 필요한 token값을 가지고 있다는 걸 알 수 있지


token값을 가지고 있다는건 알았는데 어떻게 가져오지?
이 token값을 가져오는건 csrf값 가져오는 방법과 가져오는 데이터만 다르고 방법은 똑같아!
그래서 이것도 코드를 보면

코드를 보면 필터링하는 name만 다르지 나머지는 똑같다는걸 볼 수 있지

이 함수를 호출하면 서버에서 가져온 HTML에서 token값만 찾아와서 우리에게 전달해줘

이게 끝!

자 이제 나머지 애들은 아주 간단해

전부 명시적으로 고정되어 있는 형태라 복잡한 코드 같은건 필요없어

contentType은 우리가 글을 쓸때 이 글이 어떤 형식인지를 알려주는 아이인데
아카라이브의 글쓰기 기능은 전부 HTML형식으로 지정되어 있어


다음으로 category는 우리가 글을 쓸때 지정하는 글머리,


title과 content는 딱 보면 알 수 있듯이 제목과 내용이야

title은 그냥 카페에서 가져온 내용 그대로 적어서 전달하면 되는데
아까 contentType에서 얘기했듯이 아카라이브는 HTML만 받는단말이지?
그래서 우리가 크롤러로 가져온 공지내용을 HTML형식으로 바꿔주는 기능이 필요해

우리가 가져온 공지내용을 이 함수에 인자로 전달하면 간단한 HTML태그를 붙여서 

우리가 content로 전달할수 있는 형태의 문자열을 우리에게 전달해줘


이런식으로 코드를 작성하면 우리는 깨챈에 글을 쓸때 필요한 모든 데이터를 가져올 수 있게 된거야



이렇게 가져온 데이터를 위에 함수를 통해서 Payload를 만들고


위의 함수를 호출해서 아카라이브에 리퀘스트를 전달하면!


우리는 이제 직접 공지를 가져올 필요가 없게 되었음!! 


이렇게 깨마 공지봇의 전반적인 모든 기능구현은 끝이야!!!!



이제 저번에 아카라이브에 막혔다던 봇작동은 어떻게 해결했는지 이야기 해주자면
우선 아카라이브는 클라우드플레어를 이용해서 봇검증을 진행하는데

우리가 평범하게 코드로 리퀘스트를 보내면 실제 브라우저로 보내는 리퀘스트와 달리 전달되는 리퀘스트의 정보가 검증을 받지 못해서 중간에 클라우드플레어의 선에서 우리가 보낸 리퀘스트가 짤리는거야

그럼 우리가 이걸 해결하려면 클라우드플레어를 우회하거나 이것저것 데이터를 가져와서 우리가 보내는 리퀘스트를 정상적인 리퀘스트라고 검증을 시켜줘야해


나는 클라우드플레어 우회를 하는 방법을 선택했고 내가 이 공지봇을 만드는데 사용한 언어인 Python에는 cloudscraper라는 클라우드플레어 우회를 해주는 모듈이 존재해서 나는 이걸 사용했어

이 cloudscraper라는 모듈의 작동원리는 

나도 사실몰라 ㅎㅎ..

궁금한사람들은 cloudscraper모듈을 직접까보면서 공부해봐..




아무튼 이렇게 깨마 공지봇 제작 일기 2-2편도 끝났어

저번에 이것저것 자세하게 설명했더니 못알아듣는 사람이 대부분이라 이번엔 설명을 많이 줄여서 썼는데 괜찮으려나 모르겠음

긴글읽어줘서 고맙고 이제 다음 3편에 호스팅서버 업로드 & 테스트로 이 제작일기를 끝낼꺼야



그럼 이만


(마찬가지로 혹시나 코드가 궁금한 사람은 얘기해주면 깃허브에 올려서 보여줄께!)