細
→恒心教徒の皆様へ:当Wikiのソースの魚拓取得をお手伝い下さい
>Fet-Fe |
>Fet-Fe |
||
48行目: | 48行目: | ||
ROOT: Final[str] = "https://krsw-wiki.org" | ROOT: Final[str] = "https://krsw-wiki.org" | ||
ARCHIVE: Final[str] = "https://archive.ph" | ARCHIVE: Final[str] = "https://archive.ph" | ||
YOBI: Final[re.Pattern] = re.compile(r'\([日月火水木金土]\)') | |||
ARCHIVE_WIP_URL_RE: Final[re.Pattern] = re.compile(r'document\.location\.replace\(\"(https:\/\/archive\.ph\/wip\/\S+)\"\)') | |||
# curlコマンドでリクエストを送る | # curlコマンドでリクエストを送る | ||
def curl(arg: str) -> str: | def curl(arg: Final[str]) -> str: | ||
sleep(1) # DoS予防 | sleep(1) # DoS予防 | ||
return subprocess.run('curl -sSL ' + arg, stdout=subprocess.PIPE, shell=True).stdout.decode('utf-8') | return subprocess.run('curl -sSL ' + arg, stdout=subprocess.PIPE, shell=True).stdout.decode('utf-8') | ||
64行目: | 64行目: | ||
# ページが最後に編集された時間を取得 | # ページが最後に編集された時間を取得 | ||
def last_edit(page_href: str) -> datetime: | def last_edit(page_href: Final[str]) -> datetime: | ||
info_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=info" | info_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=info" | ||
page_obj = fetch_page(info_page_url) | page_obj = fetch_page(info_page_url) | ||
time_text = page_obj.select_one('#mw-pageinfo-lasttime > td > a').get_text(strip=True) | time_text = page_obj.select_one('#mw-pageinfo-lasttime > td > a').get_text(strip=True) | ||
# 2022年3月3日 (木) 15:40 みたいな形式からdatetimeに | # 2022年3月3日 (木) 15:40 みたいな形式からdatetimeに | ||
time_text = | time_text = YOBI.sub('', time_text) | ||
timestamp = datetime.strptime(time_text, '%Y年%m月%d日 %H:%M') | timestamp = datetime.strptime(time_text, '%Y年%m月%d日 %H:%M') | ||
return timestamp | return timestamp | ||
# ページのソースが最後に魚拓された時間を取得 | # ページのソースが最後に魚拓された時間を取得 | ||
def last_archive(page_href: str) -> datetime: | def last_archive(page_href: Final[str]) -> datetime: | ||
source_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=edit" | source_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=edit" | ||
archive_page_url = f"{ARCHIVE}/{source_page_url}" | archive_page_url = f"{ARCHIVE}/{source_page_url}" | ||
92行目: | 92行目: | ||
# 1つのページの魚拓をとる | # 1つのページの魚拓をとる | ||
def archive_page(page_href: str): | def archive_page(page_href: Final[str]): | ||
source_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=edit" | source_page_url = f"{ROOT}/index.php?title={page_href[6:]}&action=edit" | ||
print(f"{unquote(source_page_url)} の魚拓を取るナリ") | print(f"{unquote(source_page_url)} の魚拓を取るナリ") | ||
response = curl(f"-X POST -A 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0' -H 'Host:archive.ph' {ARCHIVE}/submit/ --data-raw 'anyway=1&submitid={quote(fetch_submitid())}&url={quote(source_page_url)}'") | response = curl(f"-X POST -A 'Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0' -H 'Host:archive.ph' {ARCHIVE}/submit/ --data-raw 'anyway=1&submitid={quote(fetch_submitid())}&url={quote(source_page_url)}'") | ||
print(f"{ | print(f"{ARCHIVE_WIP_URL_RE.search(response)[1]} で魚拓を取っているナリ\n") | ||
# ページ一覧の各ページで最新の魚拓をとる | # ページ一覧の各ページで最新の魚拓をとる | ||
116行目: | 116行目: | ||
archive_each_page(f"{ROOT}{pagination_url.get('href')}") | archive_each_page(f"{ROOT}{pagination_url.get('href')}") | ||
def main(namespace_list: list[int]): | def main(namespace_list: Final[list[int]]): | ||
for i in namespace_list: | for i in namespace_list: | ||
# 名前空間のページ一覧のURL | # 名前空間のページ一覧のURL | ||
124行目: | 124行目: | ||
if __name__ == '__main__': | if __name__ == '__main__': | ||
namespace_list = [ | namespace_list: Final[list[int]] = [ | ||
0, # (標準) | 0, # (標準) | ||
4, # Wiki | 4, # Wiki |