Special:Communication & Concept/Ubuntu 16.0.4 데스크탑에 미디어위키 파이위키봇(Pywikibot) 설치 및 사용 방법.

Jump to: navigation, search
#167 [ Ssam ] hit: 247(#08ff08) 24

Template:인용

들어가기

  1. 미디어위키를 사용하는 장점 중에 하나가 봇(Bot)을 돌릴 수 있다.
  2. 대량의 문서를 수정 할 때 유용하게 사용 할 수 있다.
  3. 서버나 데스크탑에 설치하여 사용 할 수 있다,
  4. 여기서는 Ubuntu 16.0.4 데스크탑를 사용하는데 참고사항으로 남김.
  5. 위키백과 봇 참고.
  6. 참 다양한 언어로 작성되어 사용자를 기다리고 있습니다. (php, java, python(파이썬), 펄,....)
  7. 여기서는 파이썬 언어로 작성된 PyWikiBot에 관련된 것을 참고 사항으로 남김.

Ubuntu 16.04 LTS 서버 업그레이드

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get autoremove

파이썬 설치

  • python 이 설치되어 있지 않다면 먼저 설치한다.
sudo apt-get install python


의존성관련 파일들 설치

~$ sudo apt install python-pip


PyWikiBot 설치

  1. 사용자 메뉴얼
  2. 개인 미디어위키 사용자 메뉴얼
  3. 다운로드, 현재 버전은 core.tar.gz( Release 3.0.20170521 (21 Mai 2017) ) 입니다.


  • Ubuntu 16.0.4 데스크탑에 사용자 계정에서 압축을 풀어준다.(루트로 작업하면, 그룹 변경: 소유자:소유자 그룹 변경해야 된다.)
~$ cd /home/ssam
~$ tar xvzf core.tar.gz
or
~$ tar xvzf core_stable.tar.gz
  • core_stable 에 압축이 풀린다, 디렉토리를 core로 변경
~$ mv core_stable core
~$ cd core
~/core$ 
 
  • 그룹 변경: 소유자:소유자 그룹(루트로 작업 했다면)
~# chown -R ssam:ssam /home/ssam/core
  • 퍼미션 조정
~# chmod -R 755 /home/ssam/core
 

PyWikiBot 환경 설정

~core$ cp user-config.py.sample user-config.py
  • ~core$ vi user-config.py 만들어진 파일을 열어서 수정 한다.
이렇게된 내용을
# -*- coding: utf-8  -*-

# This is a sample file. You should use generate_user_files.py
# to create your user-config.py file.

mylang = 'en'
family = 'wikipedia'
usernames['wikipedia']['en'] = 'Test'
이렇게 수정 한다.
# -*- coding: utf-8  -*-

# This is a sample file. You should use generate_user_files.py
# to create your user-config.py file.

mylang = 'ko'
family = 'mysam'
usernames['mysam']['ko'] = 'ssamBot'
참고로 mysam은 사이트 이름, ssamBot은 봇 사용자 이름이다, ssamBot은 사이트에 가입되어있어야 된다.
  • 이 파일 core/pywikibot/families/wikitech_family.py 을 샘플 파일로하여 core/pywikibot/families/mysam_family.py을 만들어 준다.
~core$ cp pywikibot/families/wikitech_family.py pywikibot/families/mysam_family.py
  • ~core$ vi pywikibot/families/mysam_family.py 파일을 열어 수정해 준다.
이렇게된 내용을
# -*- coding: utf-8 -*-
"""Family module for Wikitech."""
#
# (C) Pywikibot team, 2005-2015
#
# Distributed under the terms of the MIT license.
#
from __future__ import absolute_import, unicode_literals

__version__ = '$Id: 73cdb8bccbb87ac57e0932a1120c1d7e747c13fa $'

from pywikibot import family


# The Wikitech family
class Family(family.WikimediaOrgFamily):

    """Family class for Wikitech."""

    name = 'wikitech'
    code = 'en'

    def protocol(self, code):
        """Return the protocol for this family."""
        return 'https'
이렇게 수정한다.
# -*- coding: utf-8 -*-
"""Family module for Mysam."""
#
# (C) Pywikibot team, 2005-2015
#
# Distributed under the terms of the MIT license.
#
from __future__ import absolute_import, unicode_literals

__version__ = '$Id: 73cdb8bccbb87ac57e0932a1120c1d7e747c13fa $'

from pywikibot import family


# The Mysam family
class Family(family.Family):

    """Family class for Mysam."""

    name = 'mysam'
    langs = {'ko':'mysam.net'}

    def protocol(self, code):
        """Return the protocol for this family."""
        return 'https'

    def scriptpath(self, code):
        return '/wiki' #The path of index.php, look at your wiki address.
  • 위 수정된 파일에 대한 주의사항.
  1. 사이트 네임 설정시 대문자, 소문자 잘 구별해서 입력해야 에러 없음.
  2. 인증서를 사용하지 않으므로 프로토콜은 http 이다.
  3. 내 개인 위키의 메인 경로가 /wiki 이므로 설정해 준다.
  4. langs = {'ko': 'mysam.net'}항목에 봇을 돌릴 주소를 적어주면 된다.


의존성 관련 파일들 설치

  • 위에서 설치하지 않았다면 먼저 설치하고, ~$ sudo apt install python-pip
~$ sudo apt-get install python-pip


로그인 하기전에 확인

  • 메뉴얼에 Python 2.7.2 이상 설치
$python -V
Python 2.7.12


우분투(Ubuntu 16.0.4) 데스크탑에서 로그인 하기

~$ cd core
~core$ python pwb.py login
WARNING: No user is logged in on site mysam:ko
Password for user SsamBot on mysam:ko (no characters will be shown):  <---- 회원 가입된 비번 입력
; 로그인되면 메세지 출력은 이렇게 뜬다.
Logging in to mysam:ko as SsamBot
Logged in on mysam:ko as SsamBot.
core 디렉토리에 pywikibot.lwp 쿠키파일이 생긴다.


PyWikiBot replace.py 스크립트로 본문의 수정할 텍스트을 원하는 텍스트로 바꾸어 보기

~core$ python pwb.py replace.py "텍스트A" "텍스트B" -start:!
  • 옵션 사용 (옵션 -always 은 프롬프트 출력하지 않는다, 서버에 설치하였다면 크론탭에 등록하여 매 시간 마다 자동 실행시켜 줄 수 있다.)
 ~core$ python pwb.py replace.py "텍스트A" "텍스트B" -cat:"분류" -always
  • 사용자 계정이므로 보호된 문서는 변환되지 않는다.
  • 참고 봇 스크립트(Global bot scripts)는 미디어 위키 사이트를 참고하면 된다.
  • 본문에 문자 치환은 미디어위키 확장 Replace_Text를 사용해도 된다..


PyWikiBot replace.py 스크립트 정규표현 옵션을 이용하여 본문의 특정 텍스트을 지워 보기

  • 특정태그를 이용하여 카테고리를 만들어 주는 확장프로그램인데 가끔 오류가 떠서 모든 문서에서 지우려고 함.
  • 지워진 라인도 제거는 \n 을 추가해 준다.
~core$ python pwb.py replace.py -regex '\<categorytree+(.*?)+categorytree\>\n' "" -start:!
  • 프롬프트에서 a 를 선택하면 모든 문서들을 변환 시킨다.


PyWikiBot replace.py 의 응용, 템플릿 변경 해 보기

  • 게시판의 태그확장(Tag extensions)형태에서 파서함수(Parser functions)형태로 변경.
  ~core$ python pwb.py replace.py -cat:'게시판' -regex '<funboard>(.*?)</funboard>' '{{#tag:funboard | \1}}' 
  • 게시판의 파서함수(Parser functions)형태에서 태그확장(Tag extensions)형태로 변경.
 ~core$ python pwb.py replace.py -cat:'게시판' -regex '{{#tag:funboard \| (.*?)}}' '<funboard>\1</funboard>' 


PyWikiBot add_text.py 스크립트로 문서에 특정 글을 추가시켜 보기

  • 미디어위키 글 추가 봇 참고.
  • 문서의 제일 위 또는 끝에 특정 Pywikibot/add text.py 스크립트 봇으로 문장을 넣어 줄 수 있다.
게시판 문서의 윗쪽에 "안녕하세요?" 라는 인사말을 넣는 예, -up 옵션은 윗쪽에 없으면 아래쪽에 자동 추가되는 것.
~core$ python pwb.py add_text.py -cat:게시판 -text:"안녕하세요?" -up
  • 옵션
 
 -cat 특정 범주 내의 항목을 대상으로 합니다. 
 -page 페이지를 generator로 사용합니다. 
 -file 명명된 텍스트 파일에서 처리 할 페이지 목록을 읽습니다. 파일의 페이지 제목은 [[블라켓기호]]로 묶거나 줄 바꿈으로 구분 해야 합니다 . 인수는 "-file : filename"으로 주어질 수도 있습니다. 
 -text 추가 할 텍스트를 정의합니다. 
 -summary 사용할 요약을 정의합니다. 
 -except 텍스트가 이미 페이지에 있는지 확인하기 위해 정규 표현식을 사용합니다. 
 -newimages 새 이미지에 텍스트를 추가합니다. 
 -untagged 라이센스 템플릿이없는 이미지에 텍스트를 추가합니다. 
 -always 사용하면 봇은 지정된 텍스트를 추가해야하는지 묻지 않습니다. 
 -up 텍스트를 페이지 맨 위에 위치 시킨다. 


사용 예
~core$ python pwb.py add_text.py -cat:카테고리 이름 -summary:"봇이 수행한 편집" -text:"안녕하세요?" -up
~core$ python pwb.py add_text.py -start:! -text:"안녕하 세요?" -up
  • 문서전체를 수정하려면 프롬프트에 a를 입력 하시면 모든 문서에 자동으로 삽입된다.
  • 중단하려면 프롬프트에서 q 또는 ctrl + c 키를 누르면 중단 한다.
  • 특정문서 부분만 처리를 한다거나, 서버에 설치되어 있다면 크론탭에 등록하거나, 옵션으로 처리가 가능 하다.


PyWikiBot add_text.py 와 replace.py 를 이용해서 특정 카테고리 문서에 문자를 추가, 제거해 보기

  • 게시판으로 분류되어있는 페이지 위에 환영합니다 문자 추가.
~core$ python pwb.py add_text.py -cat:'게시판' -text:"환영합니다." -up
  • 게시판으로 분류되어있는 페이지 위에 환영합니다 문자 제거.
~core$ python pwb.py replace.py -cat:'게시판' -regex '환영합니다.\n' ""
  • 보안뉴스 분류 문서에 httphttps로 바꾸어 준다.
~core$ python pwb.py replace.py -cat:'보안뉴스' -regex 'http:' "https:" -always


PyWikiBot category.py 스크립트로 카테고리 변경하여 넘겨주기

  • 스크립트는 미디어위키 category.py 참조.
  • 이 명령은 카테고리를 변경하고 싶을 때 사용한다. 예) BBC로 분류된 문서들을 BBC News로 분류하여 넘겨준다.
~core$ python pwb.py category move -from:BBC -to:"BBC News"


PyWikiBot protect.py 스크립트로 문서를 보호 또는 보호해제 하기

  • 참고 스크립트 미디어위키 protect.py 참조.
  • 사용자 권한으로는 안된다.
  • ~$ vi core/user-config.py 파일을 열어 사용자를 sysop으로 만들어야 된다.
  • usernames['mysam']['ko'] = 'ssamBot' 이렇게 되어 있는 것을 sysopnames['mysam']['ko'] = 'ssamBot' 으로 수정하고 사이트에서 ssamBot의 권한을 sysop으로 바꾸어 주어야된다.
[..................]
mylang = 'ko'
family = 'mysam'
sysopnames['mysam']['ko'] = 'ssamBot'
[..................]
  • 특정 카테고리에 있는 문서들을 보호하기위한 예) 게시판으로 분류된 문서는 모두 보호된다.
~core$ python pwb.py protect.py -cat:"게시판"
  • 특정 카테고리에 있는 문서들을 보호해제하기 위한 예) 게시판으로 분류된 문서는 모두 보호해제된다.
~core$ python pwb.py protect.py -cat:"게시판" -unprotect
  • 특정 분류:문서에 분류만 보호한다.
  • 옵션: -subcats, 특정 범주의 모든 하위 범주에 대한 옵션이다.
~core$ python pwb.py protect.py -subcats:뉴스분류


PyWikiBot delete.py 스크립트로 문서 대량 삭제

  • 미디어위키 delete.py 참조.
  • ~$vi core/user-config.py 파일을 열어 사용자를 sysop으로 만들어야 된다.(위에 참조)
  • sysopnames['mysam']['ko'] = 'ssamBot' 와 usernames['mysam']['ko'] = 'ssamBot' 를 다 설정해 놓고 사용해도 된다.
  • 테스트 카테고리 문서들을 모두 삭제한다. (모두 삭제 할것인가 물어본다, a 선택)
~core$ python pwb.py delete.py -cat:"테스트"
사용자 계정으로 삭제시는 삭제되지 않고, 문서에 삭제 틀을 만들 것인지 물어본다. (삭제 틀을 만들려면 y, N 선택)
메세지는 이렇게 표시된다.
>>> 도훈이집:연습장 <<<
Can't delete ko:도훈이집:연습장; do you want to mark it for deletion instead? ([y]es, [N]o, [a]ll): y
Page 도훈이집:연습장 saved


  • 자동 옵션
  1. -page: 특별한 페이지만 삭제
  2. -cat: 주어진 카테고리만 삭제
  3. -links: 주어진 페이지로부터 링크된 모든 페이지를 삭제
  4. -file: Delete all pages listed in a text file.
  5. -ref: Delete all pages referring from a given page.
  6. -images: 주어진 페이지에 사용된 모든 이미지들을 삭제 (Delete all images used on a given page.)
  7. -always: 프롬프트를 출력하지 않는다.(무조건 지우려면 이 옵션 주세요.)
  8. -summary: Supply a custom edit summary.
  9. -undelete: Actually undelete pages instead of deleting.


PyWikiBot touch.py 스크립트로 문서를 카테고리 및 기타 관계와의 관계를 새로 고침 하기

  • 미디어위키 touch.py 참고.
  • 캐쉬되어 있다면 리프레시되고, 변경된것을 저장,... 기타, 변경을 했다면 한번 실행해 주면 된다.
  • 최근 변경에 항목을 작성하지 않습니다.
  • 500개 이하로 됩니다.
~core$ python pwb.py touch.py -start:!
  • 옵션적용 게시판 카테고리만
~core$ python pwb.py touch.py -cat:'게시판'


PyWikiBot image.py 스크립트로 페이지에 이미지 삭제 또는 변경

  • 이 스크립트는 이미지 한개를 제거 또는 변경하기위해 사용할수 있다. (This script can be used to change one image to another or remove an image.)
  • 미디어위키 image.py 참고
  • 형식
python pwb.py image 이미지 이름 [새로운 이미지 이름]
~core$ python pwb.py image VMware ESXi.jpg
삭제되지 않는다?


PyWikiBot weblinkchecker.py 스크립트로 문서 페이지에 죽은 외부 웹링크 찾기

  • 위키의 모든 페이지, 카테고리, 네임스페이스, 기타에 죽은 외부 웹링크를 확인하기위해 사용한다.
  • 전제 조건은 봇은 로컬 장애 와 서버 장애를 구분할 수 없으므로 안정적인 인터넷 연결을 유지해야합니다.
  • wiki 페이지에서 깨진 외부 웹링크를 수정하거나 제거하는 데 도움을 줄 수 있습니다.
  • 미디어위키 weblinkchecker.py 참조


모든 페이지에 처음으로 죽은 외부 웹링크를 확인하기위해 아래 명령 수행.
~/core$ python pwb.py weblinkchecker.py -start:!
재검사 명령어
~/core$ python pwb.py weblinkchecker.py -repeat
죽은 외부 웹링크를 찿아 이곳에 ~core/deadlinks/deadlinks-mysam-ko.dat로 저장해 준다.
  • 특정 외부 링크에 대해 모든 페이지를 검사
  • mysam.net에 링크된 모든 wiki 페이지를 로드 하는 예.
~/core$ python pwb.py weblinkchecker.py -weblink:mysam.net
mysam.net ko 페이지에서 검색중 1개의 페이지를 찾아 로드 시켜주었다는 메세지
Retrieving 1 pages from mysam:ko.
>>> 정규 표현식 <<<
1 pages read
0 pages written
Execution time: 0 seconds
Read operation time: 0 seconds
Script terminated successfully.
Saving history...
  • 참고: 링크를 내부로 안걸고 외부로 걸어 페이지에 나타났다.


PyWikiBot 활용, 위키에 페이지 목록 검색

  • 개인 위키 사이트의 목록 검색, 게시판 검색.
~core$ python pwb.py listpages.py -cat:Category:'게시판'
또는
~core$ python pwb.py listpages -cat:Category:'게시판'
  • 위키백과에서도 검색
~core$ python pwb.py listpages -lang:ko -family:wikipedia -cat:Category:'물'
또는
~core$ python pwb.py listpages -lang:ko -family:wikipedia -cat:'물'
  1. 가상수
  2. [.....]
  3. 화학적 산소 요구량
  4. 41 page(s) found


기타

  • API 비활성 시키기(Disabling the entire API).
  • LocalSettings.php 파일에 추가해주면 위에 모든 명령들은 무용지물이 된다.
$wgEnableAPI = false; 
  • 참고사항으로 정리하여 둔다.


Logo