はじめに
本コードはクリップボードにコピーされたWikipediaのURL(テキスト形式)をWikipedia PageIDのURLに変換してクリップボードにコピーし直すというものです。
- URLをクリップボードにコピー
- 本コードを実行
- クリップボードに変換後の内容が入っている
という趣旨です。
更新履歴
2021-05-19:多言語対応・改定
2021-05-19:改定
2021-05-28:改定
2021-05-31:classを使用したものを追記
ところで
初投稿、2021-05-18時点でPython歴3週間です。改善点等があればご指摘いただければ助かります。投稿のお作法さえもまだまったく分からない状態です……。
きっかけ
さて、一般教養科目系を教える場合には、結局のところ教員側もWikipediaを使い倒さざるをえないのが現実です1。しかし、出典としてリンクを貼る場合にパーセントエンコーディング2を使用すると、異常に長いリンクができあがったり、意図しない変換が行われてリンク先を間違えてしまったりすることがあります。
そこで、Wikipedia PageID3を参照することで、上述のトラブルを回避したいと考えました。
前準備
Pythonとモジュールのインストール方法等は別途、お調べいただければと思います。外部で必要なモジュールは
pip install pyperclip
pip install requests
を使用しました。
ソースコード
必要なものをインストールした後で、下記のコードを作成します。
##ベタ打ち
# -*- 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使用
# -*- 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にこれほど情報を提供してくださる方がいらっしゃらなければ、このコードは作ろうとは思ってもいなかったと思います。参考にさせていただいた方々に深く感謝いたします。
謝辞
早速のご教示ありがとうございます。