Python으로 구현한 그누보드 자동 글쓰기 함수 > 그누보드5 팁자료실

그누보드5 팁자료실

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

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)

 

 

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

 

img 20210408 194713.png.jpg

 

 

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

 

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

 

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

추천
13

댓글 22개

개념이 약한 초보라서 잘은 모르지만
외부에서 엑셀 데이터를 그누보드에 올렸으면 했다가 포기했는데
응용하면 가능할련지요?
안녕하세요?
말씀하신 것처럼 엑셀 파일을 그누보드 게시글로 옮기는 방법 중 하나로 위 스크립트를 응용할 수 있을 것 같네요.
제가 예전에 파이썬으로 엑셀 파일을 읽는 방법에 대한 간단한 강좌글을 올린 적이 있어요 ^^
https://studyforus.com/innisfree/657007
그런데 엑셀 파일을 읽은 후에 프론트엔드에서 어떻게 처리할지에 대해서는 다시 여러 방법을 놓고 고민을 해야겠네요~
간단하지만 러프한 방법으로는 엑셀의 각 셀을 table 태그로 표시해주는 방법이 있겠죠.

어차피 프론트엔드에서의 구현 방법이 고민된다면 Javascript 라이브러리 중에서 엑셀 파일을 직접 읽어서 브라우저에서 보여주는 방법을 선택하시는 편이 낫지 않을까 생각이 되네요 :)
저도 사용해보지는 않았지만 다음과 같은 라이브러리가 있네요~
https://github.com/SheetJS/sheetjs

그럼 즐거운 주말 되세요! ^-^
트리플 님~ 안녕하세요?
트리플 님께서 올려주시는 양질의 자료에 비하면 부족한 점이 많은 스크립트네요 ㅠㅠ
저야말로 항상 감사드립니다! ^-^
그럼 맛점 드시고 좋은 오후 되세요~ :)
허접한 소스인데 저야말로 감사드립니다 ^-^
업무에 조금이나마 도움이 되셨으면 좋겠네요~
그럼 굿밤 되세요 :)
안녕하세요?
https://sir.kr/g5_tip/15904 이 글에 같은 질문을 댓글로 남겨주셨길래
해당 댓글에 답변을 드렸습니다 ^^
그럼 즐거운 휴일 되세요~ :)
번번이 좋은 팁을 올려주셔서 저야말로 감사드립니다 ^-^
필요하신 기능이라니 제가 더 기쁘네요~
그럼 편안한 밤 되세요! :)
귀한 자료 공유해주셔서 많은 도움이 되었습니다.

글쓰기는 되나 글삭제 등이 안되어 확인하니 wr_parent가 가끔 다르게 등록되어서 그래서 이 곳에 보고합니다.

 # wr_id를 구한 후 부모 아이디에 UPDATE 합니다.
    sql = f"select wr_id from g5_write_{board}"

이 sql 문구 뒤에  order by wr_id를 넣으니 가장 마지막 wr_id를 찾아서 wr_parent에 넣어주더군요.
order by구문을 쓰지 않으면 순서가 뒤죽박죽 나올 때가 많더라고요.
전체 2,427 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT