파비의 매일매일 공부기록

티스토리 자동 글 생성기 using Python #4 (마지막) 본문

Side Project (완료)/티스토리 자동 글 생성기 (2021)

티스토리 자동 글 생성기 using Python #4 (마지막)

fabichoi 2021. 9. 6. 23:30

이번 포스팅이 티스토리 자동 글 생성기 사이드 프로젝트의 마지막이다.

 

지금까지의 소스를 기준으로

csv의 파일을 다른 파일로 선택하고 싶을 때마다 소스를 수정해야 한다.

그런 번거로움을 감수하고 싶지 않으므로.. args 형태로 파라미터로 파일명을 받으려고 한다.

 

사실 그냥 main 함수에 args 필드만 추가해서 처리해도 되지만

argparse라는 파이썬 모듈이 기본적으로 제공돼서 이걸 써볼 생각이다.
(https://docs.python.org/ko/3.7/library/argparse.html 참조)

일단 main.py 실행 시 가장 처음 호출되는 부분을 아래와 같이 변경한다.

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Posts auto upload on Tistory.')
    parser.add_argument('filename', type=str, help="csv file", action=PostAction)
    args = parser.parse_args()

기본적으로 help 메시지(-h, --help)를 제공하기에 거기에 나타낼 description을 정의해주고

filename을 필수 argument로 등록해준다.

또한 PostAction Class를 새로 만들어서 main.py에 filename argument가 들어왔을 때 실행하도록 수정해준다.

다음은 PostAction Class의 소스다.

class PostAction(argparse.Action):
    def __init__(self, option_strings, dest, nargs=None, **kwargs):
        if nargs is not None:
            raise ValueError("nargs not allowed")
        super(PostAction, self).__init__(option_strings, dest, **kwargs)

    def __call__(self, parser, namesapce, values, option_string=None):
        init_params = self.get_init_params()
        extra_params = self.get_csv_file(values)
        params_list = self.make_posts(init_params, extra_params)

        for params in params_list:
            requests.post('https://www.tistory.com/apis/post/write', params=params)
           
    def make_posts(self, init_params, extra_params):
        # 이미 작성된 내용과 동일

    def get_csv_file(self, filename):
        # 이미 작성된 내용과 동일

    def get_init_params(self):
        # 이미 작성된 내용과 동일

argparse.Action을 상속받아서 PostAction을 생성한다.

__init__, __call__의 인자들은 레퍼런스 문서와 동일하게 구성했고

__call__ 함수에 예전에 main에 있었던 내용들을 넣어주었다.

 

이제 일단락 마치려고 했는데...

현재 로직은 글 작성 실패/성공 여부에 상관없이 아무런 메시지도 보여주고 있지 않아서

만약 글 작성이 실패할 경우에는 어떤 이유 때문에 문제가 생겼는지 알 수가 없다.

 

그래서 마지막으로 logging이라는 파이썬 내장 모듈을 이용해서 간단하게 로그 처리를 하려고 한다.

if __name__ == '__main__':
    logging.basicConfig(format='%(levelname)s: %(message)s', level=logging.INFO)
    # 기존 작성된 내용과 동일

level=logging.INFO 설정을 안 해주면 info message도 나오지 않음(이것 때문에 약 30분 삽질 ㅠㅠ)

(format 설정을 안 해주면 ERROR:root:message 이련 형태라서 가독성이 떨어짐.)

 

그리고 PostAction Class의 __call__ 함수를 다음과 같이 수정하면 된다.

    def __call__(self, parser, namesapce, values, option_string=None):
        # 기존 작성된 소스와 동일

        for params in params_list:
            r = requests.post('https://www.tistory.com/apis/post/write', params=params)
            if r.status_code == 200:
                logging.info('%s 글 작성 완료.' % params.get('title'))
            else:
                logging.error(json.loads(r.text))

Response 된 status code가 200이면 글 작성이 완료된 것으로 logging.info 메시지를 출력하고

status code가 200이 아니면 logging.error 메시지를 출력한다.

 

그런데 logging.error 메시지가 한글인 경우 깨져서 보이는 경우가 있어서 

json.loads 함수를 이용해서 깨지지 않도록 처리했다. (https://hashcode.co.kr/questions/9964/%EB%A6%AC%ED%80%98%EC%8A%A4%ED%8A%B8-%EB%AA%A8%EB%93%88%EB%A1%9C-%EA%B0%80%EC%A0%B8%EC%98%A8-response-%EA%B0%9C%EC%B2%B4%EC%97%90%EC%84%9C-%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C%EB%A5%BC-%ED%95%9C%EA%B8%80%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%8A%B5%EB%8B%88%EB%8B%A4)

 

이렇게 해서 간단하게 사용 가능한 티스토리 자동 글 생성기 사이드 프로젝트가 끝났다.

예전에 만들었던 간단한 사이드 프로젝트들도 이렇게 정리해놨다면

미래에 큰 도움이 되었을 것 같다는 생각이 든다. ㅎㅎㅎㅎ 뭐 이제부터 하면 되지.

반응형
Comments