정보공유

Python으로 구현한 그누보드 자동 글쓰기 함수

작성자 정보

  • 잘생긴홀릭 작성
  • 작성일

컨텐츠 정보

본문

안녕하세요?

 

허접한 실력이지만 파이썬을 활용하여 그누보드의 백엔드를 보완하는 프로젝트를 시도해보려고 하네요 ^^

 

Q&A 게시판에 파이썬으로 크롤링한 결과를 그누보드 게시글로 올리는 방법에 관한 문의글이 종종 올라오길래

 

프로젝트의 첫번째 단계로 pymysql 모듈을 이용한 그누보드 자동 글쓰기 함수를 작성해봤어요~

 

저는 크롤링 서버를 별도로 두고 있기 때문에, 외부에서 그누보드 DB에 접속하는 방식으로 구현했어요.

(사용하시는 웹호스팅 또는 VPS에서 DB 외부접속을 허용하도록 설정해야 합니다.)

 

아미나 & 파이썬 3.7에서 테스트했으나, 그누보드 및 파이썬의 다른 버전에서도 대동소이할 것 같네요 :)

 

 



import pymysql

from datetime import datetime

 

 

def board_write(board, subject, content, mb_id, nickname):

    # MySQL connection 및 cursor를 생성합니다.

    conn = pymysql.connect(host = 'URL을입력하세요', 

                           user = 'DB계정을입력하세요', 

                           password = 'DB비번을입력하세요',

                           db = 'DB명을 입력하세요', 

                           charset = 'utf8')

    curs = conn.cursor()

 

    # wr_num을 구한 후 작성글을 INSERT 합니다.

    sql = f"select wr_num from g5_write_{board}"

    curs.execute(sql)

    wr_num = str(int(curs.fetchone()[0]) - 1)

    now = datetime.today().strftime('%Y-%m-%d %H:%M:%S') # 그누보드의 날짜 형식 준수 (ex: 2021-04-05 23:45:15)

    sql = f"insert into g5_write_{board} set wr_num = {wr_num}, 

          wr_reply = '', wr_comment = 0, ca_name = '', wr_option = 'html1', wr_subject = '{subject}', 

          wr_content = '{content}', wr_link1 = '', wr_link2 = '', 

          wr_link1_hit = 0, wr_link2_hit = 0, wr_hit = 1, wr_good = 0, wr_nogood = 0, 

          mb_id = '{mb_id}', wr_password = '', wr_name = '{nickname}', wr_email = '', wr_homepage = '', 

          wr_datetime = '{now}', wr_last = '{now}', wr_ip = '111.111.111.111', 

          wr_1 = '', wr_2 = '', wr_3 = '', wr_4 = '', wr_5 = '', 

          wr_6 = '', wr_7 = '', wr_8 = '', wr_9 = '', wr_10 = '', 

          wr_comment_reply = '', wr_facebook_user = '', wr_twitter_user = '', 

          as_re_name = '', as_tag = '', as_map = '', as_icon = '', as_thumb = '', as_video = ''"

    curs.execute(sql)

 

    # wr_id를 구한 후 부모 아이디에 UPDATE 합니다.

    sql = f"select wr_id from g5_write_{board}"

    curs.execute(sql)

    wr_id = str(curs.fetchall()[-1][0])

    sql = f"update g5_write_{board} set wr_parent = {wr_id} where wr_id = {wr_id}"

    curs.execute(sql)

 

    # 새 글을 INSERT 합니다.

    sql = f"insert into g5_board_new ( bo_table, wr_id, wr_parent, bn_datetime, mb_id ) values 

          ( '{board}', '{wr_id}', '{wr_id}', '{now}', '{mb_id}' )"

    curs.execute(sql)

 

    # 게시글을 1 증가시킵니다.

    sql = f"select bo_count_write from g5_board where bo_table = '{board}'"

    curs.execute(sql)

    bo_count_write = str(int(curs.fetchone()[0]))

    sql = f"update g5_board set bo_count_write = {bo_count_write} + 1 where bo_table = '{board}'"

    curs.execute(sql)

 

    # MySQL connection 닫기

    conn.close()

    return

 

 

board = '게시판명을입력하세요'

subject = '제목을입력하세요'

content = '내용을입력하세요(HTML태그도가능합니다)'

mb_id = 'ID를입력하세요'

nickname = '작성자명을입력하세요'

board_write(board, subject, content, mb_id, nickname)


 

 

위 소스를 이용하여 테스트한 결과를 캡쳐하여 첨부합니다 ^^

 

 

 

위 스크립트의 SQL 문만 놓고보면 그누보드의 write_update.php와 크게 다르지 않지만,

 

파이썬으로 외부 접속을 하면 그누보드의 $g5 변수 등을 사용할 수 없기 때문에 조금 더 복잡해졌네요~

 

그리고 wr_hit을 0으로 지정하면 크롤링 후 등록한 글의 조회수가 0으로 처리되기 때문에, 의도적으로 1로 설정했어요 ^^

 

참고로 이는 DB를 직접 건드리지 않고 requests를 이용하여 POST 전송으로 글을 작성한 경우에도 마찬가지로 발생하는 문제이며,

 

이 경우에는 requests로 해당 페이지를 직접 hit하는 방식으로 해결하여야 되어요.

 

 

한편 위 소스는 SQL injection과 관련하여 보완해야 될 부분이 있을 것 같네요 ㅠㅠ

 

그리고 작성자명을 실제 계정의 닉네임과 달리 적용한 경우에는, 

 

위 함수로 글을 올린 후에 로그인하여 글을 수정하면 실제 계정의 닉네임으로 변경되는 점을 주의하셔야 됩니다!

 

 

다음에는 첨부파일까지 업로드할 수 있도록 위 소스를 보완해볼게요~

 

그리고 위 함수를 이용하여 피드수집 보드도 파이썬으로 구현할게요.

 

제 허접한 소스를 읽어주셔서 감사드리고 그럼 좋은 주말 되세요 ^^

 

관련자료

댓글 0
등록된 댓글이 없습니다.

정보공유

최근글


새댓글


  • 댓글이 없습니다.
알림 0