Pywikibot/사용법

위키 자동편집도구 Pywikibot 사용법에 관한 문서이다.

1 주요 스크립트[편집]

리브레 위키에서도 사용하는데 유용한 스크립트와 각 스크립트의 기능에 대해 소개하겠다. 일부 스크립트들은 영어 위키백과의 편집에 맞추어져 있어 리브레 위키에서 사용하기 불편한 면이 있다는 것도 주의하자. 또한 category.py나 replace.py 같이 단독작업으로도 상당히 많은 일처리를 할 수 있는 일부 스크립트를 제외하면 상당수의 스크립트들이 단순한 일을 하는데 그치기에 cmd창에서 일일히 실행시키기보다는 직접 CMD 스크립트나 파이썬으로 프로그래밍을 해서 반복적으로 실행하는 방법을 사용할 것을 권장한다.

스크립트 사용방법은 cd 명령어를 이용해 CMD창에 Pywikibot이 설치된 경로로 이동한 뒤

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

이런 식으로 입력해서 사용할 수 있다.

스크립트명 설명
login.py Pywikibot에 로그인할 때 필요하다. user-config.py에 lang, family, usernames를 지정한 뒤에 로그인할 것을 권장한다.
listpages.py Pywikibot이 user-config.py에 설정된 위키의 페이지를 검색하거나 검색한 문서들을 내려받을 때 사용하는 스크립트이다. 편집 스크립트가 아니기에 login.py를 실행시키지 않아도 사용 가능하다.
add_texts.py 지정한 문서 목록의 맨 앞부분, 혹은 맨 뒷부분에 사용자가 입력하고 싶은 문구를 추가할 수 있다.
category.py 지정된 문서의 분류를 바꾸고 싶을 때 사용할 수 있다.
movepages.py 위키에서 여러 파일을 한번에 옮길 수 있다.
pagefromfile.py 위키 내부에 위키텍스트를 포함하는 파일을 컴퓨터에 저장한 파일에서 위키로 가져올 수 있다.
redirect.py 이중 넘겨주기나 깨진 넘겨주기 등 부적절한 형태의 넘겨주기를 정리할 때 사용한다.
replace.py 위키 내부의 특정한 문구를 다른 문구로 바꿔준다. 가장 많이 사용하며, 그 자체로도 상당히 설명할 것이 많다. 아래 찾아바꾸기 사용방법도 참조.
revertbots.py 봇 편집이 잘못됐을 때 자신의 봇 계정의 편집을 되돌리거나 문서 훼손을 자행하는 이용자의 마지막 편집을 되돌릴 때 사용할 수 있다.
table2wiki.py HTML 표 문법을 미디어위키에 걸맞는 문법 형태로 바꿔준다.
upload.py 파일을 위키에 업로드할 때 사용한다.
weblinkchecker.py 깨진 URL을 검사할 때 사용한다.

2 찾아바꾸기 전략[편집]

2.1 기본[편집]

기본적으로 redirect.py를 사용한다. 간단한 사용법은 다음과 같다.

> python pwb.py replace (파일 검색 옵션) "(바꾸기전1)" "(바꾼후1)" "(바꾸기전2)" "(바꾼후2)" ... 

참고로 파일 검색 옵션은 다음과 같은데, 아래에 있는 문구 중 반드시 하나는 명시해야 한다.

  • cat:(분류명) - 특정 분류 안에 있는 문서들을 대상으로 한다.
  • file:(파일명) - 특정 파일명의 텍스트 문서 안에 적힌 문서들을 대상으로 한다.
  • links:(문서명) - 지정한 문서 내부에서 링크로 연결된 문서들을 대상으로 한다.
  • page:(문서명) - 특정 문서를 대상으로 한다.
  • ref:(파일명) - 지정한 문서를 연결하는 링크를 포함하는 문서들들 대상으로 한다.
  • start:(문서명) - 위키 내에서 특정 문서명을 시작으로 모든 문서들을 대상으로 한다. "-start:!"라고 표시하면 모든 문서에 대해 찾아 바꾸기를 수행할 수 있다.
  • search:(키워드명) - 위키 내에서 특정 키워드명을 포함하는 모든 문서를 대상으로 한다. 한 개의 단어만 찾아 바꾸기할 때는 가장 효율적이다.
  • xml:(xml파일명) - 특수:내보내기를 통해 작성된 xml 파일 안에 있는 문서들을 대상으로 수행한다.

여기서 중요한 것은 스크립트 문구에 바꿀 내용은 큰따옴표를 반드시 포함한 형식이어야 한다. 특히 큰따옴표가 반드시 예약어로 사용하지 않는 명령 프롬프트(CMD) 환경에서는 큰 문제가 안 되지만 Powershell에서는 반드시 작은따옴표로 감싼 형태인 '"(내용)"'으로 표현해야 제대로 작동하는 것을 알 수 있다. 큰따옴표 내부에서 큰따욤표를 쓰고 싶다면 큰따옴표 두 번 입력해서 사용해야 한다.

바꾸기 전 문구와 바꾼 후 문구는 반드시 짝으로 나온다. 따라서 따옴표로 둘러싸인 부분은 반드시 짝수 개 입력해야 제대로 작동한다.

2.2 정규표현식 사용[편집]

정규표현식 사용할 때에는 -regex 문구를 앞에 집어넣는다.

> python pwb.py replace (파일 검색 옵션) -regex "(바꾸기전1)" "(바꾼후1)" "(바꾸기전2)" "(바꾼후2)" ... 

역시 Powershell 환경에서는 큰따옴표 안에 큰따옴표를 집어넣고 싶으면 따옴표를 두 개 붙인 형태 ""로 사용하면 된다.

2.3 fix 패턴 사용[편집]

특정한 fix 패턴을 사용할 때에는 -fix:(패턴명) 형태의 문구를 다음과 같이 집어넣는다. 기본적으로 다음과 같은 패턴이 예약되어 있으며, pywikibot 모듈 안의 fixes.py의 패턴을 불러오거나 없으면 메인 디렉토리의 user-fixes.py에 있는 변경패턴을 불러올 수 있다. 사용할 때는 아래처럼 -fix:(조건명) 형태로 붙여주면 된다.

> python pwb.py replace (파일 검색 옵션) -fix:(패턴명) "(바꾸기전1)" "(바꾼후1)" "(바꾸기전2)" "(바꾼후2)" ... 

fixes.py에는 기본적으로 다음과 같은 패턴이 저장되어 있다. 다른 패턴은 독일어 관련이기에 생략.

  • HTML - HTML로 파싱된 문서를 위키 문법으로 변경해준다.
  • isbn - 오류가 있는 isbn 링크를 정정한다.
  • syntax-safe - 오류가 있는 위키 마크업을 교정할 때 사용한다.

2.3.1 fix 패턴 사용하는 방법[편집]

fixes라는 이름의 딕셔너리[1]는 키값이 패턴명, 키값에 대응하는 값(value)은 다른 형태의 딕셔너리로 되어 있다. 즉, fixes = {'패턴명' : ({변환 패턴 딕셔너리}), ...}

다시 변환 패턴도 fixes의 하위 딕셔너리인데, 이것도 다음과 같이 구성되어 있음을 알 수 있다.

(변환 패턴) = {'regex' : False,  # 정규표현식 사용 여부
               'recursive' : False, #패턴이 없어질 때까지 반복실행할지 여부. 보통 사용하지 않는다.
               'nocase' : False, #로마자/키릴 문자 사용할 때만 유효. 한국어에는 영향이 없다.

               'msg' : '(편집 요약)', # 편집요약을 자동으로 입력 가능하다.
               'replacements' : [ ('(변환 전1)', '(변환 후1)'), #replacement 자체는 리스트,
                                  ('(변환 전2)', '(변환 후2)'), ... # 각 요소는 (변경 전, 변경 후) 형태로 입력
                                 ],
               'exceptions':{'inside-tags' : ['(변환 예외 태그명)', ... #태그 내부에서는 변환이 이루어지지 않음.
                                               ],
                            'text-contains' : ['(변환 예외 패턴)', ... #변환 패턴이 특정 텍스트 패턴을 포함하면 변환 없음
                                               ],
                            'inside' : ['(변환 예외 패턴)', ... #특정한 패턴 내부에 있으면 변환되지 않음.
                                       ],
                             'title' : ['(변환 예외 문서명)', ... #변환하지 않을 문서명
                                       ], #title 대신 required-title이라고 지정하면 리스트 안의 문서면 변환 가능하다.
                             'include' : (변환 예외 패턴 딕셔너리명)  #문서 내부 혹은 외부에 지정된 딕셔너리 패턴을 고스란히 포함한다.
                                          #각 패턴도 키값이 inside-tags, text-contains, inside, title 등을 포함해야 한다.
                             },
              }

여기서 변환 후 패턴은 일반 문자열 패턴/정규표현식 포함 문자열 패턴을 나열하거나 아니면 함수를 사용할 수도 있다. 함수를 사용할 때에는 일단 'regex':True를 지정해서 정규표현식을 사용하는 방식을 사용하고, 입력 변수명을 반드시 변수명을 match라는 이름으로 사용해야 하며, 반드시 string을 리턴하는 함수여야 한다.

def methodname(match):
    (함수 정의)
    return res #반드시 스트링을 반환.

여기서 match 클래스에서 사용할 수 있는 인스턴스/메소드 몇 개만 소개한다.

  • match.string - 해당 패턴이 있는 문서 전체의 위키 텍스트를 반환한다.
  • match.group(num) - 해당 정규식 패턴의 괄호 안의 패턴명. num에 아무 것도 없으면 바꾸고자 하는 정규식 패턴 전체 스트링을 반환한다.
  • match.start() - 해당 정규식 패턴의 시작 문자에 대해 위키텍스트 내부의 위치하는 값을 반환한다. 일례로 match.string[:match.start()]는 해당 패턴이 발견된 텍스트를 빼고 앞부분을 의미하며, match.string[match.start():]는 발견 패턴을 맨 앞에 두는 텍스트 뒷부분을 의미한다.
  • match.end() - 해당 정규식 패턴의 끝 문자에 대해 위키텍스트 내부의 위치하는 값을 반환한다.

참조 : 헝가리 위키백과 Bináris 사용자의 Fixes_and_functions_HOWTO 문서

3 커스텀 스크립트 짜는 방법[편집]

때로는 기존에 있는 Pywikibot 스크립트 대신에 (Pywikibot이 설치된 디렉토리)/scripts/userscripts에 자신이 저장한 스크립트를 실행시킬 수 있다. 간단한 스크립트 파일 예시로 pywikibot을 통해 로그인한 후에 텍스트를 바꾸는 예시이다. 다음과 같이 스크립트를 준비한 뒤, text_change.py로 지정한다.

#파일 이름은 text_change.py
import pywikbot #Pywikibot의 내부 모듈을 사용할 때 사용한다.

from scripts import login #pywikibot 하위 스크립트 사용가능.
# 로그인할 때는 다음과 같이 이용
login.main()
# Pywikibot에서 문서 편집 시에는 pywikibot.Site('언여명', '패밀리명')로 사이트 지정.
# pywikibot.Site()이면 login.py로 지정된 사이트만 확인
site = pywikibot.Site('ko', 'libre')
#페이지 조회할 때는 pywikibot.Page() 함수사용
page= pywikibot.Page(site, 'Pywikibot')
# 페이지 텍스트 추출할 때는 page.text 명령어 사용
txt = page.text 
# 페이지를 변경하고 싶으면 page.text를 변경한 후 page.save('편집 요약문') 사용
page.text = txt.replace('pywikibot', '파이위키봇')
page.save('한글로 바꾸기')
# 로그아웃할 때는 다음과 같이 이용해보자.
login.main('-logout')

그 다음에 다음과 같은 명령어를 이용하면 텍스트 변환이 가능하다.

> python pwb.py text_change

4 각주

  1. 참고로 파이썬에서 딕셔너리는 각 키의 명칭이 별도로 지정된 리스트를 의미한다. 예를 들면 {"a":['apple', 'ant'], "b":['bread']}처럼 단순히 숫자로 위치값만 있는 리스트가 아닌 a, b처럼 각 요소들의 위치 이름(키값)이 별도로 지정된 것이다.