시리즈:위키야 놀자/Pywikibot으로 커스텀 봇 만들기

이 글에서는 미디어위키 편집을 도와주는 도구인 Pywikibot의 사용법에 대해 소개하고자 합니다.

사전 준비[편집 | 원본 편집]

우선 Pywikibot은 Python 3 기반으로 돌아갑니다. 따라서 Python 공식 홈페이지나 대표적인 파이썬 기반 분석 도구인Anaconda를 컴퓨터에 설치하셔야 합니다. 윈도우 콘솔에서 파이썬을 사용하기 위해서는 환경 변수 설정이 필요한데, 내 PC-오른쪽 버튼 눌러서 시스템 속성을 띄운 뒤 고급 시스템 설정에서 고급 탭 선택 후 환경 변수(N) 버튼을 눌러 진입합니다. 그 다음에 PATH 변수를 선택한 뒤 새로 만들기 버튼을 눌러서 파이썬 실행파일이 설치된 경로를 직접 입력하거나 찾아보기 버튼을 눌러서 파이썬 실행파일이 있는 폴더의 경로를 직접 지정하시면 됩니다.

그 다음에는 당연히 Pywikibot 소스를 다운로드 받으셔야 합니다. PIP 패키지를 이용해서도 다운로드 받을 수 있지만 여기서는 직접 파이썬 스크립트를 콘솔 창에 직접 구동시키는 방식을 사용할 예정이니 이곳에서 직접 파이썬 소스를 다운로드 받고, 압축을 푸는 방식으로 구성할 예정입니다.

압축을 풀면 소스는 준비가 완료됐습니다. 이제는 리브레 위키에서 사용할 준비를 해야 합니다. 리브레 위키는 기본 소스에 저장이 되어 있지 않습니다. 따라서 연결해주는 설정을 먼저 해주어야 하는데요. 우선 Pywikibot이 설치된 디렉토리 - pywikibot - families 폴더를 선택한 뒤 "libre_family.py"라는 이름의 파일을 만들고 다음과 같이 소스를 작성해줍니다.

from pywikibot import family        # pywikibot에서 사용하고 있다는 표시

class Family(family.Family):

    name = 'libre'
    langs = {'ko':'librewiki.net'}

    def protocol(self, code):     #사용 프로토콜, https를 사용할 경우 반드시 지정해야 한다.
       return 'https'
    def scriptpath(self, code): # 스크립트 경로
       return ''
    def ignore_certificate_error(self, code): #인증서 오류 무시하기 위한 코드.
        return True

그 다음에 pywikibot 최상위 디렉토리에 user-config.py를 다음과 같이 작성해주시면 됩니다.

family = 'libre'
mylang = 'ko'
usernames['libre']['ko']= (계정명)

이제 커맨드 창이나 명령 프롬프트 등을 실행시키고 Pywikibot 소스가 설치된 디렉토리 최상위 폴더로 이동시키고, python pwb.py login라고 입력한 뒤에 비밀번호를 입력하시면 user-config.py에 설정된 계정 이름으로 로그인이 되는 것을 알 수 있습니다.

내장 스크립트 사용하기[편집 | 원본 편집]

내장 스크립트를 사용할 때에는 콘솔 창에서 pwb.py 소스를 이용해서 간접적으로 실행시키거나 혹은 scripts - userscripts(사용자 스크립트 저장하는 영역)에서 파이썬 소스를 불러와서 실행시키는 방법이 있습니다.

우선 내장 스크립트를 콘솔 창에서 실행시키기 위해서는 로그인한 상태에서 다음과 같이 입력하시면 됩니다.

> python pwb.py (스크립트명) (조건명)

각 스크립트의 사용방법을 안내하는 페이지는 Mediawiki 홈페이지의 Pywikibot 스크립트 사용법 페이지를 살펴보시면 됩니다.

커스텀 스크립트 작성하기[편집 | 원본 편집]

비록 Pywikibot에서 기본 스크립트를 이용해서 문서 내용을 바꿀 수 있지만 이 소프트웨어의 진가는 사용자가 임의로 문서 내용을 편집할 수 있다는 것에 있습니다. 스크립트 예시 하나를 통해 설명하겠습니다. 이 스크립트는 리브레 위키의 시리즈:모두의 영한사전의 하위 문서들을 큰숲백과의 "작은숲:모두의 영한사전" 하위문서로 옮기는 스트립트 예제입니다. 이 스크립트를 사용하기 위해서 user-scripts 디렉토리에 "libre_crawl.py"형식으로 저장했고, 위에서 pywikibot-families 폴더에 리브레 위키를 추가한 것처럼 큰숲백과(bigforest_family)도 저장을 하셔야 작동합니다. 사용할 때는 pywikibot 최상위 디렉토리에 이동한 뒤 콘솔 창에

>python pwb.py libre_crawl

라고 입력하시면 됩니다.

import pywikibot
from string import ascii_uppercase
import re

# 모두의 영한사전 크롤링

libre_site = pywikibot.Site('ko', 'libre')
bigfo_site = pywikibot.Site('ko', 'bigforest')

for alphabet in ascii_uppercase:
    # 모두의 영한사전 알파벳별 분류
    en_dic = pywikibot.Category(libre_site, f'모두의 영한사전/{alphabet}')
    for doc in en_dic.members():
        # 제목 찾기, doc 자체를 string으로 치환하면 인터위키를 포함한 문서 제목을 표현한다.
        title = re.sub(r'\[\[libre:ko:시리즈:(.*)]]', r'\1', str(doc))
        # print(title)
        txt = doc.text
        latest_rev = doc.latest_revision_id
        txt += f'\n{{{{퍼온문서|리브레 위키|시리즈:{title}|{latest_rev}}}}}'
        bf_page = pywikibot.Page(bigfo_site, f'{title}', 1714)
        bf_page.text = txt
        bf_page.save('리브레 위키에서 포크해서 가져옴')

여기서 중요하게 다루어야 할 Pywikibot 관련 클래스/함수에 대해 소개하겠습니다.

  • pywikibot.Site(언어명, 사이트 패밀리 이름) - 위키 사이트를 클래스를 불러올 때 사용합니다. 첫 번째 변수에는 언어, 두 번째 변수에는 families 폴더에 지정한 사이트 이름을 지정하셔야 합니다.
  • pywikibot.Page(사이트 클래스, 문서 제목, 이름공간 번호) - 특정 위키의 특정한 제목을 가진 문서 객체를 불러올 때 사용합니다. 첫 번째 변수에는 pywikibot.Site 클래스 생성자에 의해 지정된 사이트 클래스, 두 번째 변수에는 (이름공간 제외) 문서 제목, 마지막 변수에는 이름공간 번호를 지정하시면 됩니다. 참고로 이름공간 번호를 찾는 방법은 그 문서에 들어간 뒤 개발자 도구의 요소(Elements) 부분을 열어보면 body에 클래스 이름이 ns-(이름공간번호) 형식으로 되어있다는 것을 확인할 수 있습니다. 또한 이 클래스로 지정된 문서에서 다음과 같은 정보를 추출할 수 있습니다.
    • 문서 제목 추출 - 그냥 str 함수로 문서 변수를 감싸면 언어:위키명:(문서제목명) 형식의 문자열을 출력합니다. 순수한 문서명을 추출할 때에는 python의 replace 함수나 re 모듈을 이용해서 치환하시면 됩니다.
    • 문서 내용 추출 - 문서변수.text를 입력하면 이 문서에서 위키 문법으로 처리된 내용을 출력할 수 있습니다. 문자열을 출력합니다. 또한 문서변수.text = (입력) 구문을 이용해서 문서의 내용을 바꾸어줄 수도 있습니다. 문서 내용 전체가 바뀌니 주의해주시기 바랍니다.
    • 문서 최근 판본 추출 - 문서변수.latest_revision_id를 입력하면 이 문서의 최신판의 버전 숫자를 확인할 수 있습니다. 정수 형태로 출력합니다.
    • 문서 저장하기 - 문서변수.save('(편집 요약문)')을 입력하면 문서를 저장할 수 있습니다.