ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

【退屈なことはPythonにやらせよう】第6章 パスワードロッカーの解説|sys.argv, pyperclip

題名の本、第6章の「パスワードロッカー」でつまづいた人に向けて、解説を書きます。

目次

【 退屈なことは~】のパスワードロッカーを解説する

前置き(大切な事)

まず、この本は私のオススメです【断言】。しかし、Amazonにおけるレビュー低いコメントが散見されます。確かに説明が飛んでいるというか、省略されている部分が多く、分かりづらいのは事実だと思います。

そこを自分なりに調べるのが実力向上に役立つのです。この点において、自分で調べないと分からないという説明不足感が絶妙です。絶妙の説明不足感を含めての★5つです。なので、これを読むだけでバッチリPythonが書ける、というような事は期待してはいけません。

また、この本、このPythonと言うプログラミング言語に限りませんが、基本文法と実務で役立つプログラミング能力には段差があります、。実務で使えるようにするにはサンプルコードをさらに改造する必要があります。ネットや別の本で調べるなどして改造する過程こそが、基本文法と実務レベルのギャップを埋めてくれるのです。

そして、プログラミングの基本文法と実務で使える実装力の段差を埋めるお手伝いをするのがこのブログの役割です。(これが言いたかった)それでは中身に入っていきましょう。

パスワードロッカーの解説

パスワードロッカーの概略

まず「パスワードロッカー」の概略を紹介します。

みなさん、いろいろな会員サイトやアプリに登録しており、その数だけユーザーIDとパスワードを持っていますよね。そこで、ABC銀行のIDを入力すればABC銀行のログインパスワード、DEF証券のIDを入力すればDEF証券のログインパスワードをCtrl + V(Macならコマンドボタン+V)で貼り付けられる状態にしてくれるツールを作ろう、と言うのが今回作成するパスワードロッカーの機能です。

第6章に出てくる分からない言葉を予め調べてしまう

この本の解説が分かりづらい理由は、知らない言葉が当然のように出てくるからです。というわけで、単語の解説を先にしてしまいます。

  • コマンドライン

コマンドプロンプトやアナコンダプロンプトの入力するところ。命令をキーボードから入力するところ。>>>の後ろ。

  • コマンドライン引数

コマンドラインからプログラムを実行するときに、スクリプト名の後に書く引数。スクリプトに渡される。

  • クリップボード

Ctrl + CやMacならコマンド+Cでコピーした文字列を一時的に保存しておくメモのようなもの。

  • sys.argv

コマンドライン引数を返す関数。返すスクリプト名と渡されたコマンドライン引数のリストとなっており、sys.argv[0]がスクリプト名、1以降のインデックスがコマンドライン引数。

  • pyperclip

テキストをクリップボードにコピーしたり、クリップボードからペーストする為のモジュール。pipでインストールが必要。
参考:
sys — System-specific parameters and functions — Python 3.8.1 documentation

本書で説明不足と思われる難しい単語の意味はこれで一通り説明しました。

パスワードロッカーはどのような挙動をするのか

プログラムの中身の解説に移る前に、パスワードロッカーの挙動について概観しておきましょう。いきなりプログラムのサンプルコードを見ても何をやっている所なのかわかりにくいためです。

パスワードロッカーの全体感

パスワードロッカーはパスワードを管理しておくロッカー(金庫)です。ユーザーIDとパスワードを対にして保存して起き、ユーザーIDを入力すると、パスワードが出力されるというものです。クリップボードに出力されるので、Ctrl + Vでそのまま貼り付けることが出来るというのが、今回作成するパスワードロッカーの概要です。それではブレイクダウンして見て行きましょう。

ユーザーIDとパスワードの辞書を作る

パスワードロッカーの機能はユーザーIDを入力してパスワードを出力することなので、ユーザーIDとパスワードを紐付ける作業をします。Pythonでは辞書型を使うのがぴったりです。

#Python3

PASSWORDS_STRING = {'ABC銀行ID':'lfijwd8NW',
                    'EFG証券ID':'Jt984GHs',
                    'LoginID':'lwanopa92710'}

一行目はシバン行といって、プログラムの挙動そのものには関係ありません。パソコンにPython3で記述していますと伝えているだけです。Python界では定数名は大文字で定義しましょうと言うことになったいるらしいので、ユーザーIDとパスワードの組み合わせの辞書は「PASSWORDS_STRING 」とすべて大文字にしました。それぞれのユーザーIDとパスワードは適当です。

ユーザーが使い方を分かっていない時の処理を記述する

次に、このプログラムを実行する時に、コマンドライン引数を渡し忘れたときの処理を記述しておきます。sys.argvはリストを返します。sys.argv[0]はスクリプト名、インデックス1以降が渡されたコマンドライン引数なので、コマンドライン引数が存在しなければリストの長さが1になってしまうはずです。この状態をトラップします。

import sys
if len(sys.argv) == 1:
    print('パスワードを調べるユーザーIDが入力されていません')
    sys.exit()

user_id = sys.argv[1]

sys.exit()はPythonのプログラムをそこで中断します。コマンドライン引数が与えられなかったら、メッセージを表示してプログラムを中断します。中断しなければ、sys.argv[1]、つまりコマンドライン引数をuser_idと言う変数に渡します。このように一度、意味の分かり安名前の変数に渡すことによって、プログラムの可動性が上がり、内容が分かりやすくなります。

クリップボードにコピーする部分とエラー処理を実装する
if user_id in PASSWORDS_STRING:
    pyperclip.copy(PASSWORDS_STRING[user_id])
else:
    print(user_id + 'というユーザーIDは登録されていません')

pyperclip.copy()は引数の中身をクリップボードにコピーする、という関数です。if文でuser_idがPASSWORDS_STRING辞書の中に含まれているならば、と書いています。else、つまり存在しないユーザーIDを指定したときはエラーメッセージを出力するようにしています。

プログラムをつなげる

細切れにして解説しましたのでここまでのプログラムをつなげます。

#Python3
import sys
import pyperclip

PASSWORDS_STRING = {'ABC銀行ID':'lfijwd8NW',
                    'EFG証券ID':'Jt984GHs',
                    'LoginID':'lwanopa92710'}

if len(sys.argv) == 1:
    print('パスワードを調べるユーザーIDが入力されていません')
    sys.exit()

user_id = sys.argv[1]

if user_id in PASSWORDS_STRING:
    pyperclip.copy(PASSWORDS_STRING[user_id])
else:
    print(user_id + 'というユーザーIDは登録されていません')

importは冒頭にもっていきました。

実行前にpyperclipをインストールしておく

もしpyperclipをインストールしていない人は、実行前にpyperclipをインストールしておきましょう。コマンドラインに下記の様に入力します。

pip install pyperclip

Successfully installed pyperclip-1.7.0のような表示が出れば成功です。1.7.0の所はバージョンなので変わります。

実行結果の確認

それでは実行してみます。コマンドラインからプログラム名とユーザーIDをコマンドライン引数として記述してください。

コマンドライン引数に「ABC銀行」を設定
コマンドラインから実行してみる

このような感じで入力します。そして実行します。Windows OSの方は、Windowsマークと「V」を同時押しすることでクリップボード中身を確認することができます。メモ帳かどこかに張り付けして確かめることでももちろん構いません。

クリップボードの中身
クリップボードを確認するとパスワードがコピーされていた

実用的なプログラムにする余地がないか考える

【退屈なことは~】の本の流れに沿って解説してきました。ここで本の解説は終わっています。解説すべきクリップボードへのコピーまでできたからですね。しかし、これが実用的なプログラムだといえるでしょうか。私なら下記のようなことを思います。

  • ユーザーIDは覚えてないといけないの?銀行名を入れたらユーザーIDとパスワードが出力されるべきじゃない?
  • コマンドラインから呼び出して実行するの面倒くさすぎ。exeファイルにしてダブルクリックでできない?
  • 新しくユーザーIDとパスワードを追加したい時はどうするの?まさか.pyファイルを書き換える???

このような疑問、不満を持った時にそこで終わらないことです。これらを解決するように今回のプログラムを書き換えていきましょう。その過程で実装力がついていきます。

パスワードロッカーの解説まとめ

  • 【退屈なことはPythonにやらせよう】は説明不足を含めて★5つ
  • 本の説明不足を自分で調べる過程で実装力がつく
  • 機能の全体像を把握して機能の部品ごとに理解していく
  • このサンプルコードはそのままでは実用的ではないので、改造の余地がある

それでは、ぜひ、まずは自分で調べて今回のパスワードロッカーを実用レベルにしてみましょう。

<関連記事>