조회 수 1506 추천 수 1 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
Extra Form
라이선스 기타(따로 작성)

안녕하세요?

 

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

 

그 첫번째 단계로 파이썬으로 구현한 그누보드 자동 글쓰기 함수를 작성해봤어요.

 

저는 크롤링 서버를 별도로 두고 있기 때문에, 외부에서 그누보드 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와 크게 다르지 않지만,

 

파이썬으로 외부 접속을 하면 PHP의 global $g5 등을 사용할 수 없기 때문에 다소의 차이가 있습니다.

 

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

 

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

 

이 경우에는 requests로 다시 한 번 hit을 하는 방식으로 해결하여야 합니다.

 

 

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

 

마지막으로 작성자명을 실제 계정의 닉네임과 달리 적용한 경우에는, 

 

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

 

 

제가 앞으로 시간이 있을 때 파이썬으로 첨부파일까지 업로드할 수 있도록 위 소스를 보완해볼게요~

 

허접한 소스를 읽어주셔서 감사드리고 그럼 다들 편안한 저녁 되세요 ^^

 

  • profile
    이니스프리 2021.09.10 21:16
    업데이트된 버전을 올렸습니다 ^-^
    https://studyforus.com/study/818104

  1. AWSCLI, in a single file (portable, linux)

    Date2021.04.10 Category코드 BySeia Views312
    Read More
  2. [Python-Gnuboard] 파이썬으로 구현한 그누보드 자동 글쓰기 함수

    Date2021.04.08 Category코드 By이니스프리 Views1506
    Read More
  3. [Python] 휴일지킴이 약국을 크롤링하여 Folium 지도에 마커로 표시하는 PyQt 윈도우 앱

    Date2021.03.13 Category코드 By이니스프리 Views1254
    Read More
  4. 도박 중독자를 위한 광고 차단 규칙

    Date2020.08.21 Category코드 By제르엘 Views440
    Read More
  5. [Python] 유튜브 영상을 다운받아 일정 간격으로 캡쳐하여 10장씩 merge하기

    Date2020.05.27 Category코드 By이니스프리 Views1244
    Read More
  6. [Python/Telegram] Studyforus 알림봇 (댓글, 스티커 파싱)

    Date2020.05.15 Category코드 By이니스프리 Views833
    Read More
  7. [Python] url 주소로부터 IP 주소 알아내기

    Date2020.02.20 Category코드 Bytitle: 황금 서버 (30일)humit Views2223
    Read More
  8. [Python] 네이버 실시간 검색어

    Date2020.01.23 Category코드 Bytitle: 황금 서버 (30일)humit Views1321
    Read More
  9. Koa에서 자동으로 라우팅 채워주기

    Date2020.01.22 Category코드 BySeia Views662
    Read More
  10. JavaScript에서 파이썬 문자열 처리 함수 중 하나 (바인딩)를 구현

    Date2020.01.20 Category코드 BySeia Views564
    Read More
  11. [Python] Google Image Search 결과를 받아오기

    Date2019.12.09 Category코드 By이니스프리 Views1189
    Read More
  12. [파이썬] Requests를 사용한 네이버 카페 크롤링 - 일정수 이상의 리플이 달린 게시글만 텔레그램 알림

    Date2019.11.17 Category코드 By이니스프리 Views4347
    Read More
  13. [JS] 클라이언트단 GET Parameter

    Date2019.11.16 Category코드 ByHanam09 Views656
    Read More
  14. [Python] 싸이월드 미니홈피 백업 스크립트

    Date2019.11.07 Category코드 By이니스프리 Views2446
    Read More
  15. [Python] PIL을 이용한 Animated GIF의 리사이징

    Date2019.11.03 Category코드 By이니스프리 Views1317
    Read More
  16. [PyQt] sir.kr에서 스크랩한 게시글을 보여주는 윈도우앱 (검색 및 정렬 가능)

    Date2019.08.09 Category코드 By이니스프리 Views1126
    Read More
  17. [아미나] Dropbox API를 이용한 이미지 호스팅 보드스킨

    Date2019.07.13 Category코드 By이니스프리 Views1593
    Read More
  18. [Python] 네이버 모바일 이미지 검색에서의 이미지 파일을 멀티스레드로 다운받고 1개의 파일로 병합

    Date2019.07.12 Category코드 By이니스프리 Views1473
    Read More
  19. [PHP/Javascript] 아미나에 자동으로 게시글을 생성하고 Ajax로 전송하여 결과를 표시하기

    Date2019.07.09 Category코드 By이니스프리 Views925
    Read More
  20. [Python] Selenium을 이용하여 특정 element를 캡처하는 스크립트

    Date2019.07.03 Category코드 By이니스프리 Views6105
    Read More
Board Pagination Prev 1 2 3 4 Next
/ 4