自制小功能——cmd中的规则加密输入

用到的库

  • msvcrt :是C语言的运行库,可以访问Windows平台上的一些有用的功能,主要包括 文件操作I/O控制台 功能。
  • argparse :命令行参数解析库,用于对即将运行的程序提供可变参数输入。

基础了解

  • 本实例主要使用 msvcrt 中的 I/O控制台 功能。 msvcrt.getch() 来获取输入的字符,使用 msvcrt.putch() 来输出想要输出的字符,通过 argparse 来获取规则变量参数。本实例通过判断输入的内容是否符合规则;如果符合规则,则会在界面上显示 * 号并被记录,否则不处理;另外本实例支持退格。

实现代码

这是几年前曾今自己为兴趣而写的文件,所以里面的注释都是英文的(我英语并不算怎么好,所以有的可能是字面意思~)。

import msvcrt
import argparse


class Password:
    """
    Only use in CMD , the password can only made of num and alpha and special symbols in english.
    ↑↓←→  ==》  [b'H', b'P', b'K', b'M']
    symbols in [b'+', b'-', b'*', b'/', b'_', b'@', b'#', b'%', b'&']
    :type rule: password rules in ['num', 'alpha', 'symbol', 'na', 'ns', 'as', 'all']
    :return: password
    """
    def __init__(self, rule='all'):
        assert rule in ['all', 'num', 'alpha', 'symbol', 'na', 'ns', 'as'], ValueError("rule in ['num', 'alpha', 'symbol', 'na', 'ns', 'as', 'all']")
        self.password = None
        self.rule = rule
        self.symbols = [b'+', b'-', b'*', b'/', b'_', b'@', b'#', b'%', b'&']
        print('Password: ', end='', flush=True)
        self.letters = []
        while 1:
            self.ch = msvcrt.getch()
            # Enter
            if self.ch == b'\r':
                msvcrt.putch(b'\n')
                print(self.password)
                break
            # Backspace
            elif self.ch == b'\x08':
                if self.letters:
                    self.letters.pop()
                    # \b let the cursor move to the left one, msvcrt.putch must one to one .
                    msvcrt.putch(b'\b')
                    msvcrt.putch(b' ')
                    msvcrt.putch(b'\b')
                    self.password = b''.join(self.letters).decode()
            # Esc
            elif self.ch == b'\x1b':
                break
            elif self.check_rule():
                self.letters.append(self.ch)
                msvcrt.putch(b'*')
                self.password = b''.join(self.letters).decode()

    def check_rule(self):
        """
        :return: the password if match rule
        """
        if '\\x' not in str(self.ch):
            if self.rule == 'num':
                return self.ch.isdigit()
            elif self.rule == 'alpha':
                return self.ch.isalpha()
            elif self.rule == 'symbol':
                return self.ch in self.symbols
            elif self.rule == 'na':
                return self.ch.isalnum()
            elif self.rule == 'ns':
                return self.ch.isdigit() or self.ch in self.symbols
            elif self.rule == 'as':
                return self.ch.isalpha() or self.ch in self.symbols
            elif self.rule == 'all':
                return self.ch.isalnum() or self.ch in self.symbols


if __name__ == '__main__':
    parser = argparse.ArgumentParser(prog=f"python {__file__}", description='Only used in CMD.')
    parser.add_argument('-r', '--rule', type=str, default='all', help="Roles in ['all', 'num', 'alpha', 'symbol', 'na', 'ns', 'as']")
    input(Password(parser.parse_args().rule) and '\n Enter to exit.')

结束语

这次准备的可能比较匆忙,比较简陋,下一次不出意外发的应该是正则整理和python中的re模块。

上一篇:22.多列布局


下一篇:TCP中的三次握手和四次挥手