편집 필터 기록

편집 필터 둘러보기 (처음 | 최근 필터의 바뀜 | 과거의 편집 검토하기 | 편집 필터 기록)
기록 49,295에 대한 자세한 정보

2022년 9월 28일 (수) 21:53: 하늘 (토론 | 기여)님이 사용자:하늘/소스/한자 획순에서 "edit" 동작을 수행하여 필터 0이(가) 작동했습니다. 조치: 태그; 필터 설명: (검사)

편집에서 바뀐 내용

<syntaxhighlight lang="python">
{{삭제|}}
import requests
import datetime
import os
import sys
import re
import time
 
S = requests.Session()
URL = "https://librewiki.net/api.php"
 
 
class csrftoken:
def get():
PARAMS = {
"action": "query",
"meta": "tokens",
"format": "json"
}
DATA = S.get(url=URL, params=PARAMS).json()
return DATA['query']['tokens']['csrftoken']
 
 
def download(url, file_name):
print(url, file_name)
os.system("wget "+url+" --directory-prefix='" + file_name + "' -nc -q")
#os.system('clear')
 
#OS = platform.system()
 
 
def api_download(prefix, hanja, var):
time.sleep(1)
PARAMS = {
"action": "query",
"format": "json",
"prop": "imageinfo",
"titles": 'file:'+hanja+'-'+var,
"utf8": 1,
"formatversion": "latest",
"iiprop": "url"
}
 
DATA = S.get(url="https://commons.wikimedia.org/w/api.php",
params=PARAMS).json()
if 'missing' in DATA['query']['pages'][0]:
print(hanja+'-'+var+' missing')
else:
download(DATA['query']['pages'][0]['imageinfo']
[0]['url'], prefix + '/')
print('downloaded '+hanja+'-'+var)
 
 
def api_upload(prefix, hanja, var):
#os.system('clear')
if os.path.isfile(prefix + '/' + hanja+'-'+var) == True:
uploadPARAMS = {
"action": "upload",
"filename": hanja+'-'+var,
"format": "json",
"text": "== 파일의 설명 ==\n{{파일 정보\n|설명 = \n|출처 = Wikimedia commons\n|날짜 = \n|만든이 = \n|기타 = \n}}\n== 라이선스 ==\n{{CC-BY-SA-3.0}}\n[[분류:한자/문자/획순/"+var+"]]",
"async": 1,
"token": CSRF_TOKEN,
"ignorewarnings": 1
}
FILE = {'file': (hanja+'-'+var, open(prefix + '/' + hanja+'-'+var,
'rb'), 'multipart/form-data')}
DATA = S.post(URL, files=FILE, data=uploadPARAMS).json()
print(DATA)
else:
print("파일 없음")
return
 
 
def login(name, password):
# Step 1: Retrieve login token first
PARAMS = {
'action': "query",
'meta': "tokens",
'type': "login",
'format': "json"
}
R = S.get(url=URL, params=PARAMS)
DATA = R.json()
LOGIN_TOKEN = DATA['query']['tokens']['logintoken']
 
# Step 2: Send a POST request to login. Using the main account for login is not
# supported. Obtain credentials via Special:BotPasswords
# 봇 비밀번호 설정 권장, 형식 : Caeruleum@asdfqwerzxcvpoiulkjhmnbv
PARAMS = {
"action": "login",
"format": "json",
"lgname": name,
"lgpassword": password,
"lgtoken": LOGIN_TOKEN,
"utf8": 1
}
DATA = S.post(URL, data=PARAMS).json()
if DATA["login"]["result"] == "Success":
print("로그인 성공")
else:
print("로그인 실패")
exit()
 
 
def logout(CSRF_TOKEN):
DATA = S.post(URL, data={"action": "logout",
"token": CSRF_TOKEN, "format": "json"}).json()
print("로그아웃")
print(DATA)
 
 
login("Caeruleum", "Caeruleum@*********************************")
 
fontType = '명조'
 
currentDate = str(datetime.datetime.now())
currentDate = currentDate.split('.')[0]
 
temp = open('date.txt', 'r')
preDate = temp.readline().replace('-', ':')
temp.close()
print(preDate)
date_file = open('date.txt', 'w')
date_file.write(currentDate)
date_file.close()
 
if not(os.path.isdir(currentDate)):
os.makedirs(os.path.join(currentDate))
 
PARAMS = {
"action": "query",
"format": "json",
"list": "categorymembers",
"utf8": 1,
"cmnamespace": "1600",
"cmtitle": "분류:한자/문자",
"cmprop": "title|timestamp",
"cmtype": "page",
"cmlimit": "max",
"cmsort": "timestamp",
"cmstart": preDate
}
DATA = S.get(url=URL, params=PARAMS).json()
PAGES = DATA['query']['categorymembers']
 
hanjaList = open(currentDate + '/list.csv', 'a')
for page in PAGES:
hanja = page['title'].split('/')[1] + '\n'
hanjaList.write(hanja)
hanjaList.close()
hanjaList = open(currentDate + '/list.csv', 'r')
 
CSRF_TOKEN = csrftoken.get()
 
while True:
hanja = hanjaList.readline().replace('\n', '')
if not hanja:
break
 
PARAMS = {
"action": "query",
"format": "json",
"prop": "revisions",
"formatversion": "2",
"rvprop": "content",
"rvslots": "*"
}
PARAMS["titles"] = '시리즈:리브레 한자사전/' + hanja
DATA = S.get(url=URL, params=PARAMS).json()
PAGE = DATA['query']['pages'][0]['revisions'][0]['slots']['main']['content']
hanja = re.search('한자 =(.+?)\n', PAGE).group(1).strip()
print('------------------')
print(hanja)
japanHanja = re.search('신자체 =(.+?)\n', PAGE)
chineseHanja = re.search('간체자 =(.+?)\n', PAGE)
if japanHanja == None:
japanHanja = hanja
else:
japanHanja = japanHanja.group(1).strip()
if japanHanja == "":
japanHanja = hanja
 
api_download(currentDate, hanja, 'bw.png')
api_download(currentDate, hanja, 'order.gif')
api_download(currentDate, japanHanja, 'jorder.gif')
api_download(currentDate, japanHanja, 'jbw.png')
 
if chineseHanja != None:
chineseHanja = chineseHanja.group(1).strip()
if chineseHanja != "":
api_download(currentDate, chineseHanja, 'order.gif')
api_download(currentDate, chineseHanja, 'bw.png')
api_upload(currentDate, chineseHanja, 'order.gif')
api_upload(currentDate, chineseHanja, 'bw.png')
api_upload(currentDate, hanja, 'order.gif')
api_upload(currentDate, hanja, 'bw.png')
api_upload(currentDate, japanHanja, 'jorder.gif')
api_upload(currentDate, japanHanja, 'jbw.png')
time.sleep(3)
 
logout(CSRF_TOKEN)
</syntaxhighlight>

명령 변수

변수
사용자의 편집 수 (user_editcount)
34431
사용자 계정 이름 (user_name)
'하늘'
사용자 계정 만든 후 지난 시간 (user_age)
85018169
사용자 권한 그룹 (자동으로 부여된 권한 포함) (user_groups)
[ 0 => '*', 1 => 'user', 2 => 'autoconfirmed' ]
문서 ID (page_id)
180941
문서 이름공간 (page_namespace)
2
(이름공간을 뺀) 문서 제목 (page_title)
'하늘/소스/한자 획순'
전체 문서 제목 (page_prefixedtitle)
'사용자:하늘/소스/한자 획순'
동작 (action)
'edit'
편집 요약/이유 (summary)
''
이전 콘텐츠 모델 (old_content_model)
'wikitext'
새 콘텐츠 모델 (new_content_model)
'wikitext'
편집 전 과거 문서의 위키텍스트 (old_wikitext)
'<syntaxhighlight lang="python"> import requests import datetime import os import sys import re import time S = requests.Session() URL = "https://librewiki.net/api.php" class csrftoken: def get(): PARAMS = { "action": "query", "meta": "tokens", "format": "json" } DATA = S.get(url=URL, params=PARAMS).json() return DATA['query']['tokens']['csrftoken'] def download(url, file_name): print(url, file_name) os.system("wget "+url+" --directory-prefix='" + file_name + "' -nc -q") #os.system('clear') #OS = platform.system() def api_download(prefix, hanja, var): time.sleep(1) PARAMS = { "action": "query", "format": "json", "prop": "imageinfo", "titles": 'file:'+hanja+'-'+var, "utf8": 1, "formatversion": "latest", "iiprop": "url" } DATA = S.get(url="https://commons.wikimedia.org/w/api.php", params=PARAMS).json() if 'missing' in DATA['query']['pages'][0]: print(hanja+'-'+var+' missing') else: download(DATA['query']['pages'][0]['imageinfo'] [0]['url'], prefix + '/') print('downloaded '+hanja+'-'+var) def api_upload(prefix, hanja, var): #os.system('clear') if os.path.isfile(prefix + '/' + hanja+'-'+var) == True: uploadPARAMS = { "action": "upload", "filename": hanja+'-'+var, "format": "json", "text": "== 파일의 설명 ==\n{{파일 정보\n|설명 = \n|출처 = Wikimedia commons\n|날짜 = \n|만든이 = \n|기타 = \n}}\n== 라이선스 ==\n{{CC-BY-SA-3.0}}\n[[분류:한자/문자/획순/"+var+"]]", "async": 1, "token": CSRF_TOKEN, "ignorewarnings": 1 } FILE = {'file': (hanja+'-'+var, open(prefix + '/' + hanja+'-'+var, 'rb'), 'multipart/form-data')} DATA = S.post(URL, files=FILE, data=uploadPARAMS).json() print(DATA) else: print("파일 없음") return def login(name, password): # Step 1: Retrieve login token first PARAMS = { 'action': "query", 'meta': "tokens", 'type': "login", 'format': "json" } R = S.get(url=URL, params=PARAMS) DATA = R.json() LOGIN_TOKEN = DATA['query']['tokens']['logintoken'] # Step 2: Send a POST request to login. Using the main account for login is not # supported. Obtain credentials via Special:BotPasswords # 봇 비밀번호 설정 권장, 형식 : Caeruleum@asdfqwerzxcvpoiulkjhmnbv PARAMS = { "action": "login", "format": "json", "lgname": name, "lgpassword": password, "lgtoken": LOGIN_TOKEN, "utf8": 1 } DATA = S.post(URL, data=PARAMS).json() if DATA["login"]["result"] == "Success": print("로그인 성공") else: print("로그인 실패") exit() def logout(CSRF_TOKEN): DATA = S.post(URL, data={"action": "logout", "token": CSRF_TOKEN, "format": "json"}).json() print("로그아웃") print(DATA) login("Caeruleum", "Caeruleum@*********************************") fontType = '명조' currentDate = str(datetime.datetime.now()) currentDate = currentDate.split('.')[0] temp = open('date.txt', 'r') preDate = temp.readline().replace('-', ':') temp.close() print(preDate) date_file = open('date.txt', 'w') date_file.write(currentDate) date_file.close() if not(os.path.isdir(currentDate)): os.makedirs(os.path.join(currentDate)) PARAMS = { "action": "query", "format": "json", "list": "categorymembers", "utf8": 1, "cmnamespace": "1600", "cmtitle": "분류:한자/문자", "cmprop": "title|timestamp", "cmtype": "page", "cmlimit": "max", "cmsort": "timestamp", "cmstart": preDate } DATA = S.get(url=URL, params=PARAMS).json() PAGES = DATA['query']['categorymembers'] hanjaList = open(currentDate + '/list.csv', 'a') for page in PAGES: hanja = page['title'].split('/')[1] + '\n' hanjaList.write(hanja) hanjaList.close() hanjaList = open(currentDate + '/list.csv', 'r') CSRF_TOKEN = csrftoken.get() while True: hanja = hanjaList.readline().replace('\n', '') if not hanja: break PARAMS = { "action": "query", "format": "json", "prop": "revisions", "formatversion": "2", "rvprop": "content", "rvslots": "*" } PARAMS["titles"] = '시리즈:리브레 한자사전/' + hanja DATA = S.get(url=URL, params=PARAMS).json() PAGE = DATA['query']['pages'][0]['revisions'][0]['slots']['main']['content'] hanja = re.search('한자 =(.+?)\n', PAGE).group(1).strip() print('------------------') print(hanja) japanHanja = re.search('신자체 =(.+?)\n', PAGE) chineseHanja = re.search('간체자 =(.+?)\n', PAGE) if japanHanja == None: japanHanja = hanja else: japanHanja = japanHanja.group(1).strip() if japanHanja == "": japanHanja = hanja api_download(currentDate, hanja, 'bw.png') api_download(currentDate, hanja, 'order.gif') api_download(currentDate, japanHanja, 'jorder.gif') api_download(currentDate, japanHanja, 'jbw.png') if chineseHanja != None: chineseHanja = chineseHanja.group(1).strip() if chineseHanja != "": api_download(currentDate, chineseHanja, 'order.gif') api_download(currentDate, chineseHanja, 'bw.png') api_upload(currentDate, chineseHanja, 'order.gif') api_upload(currentDate, chineseHanja, 'bw.png') api_upload(currentDate, hanja, 'order.gif') api_upload(currentDate, hanja, 'bw.png') api_upload(currentDate, japanHanja, 'jorder.gif') api_upload(currentDate, japanHanja, 'jbw.png') time.sleep(3) logout(CSRF_TOKEN) </syntaxhighlight>'
편집 후 새 문서의 위키텍스트 (new_wikitext)
'{{삭제|}}'
편집 전후의 차이 (edit_diff)
'@@ -1,203 +1,1 @@ -<syntaxhighlight lang="python"> -import requests -import datetime -import os -import sys -import re -import time - -S = requests.Session() -URL = "https://librewiki.net/api.php" - - -class csrftoken: - def get(): - PARAMS = { - "action": "query", - "meta": "tokens", - "format": "json" - } - DATA = S.get(url=URL, params=PARAMS).json() - return DATA['query']['tokens']['csrftoken'] - - -def download(url, file_name): - print(url, file_name) - os.system("wget "+url+" --directory-prefix='" + file_name + "' -nc -q") - #os.system('clear') - -#OS = platform.system() - - -def api_download(prefix, hanja, var): - time.sleep(1) - PARAMS = { - "action": "query", - "format": "json", - "prop": "imageinfo", - "titles": 'file:'+hanja+'-'+var, - "utf8": 1, - "formatversion": "latest", - "iiprop": "url" - } - - DATA = S.get(url="https://commons.wikimedia.org/w/api.php", - params=PARAMS).json() - if 'missing' in DATA['query']['pages'][0]: - print(hanja+'-'+var+' missing') - else: - download(DATA['query']['pages'][0]['imageinfo'] - [0]['url'], prefix + '/') - print('downloaded '+hanja+'-'+var) - - -def api_upload(prefix, hanja, var): - #os.system('clear') - if os.path.isfile(prefix + '/' + hanja+'-'+var) == True: - uploadPARAMS = { - "action": "upload", - "filename": hanja+'-'+var, - "format": "json", - "text": "== 파일의 설명 ==\n{{파일 정보\n|설명 = \n|출처 = Wikimedia commons\n|날짜 = \n|만든이 = \n|기타 = \n}}\n== 라이선스 ==\n{{CC-BY-SA-3.0}}\n[[분류:한자/문자/획순/"+var+"]]", - "async": 1, - "token": CSRF_TOKEN, - "ignorewarnings": 1 - } - FILE = {'file': (hanja+'-'+var, open(prefix + '/' + hanja+'-'+var, - 'rb'), 'multipart/form-data')} - DATA = S.post(URL, files=FILE, data=uploadPARAMS).json() - print(DATA) - else: - print("파일 없음") - return - - -def login(name, password): - # Step 1: Retrieve login token first - PARAMS = { - 'action': "query", - 'meta': "tokens", - 'type': "login", - 'format': "json" - } - R = S.get(url=URL, params=PARAMS) - DATA = R.json() - LOGIN_TOKEN = DATA['query']['tokens']['logintoken'] - -# Step 2: Send a POST request to login. Using the main account for login is not -# supported. Obtain credentials via Special:BotPasswords -# 봇 비밀번호 설정 권장, 형식 : Caeruleum@asdfqwerzxcvpoiulkjhmnbv - PARAMS = { - "action": "login", - "format": "json", - "lgname": name, - "lgpassword": password, - "lgtoken": LOGIN_TOKEN, - "utf8": 1 - } - DATA = S.post(URL, data=PARAMS).json() - if DATA["login"]["result"] == "Success": - print("로그인 성공") - else: - print("로그인 실패") - exit() - - -def logout(CSRF_TOKEN): - DATA = S.post(URL, data={"action": "logout", - "token": CSRF_TOKEN, "format": "json"}).json() - print("로그아웃") - print(DATA) - - -login("Caeruleum", "Caeruleum@*********************************") - -fontType = '명조' - -currentDate = str(datetime.datetime.now()) -currentDate = currentDate.split('.')[0] - -temp = open('date.txt', 'r') -preDate = temp.readline().replace('-', ':') -temp.close() -print(preDate) -date_file = open('date.txt', 'w') -date_file.write(currentDate) -date_file.close() - -if not(os.path.isdir(currentDate)): - os.makedirs(os.path.join(currentDate)) - -PARAMS = { - "action": "query", - "format": "json", - "list": "categorymembers", - "utf8": 1, - "cmnamespace": "1600", - "cmtitle": "분류:한자/문자", - "cmprop": "title|timestamp", - "cmtype": "page", - "cmlimit": "max", - "cmsort": "timestamp", - "cmstart": preDate -} -DATA = S.get(url=URL, params=PARAMS).json() -PAGES = DATA['query']['categorymembers'] - -hanjaList = open(currentDate + '/list.csv', 'a') -for page in PAGES: - hanja = page['title'].split('/')[1] + '\n' - hanjaList.write(hanja) -hanjaList.close() -hanjaList = open(currentDate + '/list.csv', 'r') - -CSRF_TOKEN = csrftoken.get() - -while True: - hanja = hanjaList.readline().replace('\n', '') - if not hanja: - break - - PARAMS = { - "action": "query", - "format": "json", - "prop": "revisions", - "formatversion": "2", - "rvprop": "content", - "rvslots": "*" - } - PARAMS["titles"] = '시리즈:리브레 한자사전/' + hanja - DATA = S.get(url=URL, params=PARAMS).json() - PAGE = DATA['query']['pages'][0]['revisions'][0]['slots']['main']['content'] - hanja = re.search('한자 =(.+?)\n', PAGE).group(1).strip() - print('------------------') - print(hanja) - japanHanja = re.search('신자체 =(.+?)\n', PAGE) - chineseHanja = re.search('간체자 =(.+?)\n', PAGE) - if japanHanja == None: - japanHanja = hanja - else: - japanHanja = japanHanja.group(1).strip() - if japanHanja == "": - japanHanja = hanja - - api_download(currentDate, hanja, 'bw.png') - api_download(currentDate, hanja, 'order.gif') - api_download(currentDate, japanHanja, 'jorder.gif') - api_download(currentDate, japanHanja, 'jbw.png') - - if chineseHanja != None: - chineseHanja = chineseHanja.group(1).strip() - if chineseHanja != "": - api_download(currentDate, chineseHanja, 'order.gif') - api_download(currentDate, chineseHanja, 'bw.png') - api_upload(currentDate, chineseHanja, 'order.gif') - api_upload(currentDate, chineseHanja, 'bw.png') - api_upload(currentDate, hanja, 'order.gif') - api_upload(currentDate, hanja, 'bw.png') - api_upload(currentDate, japanHanja, 'jorder.gif') - api_upload(currentDate, japanHanja, 'jbw.png') - time.sleep(3) - -logout(CSRF_TOKEN) -</syntaxhighlight> +{{삭제|}} '
편집 중 추가된 줄 (added_lines)
[ 0 => '{{삭제|}}' ]
편집이 토르 끝 노드를 통해 바뀌었는 지의 여부 (tor_exit_node)
false
바뀐 시점의 유닉스 시간 기록 (timestamp)
1664369629