毎日ちょっとPython ~ 12日目 ~

今日はプロジェクトが走り出します。ディレクトリを準備して、そこにファイルを複数用意。楽しみになってきました。

今回はパスワードロッカーを作成します。パスワード管理ソフトウェア(脆弱性ありあり)を作りながら基本的なプログラムの働きについて学ぶことができる。やっていきまっしょう!

まずは設計とデータ構造

コマンドライン引数として、アカウント名を入力すると、パスワードがクリップボードにコピーされてすぐに張り付けられるようにする!というようなものを作ります。

まず一つ目のファイルを作成します。pw.pyという名前で作成します。

その時に最初の行に#!という行(シバンというらしい。プログラムが何を使用するものかを伝えるためのものだそうです。)を追加し、プログラムの簡単な説明を書きます

#! Python3
# pw.py - パスワード管理プログラム(脆弱性あり)

PASSWORD = {'email':'DLXzHnyDMtezfyedv6F9LamCLH5YXH',
           'blog': 'CjiYpkWmdCUMVqNsmDS86B53PYpayz',
           'luggage':'12345'}

コマンドライン引数を扱う

コマンドライン引数は sys.argv という変数に格納されます(そうなんだー)。sys.argvの最初の要素は、常にプログラムのファイル名pw.pyを含んだ文字列になり、2番目の要素以降がコマンドライン引数になります。

このプログラムではパスワードを知りたいアカウント名を引数で指定します。ユーザーが引数をつけ忘れた時にには(つまり、リストsys.argvの長さが2未満のとき)には、使い方を表示する。

#! Python3
# pw.py - パスワード管理プログラム(脆弱性あり)

PASSWORD = {'email':'DLXzHnyDMtezfyedv6F9LamCLH5YXH',
           'blog': 'CjiYpkWmdCUMVqNsmDS86B53PYpayz',
           'luggage':'12345'}

import sys
if len(sys.argv) < 2:
   print('使い方: python pw.py [アカウント名]')
   print('パスワードをクリップボードにコピーします')
   sys.exit()

account = sys.argv[1] # 最初のコマンドライン引数がアカウント名

正しいパスワードをコピーする

変数 account にアカウント名が文字列として保存できたので、辞書PASSWORDSのキーとして存在するかを調べます。あったら pyperclip.copy() を用いて、そのキーの値をクリップボードにコピーします(インポートしてね)。

account(引数)に入っているものがPASSWORDのリストに入っているかを確認します。

#! Python3
# pw.py - パスワード管理プログラム(脆弱性あり)

PASSWORD = {'email':'DLXzHnyDMtezfyedv6F9LamCLH5YXH',
           'blog': 'CjiYpkWmdCUMVqNsmDS86B53PYpayz',
           'luggage':'12345'}

import sys
import pyperclip

if len(sys.argv) < 2:
   print('使い方: python pw.py [アカウント名]')
   print('パスワードをクリップボードにコピーします')
   sys.exit()

account = sys.argv[1] # 最初のコマンドライン引数がアカウント名

if account in PASSWORD:
   pyperclip.copy(PASSWORD[account])
   print(account + 'のパスワードをクリップボードにコピーしました')
else:
   print(account + 'というアカウント名はありません')

こんな感じで用意できました。これをバッチファイルとして実行することができるようになります。パスワードではありますが、テンプレートを引数渡してすぐに張り付けてくれるみたいなかんじでプログラム作ればええやん。ということらしいです。

バッチファイルの作り方みたいなことが書籍に書いてあったのでちょっと書きます。

バッチ処理にする

どうやら、 py.exe というファイルがあるらしく複数バージョンのPythonをインストールしているときに、正しいバージョンを実行するのに役立つものらしいです。

んで、こんなファイルを実行するためにバッチ(拡張子 .bat)を作るみたいです

@py.exe ファイルフルパス名 %*
@py.exe C:\path\to\your\pythonScript.py %*

みたいな感じ。こうすれば、毎回実行するときに絶対パスでやらんでもできるようになるよとのこと。(いつかつかう)

Wikiで箇条書きのマークアップするプロジェクト

行の先頭にアスタリスク(*)をつけると、箇条書きの点を打つことができます。ただ、これ長大なリストに点を打ちたいときには、どうしたらよいでしょうか?もちろん手作業で一行ずつ * を打つのをやらせましょって感じ。

とりあえずこんな感じでやるそうです。

1. クリップボードからテキストを取得する
2. テキスト処理をする
3. 新しいテキストをクリップボードにコピーする

まず、クリップボードにコピーしたテキストを取得します。

#! python3
# bulletPointAdder.py
# 点を打って、wikipediaの箇条書きにする

import pyperclip
text = pyperclip.paste()

# TODO: 行を分割して、'*'を追加する

pyperclip.copy(text)

TODOというコメントは実装することを忘れないために書いているらしい

行を分割して「*」を追加する

んで、改行を含んだリストをグイってコピーしてくるとこんな感じ。

'日本の野鳥一覧\n犬の品種一覧\n猫の種類一覧\n家畜一覧'

なので、改行\nを検索して * を追加するコードを書いてもいいけど、ここでは split() を使って、元の文字列を各行に分割した文字列のリスト取得してリストの各要素の先頭に * をつける感じで行きます。

#! python3
# bulletPointAdder.py
# 点を打って、wikipediaの箇条書きにする

import pyperclip
text = pyperclip.paste()

# 行を分割して、'*'を追加する

lines = text.split('\n')
for i in range(len(lines)):    # "lines"リストの各要素をループする
   lines[i] = '* ' + lines[i]  # "lines"の要素に"* "を追加する

pyperclip.copy(text)

変更した行を結合する

これで各行に追加できたんですが、pyperclip.copy()は文字列のリストではなく、一つの文字列の値を引数にとるので、join()メソッドを使って文字列のリストを一つの文字列にまとめます。

#! python3
# bulletPointAdder.py
# 点を打って、wikipediaの箇条書きにする

import pyperclip
text = pyperclip.paste()

# 行を分割して、'*'を追加する

lines = text.split('\n')
for i in range(len(lines)):     # "lines"リストの各要素をループする
   lines[i] = '* ' + lines[i]  # "lines"の要素に"* "を追加する

text = '\n'.join(lines)
pyperclip.copy(text)

ぴえーこれ便利!

最後に

次からは、正規表現らしい。たのしみぃ

この記事が気に入ったらサポートをしてみませんか?