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)
위 소스를 이용하여 테스트한 결과를 캡쳐하여 첨부합니다 ^^
위 스크립트의 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
그럼 즐거운 주말 되세요! ^-^
감사합니다.
트리플 님께서 올려주시는 양질의 자료에 비하면 부족한 점이 많은 스크립트네요 ㅠㅠ
저야말로 항상 감사드립니다! ^-^
그럼 맛점 드시고 좋은 오후 되세요~ :)
좋은 오후 되세요! :)
굿밤 되세요 :)
남은 4월 잘 마무리하세요! ^-^
글쓰기는 되나 글삭제 등이 안되어 확인하니 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구문을 쓰지 않으면 순서가 뒤죽박죽 나올 때가 많더라고요.