Python: WikipediaのURLをWikipedia PageIDのURLに変換する

# はじめに
本コードはクリップボードにコピーされたWikipediaのURL（テキスト形式）をWikipedia PageIDのURLに変換してクリップボードにコピーし直すというものです。

1. URLをクリップボードにコピー
1. 本コードを実行
1. クリップボードに変換後の内容が入っている

という趣旨です。

**更新履歴**
2021-05-19：多言語対応・改定
2021-05-19：改定
2021-05-28：改定
2021-05-31：classを使用したものを追記

# ところで
初投稿、2021-05-18時点でPython歴3週間です。改善点等があればご指摘いただければ助かります。投稿のお作法さえもまだまったく分からない状態です……。



# きっかけ
さて、一般教養科目系を教える場合には、結局のところ教員側もWikipediaを使い倒さざるをえないのが現実です[^1]。しかし、出典としてリンクを貼る場合にパーセントエンコーディング[^2]を使用すると、異常に長いリンクができあがったり、意図しない変換が行われてリンク先を間違えてしまったりすることがあります。

そこで、Wikipedia PageID[^3]を参照することで、上述のトラブルを回避したいと考えました。

# 前準備
Pythonとモジュールのインストール方法等は別途、お調べいただければと思います。外部で必要なモジュールは

```console:必要モジュール　(1)
pip install pyperclip
pip install requests
```

を使用しました。

# ソースコード
必要なものをインストールした後で、下記のコードを作成します。
##ベタ打ち
```python:wpu2wpid.py　(1)
# -*- coding: utf-8 -*-
import re
import sys
import requests
import pyperclip

in_text = pyperclip.paste() #クリップボードを取得

#------------
#URL判定ブロック
if '?curid=' in in_text:
	sys.exit('既に変換済みです：' + in_text) #クリップボードの内容をそのままで終了
if not 'https://' in in_text:
	sys.exit('ハイパーリンクではありません：' + in_text) #クリップボードの内容をそのままで終了
if not '.wikipedia.org/wiki/' in in_text:
	sys.exit('Wikipediaのアドレスではありません：' + in_text) #クリップボードの内容をそのままで終了	
	
lang = in_text[8:10] #言語抜き出し

text = in_text.replace('https://', '') #URL抜き出し（行程1）
text = text.replace(lang, '') #URL抜き出し（行程2）
text = text.replace('.wikipedia.org/wiki/', '') #URL抜き出し（行程3）

#------------
#変換ブロック
def getWikiData(url, params): #getWikiDataという関数を作成
	res = requests.get(url, params = params)
	return res.json()

url = 'https://' + lang + '.wikipedia.org/w/api.php' #WikipediaのAPIを使用
params = { 'action' : 'query',
		   'titles'  : text,
		   'format'  : 'json'
		  } #変数paramsにWikipediaのAPIからの情報を代入

wtext = getWikiData(url, params)

wpid = str(wtext['query']['pages'])
wpid = wpid[2:]
wpid = re.search(r'\d+', wpid)

idurl = 'https://' + lang + '.wikipedia.org/?curid=' + wpid.group()

if idurl == 'https://ja.wikipedia.org/?curid=1':
	pyperclip.copy(in_text)
	sys.exit('変換不可能なリンクです：' + in_text) #クリップボードの内容をそのままで終了

pyperclip.copy(idurl)
sys.exit("クリップボードにコピー完了：" + idurl) #操作完了報告
```
##class使用
```python:wpu2wpid.py　(2)
# -*- coding: utf-8 -*-
import re
import sys
import requests
import pyperclip

# ----------------
# 機能定義ここから
class Import_URL: # クリップボードを取得
	global in_text # クリップボードの中身をglobal化
	in_text = pyperclip.paste()

class Ckeck_URL(): # URL判定
	if '?curid=' in in_text:
		print('既に変換済みです：' + in_text)
		sys.exit(1) # クリップボードの内容をそのままで終了
	if not 'https://' in in_text:
		print('ハイパーリンクではありません：' + in_text) #クリップボードの内容をそのままで終了
		sys.exit(1) #クリップボードの内容をそのままで終了
	if not '.wikipedia.org/wiki/' in in_text:
		print('Wikipediaのアドレスではありません：' + in_text) #クリップボードの内容をそのままで終了	
		sys.exit(1) #クリップボードの内容をそのままで終了	

class Ckeck_Lang_and_make_URL(): # 言語抜き出しとURL生成
	global lang, text # 言語とURLをglobal化
	lang = in_text[8:10] # 言語抜き出し
	text = in_text.replace('https://', '') # URL抜き出し（行程1）
	text = text.replace(lang, '') # URL抜き出し（行程2）
	text = text.replace('.wikipedia.org/wiki/', '') # URL抜き出し（行程3）

class Translate: # WikipediaAPIを使用してID変換
	global idurl, wpid # PageIDと、そのURLをglobal化
	def getWikiData(url, params): # getWikiDataという関数を作成
		res = requests.get(url, params = params) # APIから指定の内容を取得
		return res.json() # getWikiDataの引数に代入
	url = 'https://' + lang + '.wikipedia.org/w/api.php' #WikipediaのAPIを使用
	params = { 'action' : 'query',
				'titles'  : text,
				'format'  : 'json'
				} #変数paramsの内容を定義
	wtext = getWikiData(url, params) # 代入
	wpid = str(wtext['query']['pages']) # PagesIDを抽出（行程1）
	wpid = wpid[2:] # PagesIDを抽出（行程2）
	wpid = re.search(r'\d+', wpid) # PagesIDを抽出（行程3）
	idurl = 'https://' + lang + '.wikipedia.org/?curid=' + wpid.group() # URL生成

class CannotFindID:
	if idurl == 'https://ja.wikipedia.org/?curid=1': # PageIDが存在しなかった場合の処理
		pyperclip.copy(in_text) # クリップボードをそのまま返す
		print('変換不可能なリンクです：' + in_text) 
		if 'ファイル:' in in_text:
			print('※ Wikimediaを参照しているリンクの可能性があります') 
		sys.exit(1) # エラー表示

class Finish: # 仕上げ
	pyperclip.copy(idurl) #クリップボードにコピー
	print('タイトル：' + text) # 読み込み内容の表示
	print('Page(s)ID：' + wpid.group()) # 読み込み内容の表示
	print('クリップボードにコピー完了：' + idurl) #操作完了報告
sys.exit(0) # 正常終了
# 機能定義ここまで
# ----------------

# 実行ブロック
Import_URL()
Ckeck_URL()
Ckeck_Lang_and_make_URL()
Translate()
CannotFindID()
Finish()
```

# 終わりに
Pythonの文法がここまで書きやすく、またQiitaにこれほど情報を提供してくださる方がいらっしゃらなければ、このコードは作ろうとは思ってもいなかったと思います。参考にさせていただいた方々に深く感謝いたします。

# 謝辞
早速のご教示ありがとうございます。

[^1]: 学生さんにWikipediaの使用をとやかく言う人は減りましたが、正しい扱い方をそれぞれの科目で教えるのではなくて、理想を言えば後期中等教育できちんと教えることですが、せめて1年次に体系的に正しい使い方を教えるべきだと思うんですよね。
[^2]: 例えば「%E8%A8%80%E8%AA%9E」のような表記を指します。
[^3]: Wikipediaの記事番号。数字表記のため可視化できないがどちらにせよパーセントエンコーディングも（よほどの人でなければ）可視化できないという点では同じだと思われます。