도움말:봇 만들기

로봇 또는 봇은 위키백과 및 기타 위키미디어 프로젝트와 상호작용하는 자동화된 프로세스입니다. 위키미디어 프로젝트에 사용할 봇 개발에 관해 설명합니다. 봇 운영에는 프로그래밍 경험이 요구될 수 있습니다.

**봇의 생성 이유**
봇은 작업을 자동화하고 인간보다 더 빨리 일을 수행할 수 있습니다. 여러 번 수행해야 하는 단순 작업이 있다면(예를 들어 특정 분류에 속하는 과하게 많은 문서에 틀을 추가해야 하는 경우) 이 작업은 인간보다 봇이 처리하는 것이 더 적합합니다.

**봇 생성 전 고려사항**
기존 봇에게 봇 작업을 요청하는 편이 훨씬 더 간단할 수 있습니다. 자신에게 주기적인 요청만 있고 프로그래밍에 익숙하지 않다면 이미 봇을 운영하고 있는 사용자에게 봇 작업을 요청하는 것이 좋습니다. 이 요청은 위키백과:봇 편집 요청에서 할 수 있습니다. 게다가 누구나 사용할 수 있는 수많은 도구들이 있습니다. 이들 중 대부분이 미디어위키에 특화된 기능을 갖춘 강화된 웹 브라우저 형태를 지닙니다. 그 가운데 가장 저명한 것이 오토위키브라우저(AWB)입니다. 이것은 위키백과와 다른 위키미디어 프로젝트의 편집을 지원하도록 설계된 브라우저입니다. 앞서 언급한 AWB와 같은 도구들은 대부분 프로그래밍을 이해하지 않고도 운영할 수 있습니다.
봇을 새로 작성하는 일에는 상당한 프로그래밍 능력이 요구됩니다. 성공적인 봇을 작성하려면 계획이 중요합니다. 다음을 고려해 주십시오:- 봇이 수동으로 동작하며 지원되는가, 아니면 완전 자동인가?- 봇을 혼자서 만들 것인가, 아니면 다른 프로그래머의 도움을 받을 것인가?- 봇의 요청, 편집, 기타 동작을 따로 기록해놓고 있는가? 그렇다면 그 기록은 로컬 미디어에 저장되는가, 아니면 위키 페이지에 저장되는가?- 봇이 웹 브라우저 안에서 동작하는가(예: 자바스크립트로 작성되어 있는지), 아니면 독립적인 프로그램으로 동작하는가?- 봇이 독립 프로그램이라면 자신의 로컬 컴퓨터에서 실행되는가, 아니면 Toolforge와 같은 원격 서버에서 실행되는가?- 봇이 원격 서버에서 실행된다면 다른 편집자들은 해당 봇을 운영하거나 기동 명령을 내릴 수 있는가?
한국어 위키백과에서는 봇 운영을 위해 봇 승인(봇 등록 신청)이 필수사항은 아닙니다. 단, 봇 승인을 받지 않은 상황에서는 표준 봇 편집 정책에 따라 1분 이상의 편집 간격을 두고 편집해야 합니다. 신뢰할 수 있는 봇은 위키백과:봇/등록 신청에서 봇 등록 신청을 할 수 있습니다. 그러나 완전히 새로운 봇은 봇 승인을 받기 전에 오작동이 없음을 증명하기 위해 충분한 테스트를 수행해 주십시오.

**위키백과 봇의 작동 원리**

**작동 개요**
180px
봇은 인간 편집자처럼 위키백과 문서를 읽고 변경이 필요한 곳에 변경을 합니다. 봇은 속도가 더 빠르고 인간보다 피로를 느끼는 경향이 덜하고 쉽게 정의되는 패턴이 있는 반복적인 작업의 일에 특화되어 있습니다.
대부분의 경우 봇은 브라우저가 하는 것처럼 자신의 계정에 로그인하고 위키백과로부터 페이지를 요청하지만 화면에 페이지를 표시하는 것은 아니고 메모리에서 동작합니다. 그 뒤 변경이 필요한 곳이 있는지 보기 위해 문서의 내용을 검사합니다. 그 다음에 브라우저가 하는 방식과 동일하게 설계된 방식대로 편집을 수행하고 제출합니다.
사람들이 하는 것과 동일한 방식으로 봇이 페이지에 접근하기 때문에 봇은 인간 사용자가 하는 동일한 어려운 일을 경험할 수 있습니다. 편집 충돌, 페이지 타임아웃, 페이지 요청이나 편집 수행 중에 예기치 않은 복잡성 등을 마주칠 수 있습니다. 봇이 수행하는 작업량이 인간이 수행하는 것보다 더 크기 때문에 봇은 이러한 문제를 마주칠 가능성이 더 높습니다. 그러므로 봇을 작성할 때에는 이러한 상황을 염두에 두는 것이 중요합니다.

**봇을 위한 API**
위키백과 문서의 내용을 변경하려면 봇은 위키백과의 문서의 내용을 가져와서 수정 후 편집을 반환해야 합니다. 이 목적을 위한 여러 API가 있습니다.- MediaWiki API (api.php): 이 라이브러리는 봇 등의 자동화된 프로세스들이 조회 및 변경사항 게시를 할 수 있도록 작성되었습니다. 데이터는 JSON 포맷으로 반환됩니다. (상세 내용은 출력 포맷을 참고하십시오).
*: api.php의 기능을 테스트하고 싶은 사용자를 위한 API 연습장도 마련되어 있습니다.- 특수:내보내기: 대량의 문서 내용을 XML 형태로 가져올 수 있습니다. (사용법)- 원본 (위키텍스트) 문서 처리: action=raw 또는 action=raw&templates=expand GET 요청을 index.php에 보내어 가공되지 않은 문서의 위키텍스트 소스 코드를 가져올 수 있습니다. prop=revisions&rvprop=content나 prop=revisions&rvprop=content&rvexpandtemplates=1 또한 매우 비슷하며 추가 정보를 가져오는데 도움이 됩니다.

**로그인**
승인된 봇은 편집을 위해 로그인해야 합니다. 봇이 로그인 없이 읽기 요청을 할 수는 있으나 모든 활동에서 완전한 테스트를 수행하기 위해서는 로그인하는 것이 좋습니다. 대부분의 봇 프레임워크는 로그인과 쿠키를 자동으로 관리하지만 이미 존재하는 프레임워크를 사용하고 있는 것이 아니라면 다음의 단계들을 준수하여야 합니다.
보안을 위해 로그인 데이터는 HTTP POST 메소드를 이용하여 전달하여야 합니다. HTTP GET 요청 변수들이 URL에 쉽게 보이기 때문에 GET을 통한 로그인은 비활성화되어 있습니다.
MediaWiki API를 사용하여 봇에 로그인하려면 두 가지 요청이 필요합니다:
 요청 1 – 로그인 토큰을 취득하기 위한 GET 요청- URL: https://en.wikipedia.org/w/api.php?action=query&meta=tokens&type=login&format=xml
 요청 2 – 로그인을 완료하기 위한 POST- URL: https://en.wikipedia.org/w/api.php?action=login&format=xml- POST 변수:
** lgname=BOTUSERNAME
** lgpassword=BOTPASSWORD
** lgtoken=TOKEN
여기서 TOKEN은 이전 결과에서 받은 토큰입니다. 이전 요청의 HTTP 쿠키 또한 두 번째 요청을 통해 전달되어야 합니다.
"action=login"을 통한 주 계정 로그인은 구식이며 경고 없이 작동이 중단될 수 있습니다. "action=login"으로 로그인을 계속하려면 특수:봇비밀번호를 참고하십시오.

**편집 - 편집 토큰**
위키백과는 위키백과 문서 편집, 그리고 되돌리기 등 기존 내용을 수정하는 기타 작업을 위해 편집 토큰 시스템을 사용합니다. 이 토큰은 예를 들어 다음과 같이 기나긴 16진수에 '+\'가 붙는 것으로 나타납니다:
d41d8cd98f00b204e9800998ecf8427e+\
편집 토큰의 역할은 사용자가 링크를 클릭하여 편집을 하는 것으로 속이는 편집 하이재킹을 방지하는 것입니다.
편집 과정에는 HTTP 요청이 수반됩니다. 먼저, 편집 토큰을 위한 요청이 수행되어야 합니다. 그 다음에 방금 취득한 편집 토큰과 함께 새 문서 내용을 보내는 두 번째 HTTP 요청이 필요합니다. 하나의 HTTP 요청만으로 편집을 하는 것은 불가능합니다. 편집 토큰은 로그인 세션 중에는 동일한 채로 유지되어야 하므로 편집 토큰은 한 번만 확인하면 되며 그 뒤에 잇따르는 모든 편집들에 그대로 사용할 수 있습니다.
편집 토큰을 취득하려면 다음과 같은 단계를 따릅니다:
MediaWiki API (api.php). 다음 변수와 함께 요청을 보냅니다 (mw:API:Edit - Create&Edit pages 참고).
action=query
prop=info
titles=PAGENAME
intoken=edit
토큰은 응답을 받을 때 edittoken 속성으로 반환됩니다.

**봇 운영을 위한 기술적 조언**
공식 봇 정책을 준수하는 것 외에 봇 개발 시 고려해야 할 제언이 있습니다.- 위키미디어 사용자 에이전트 정책에 따라 봇에 사용자 지정 User-Agent 헤더를 설정하십시오. 그렇게 하지 않으면 오류가 발생할 수 있으며 기술 직원에 의해 서버 단계에서 차단될 수 있습니다.- maxlag 변수를 사용하십시오. 최대 지정 가능한 초(秒)는 5초입니다. 이 변수는 서버 부하가 낮을 때 봇이 빠르게 수행될 수 있게 해주고 서버 부하가 높을 때 봇의 스로틀링 처리를 가능하게 해줍니다.
**maxlag를 지원하지 않는 프레임워크로 봇을 작성하는 경우 1분에 10회를 넘어서지 않도록 전체 요청량(읽기/쓰기 요청량 전반)에 제한을 두십시오.- 가능한 곳에 API를 사용하시고 서버가 허용하는 최대값으로 조회 제한값을 설정하십시오.- 편집(쓰기) 요청은 읽기 요청보다 서버 시간을 더 많이 소비합니다. 가벼운 편집을 하시고 최소한의 편집을 유지할 수 있도록 코드를 설계하십시오.
** 하나의 큰 편집이 10개의 작은 편집보다 낫습니다. 편집을 하나로 합치도록 시도해 주십시오.- 가능하면 HTTP 클라이언트 라이브러리에서 HTTP 지속적 연결과 압축을 활성화하십시오.- 멀티스레드 방식의 요청을 하지 마십시오. 순차적으로 서버 요청을 수행하십시오.- 서버로부터 오류를 수신하면 작업을 중단하십시오. 스퀴드 타임아웃과 같은 오류들은 상당한 서버 부하가 원인일 수 있습니다.- 많은 양의 자동화된 수행을 하기 앞서 코드를 전반적으로 테스트하십시오.

**프로그래밍 언어 및 라이브러리**

**파이썬**
 PyWikiBot - 파이썬으로 작성됨 ( SF Project Page)-  wikitools - 가벼운 봇 프레임워크-  mwclient - API 기반 프레임워크

**펄**
  MediaWiki::Bot - 펄로 작성된 상당히 완전한 미디어위키 봇 프레임워크

**자바**
라이브러리:-  Java Wiki Bot Framework - 자바 위키 봇 프레임워크-  wiki-java - 자바 위키 봇 프레임워크 (단일 파일)-  WPCleaner - WPCleaner 도구에 의해 사용되는 라이브러리-  jwiki - 단순하고 사용하기 쉬운 자바 위키 봇 프레임워크

**자바스크립트**
  미디어위키 모듈 (Node.js용)- link=hidden – 자바스크립트 프레임워크 (봇 빌드, node.js나 JScript에서의 실행을 위한 미디어위키 기능 포함) (위키백과 봇 예제를 참고.)

**루비**
  MediaWiki::Gateway – API용 루비 프레임워크.-  wikipedia-client - API를 이용한 루비 프레임워크.-  mediawiki/ruby/api - 루비 API 클라이언트 라이브러리.-  MediaWiki::Butt –API용 루비 프레임워크.

**커먼 리스프**
  CL-MediaWiki

**하스켈**
 http://hackage.haskell.org/package/mediawiki

**VBScript**
 :en:User:Smallman12q/Scripts/cleanuplistingtowiki - 로그인 후 편집 미리보기 제공- :en:User:Smallman12q/VBS/Savewatchlist - 로그인, 주시 목록 가져오기, 파일로 저장, 로그아웃, IE 닫기- :en:Commons:User:Smallbot#Sources - VBScript를 이용하여 일괄 업로드를 하는 스크립트 모음. (자바스크립트, XMLHTTP, MSHTML, XMLDOM, COM)

**마이크로소프트 닷넷**
  DotNetWikiBot Framework (닷넷 프레임워크 2.0 기반에 C# 언어로 작성됨)