场景编程集锦-你是谁?(代码片段)

author author     2023-01-10     330

关键词:

1. 场景描述

  或许是近年来电话推销机器人太泛滥了,常常搞得正常的电话销售“灰头土脸”。有人为了验证对方究竟是人还是机器,竟想出来各种各样的奇葩手段。最近一小伙接到了一个汽车推销电话,但他听声音无法判断对方是不是人工客服人员。尽管对方在电话里反复声称自己是“真人”,可男子还是不肯相信,竟然提出让客服人员即兴背诵唐诗《陋室铭》,以此证明自己不是人工智能机器人,令人啼笑皆非。其实在这个场景中涉及一个重要而核心的问题,那就是如何进行身份认证。

  我们现在生活在一个网络时代,身份认证也算是司空见惯的事情。例如:如果你需要修改手机银行登录密码,那么你就要通过获取短信验证码来证明自己的身份;如果你忘记了邮箱登录密码,你需要向邮箱运营方申请验证码,以便重置邮件系统的登录密码;使用验证码来验证身份的场景比比皆是。在这些认证场景中,验证码就是我们获取特殊权限的通行证,以此证明:你是谁?从哪里来?要到哪里去?你可千万别小看这三个问题,这是哲学研究的三大终极问题。   接下来,我们就来谈一谈验证码的事儿,如何生成验证码以及怎样进行验证码的校验。


2. 编程思路

  总体来讲,我们常见的验证码可分为纯数字验证码以及由字母数字和特殊字符组成的字符验证码。顾名思义纯数字验证码由数字0~9组成的多位的数字串。本场景中我们讲解纯数字验证码的生成和验证。

2.1 随机生成验证码

  我们可以在字符串“1234567890”中随机抽取4个字符,组成一个新的字符串,这个就是一个数字验证码。

2.2 验证码的实效性

  出于安全性原因,每个验证码都有一个实效性要求,也就是说验证码在一定的时间范围内才是有效的。因此我们可以在创建验证码的同时,生成一个时间戳,便于在验证码校验时与当前时间进行比较。这里我们把验证码的生命周期设定为5分钟。

2.3 如何验证验证码

  双重校验。既要校验验证码的正确性,又要校验验证码的有效期。


3. 程序代码

  程序由两个模块组成。一个是验证码函数基础模块verification_code.py,它是存放在Python包common中;另一个是主程序,演示验证码函数的各种使用方法verification_test.py。 下面是模块verification_code.py的源程序代码:

"""
  verification_code.py : 验证码基础函数模块
"""
import time
import random

def make_code(length=4):
    """
    功能:随机生成验证码
    参数:length 验证码长度
    """
    digitals = 0123456789
    code = 
    for i in range(length):
        idx = random.randint(0, len(digitals)-1)   # ①
        code += digitals[idx]   # ②
    return code

def check_code(code_dict, code, timeout=5):
    """
    功能:校验验证码
    参数:code_dict 验证码字典
         code 验证码
         timeout 验证码有效期,单位为分钟
    """
    status = 0
    period = timeout * 60   # ③
    time_stamp = time.time()   # ④

    if code not in code_dict:
        status = 1  # 验证码无效
    else:
        if (time_stamp-code_dict[code]) > period:   # ⑤
            status = 2  # 验证码超时
        else:
            status = 0  # 验证码正确
    return status


def add_code(code_dict, code):
    """
    功能:将验证码保存到字典
    参数:code_dict 存放验证码字典
         code 验证码
    """
    
    code_dict[code] = time.time()   # ⑥

重要函数说明如下: 函数make_code(length=4):缺省默认情况下,生成一个4位数字的验证码。 函数check_code(code_dict, code, timeout=5):校验验证码。默认情况下验证码的有效期是5分钟。 函数add_code(code_dict, code):将验证码code加入到验证码字典中。 重要语句说明如下: 语句①随机生成字符串:0123456789中的一个索引值。 语句②根据索引值idx提取字符串:0123456789中的一个字符。 语句③将验证码有效期的分钟转换成秒数。 语句④生成当前时间的时间戳。 语句⑤校验验证码是否过期。 语句⑥创建一个字典项,它是以验证码是键,时间戳是值。 以下是模块verification_test.py程序代码:

"""
  verification_test.py : 趣谈验证码
"""
from common.verification_code import *

def print_status(status):
    if status == 0:
        print("验证码正确!")
    elif status == 1:
        print("验证码错误!")
    elif status == 2:
        print(验证码过期!)

def main():
    code_dict =   # 验证码字典

    for i in range(3):  # 生成 3 个验证码
        code = make_code()  # 4位数字验证码
        time.sleep(1)
        add_code(code_dict, code)

    # 打印生成的验证码和时间戳
    print(验证码, \\t, 时间戳)
    for k, v in code_dict.items():
        print(k, \\t, v)

    # 取字典中第1个键
    code = list(code_dict.keys())[0]

    status = check_code(code_dict, code)
    print_status(status)

    time.sleep(360)   # 延时6分钟
    status = check_code(code_dict, code, timeout=5)
    print_status(status)

    status = check_code(code_dict, A345)
    print_status(status)

if __name__ == __main__:
    main()
    

4. 执行效果

4.1 目录结构

本程序由两个模块构成,它们存放的目录如下:

D:\\cases\\趣谈验证码>dir
2022/12/20  16:28    <DIR>          common
2022/12/20  16:21             1,033 verification_test.py
 
D:\\cases\\趣谈验证码>cd common
D:\\cases\\趣谈验证码\\common>dir
2022/12/20  16:28             1,179 verification_code.py
2022/04/01  07:34               106 __init__.py

(cases) D:\\cases\\趣谈验证码\\common>

目录common实际上是Python的包,因为在该目录下有一个特殊文件__init__.py。

4.2 代码执行

D:\\cases\\趣谈验证码>python verification_test.py
验证码   时间戳
8444     1671526895.0580647
7538     1671526896.0734143
2305     1671526897.085462
验证码正确!
验证码过期!
验证码错误!

D:\\cases\\趣谈验证码>

  程序执行的显示结果表明,分别测试了验证码校验中存在的三种情况:即验证码正确、错误和过期,程序处理结果完全正确。

5. 场景扩展

  以上程序展示了数字验证码的生成和校验。作为本案例的延伸和扩展,我们还可以增加字符验证码的生成和校验功能,请读者自行完成。

场景编程集锦-捏紧你的钱袋子(代码片段)

1.场景描述下面是一通电话的通话内容:陌生人:“李总,最近还好吗?”李总:“您是哪一位?”陌生人:“我的声音听不出来啦?”李总:“有点耳熟,想不起来。”陌生人:“猜猜我是谁?”李总:“想起来啦,你是猪二... 查看详情

场景编程集锦-bmi指数与健身达人(代码片段)

1.场景描述  BMI指数(身体质量指数,英文BodyMassIndex)是用体重公斤数除以身高米数的平方得出的数字,是目前国际上通用的衡量人体胖瘦程度以及是否健康的一个标准。“身体质量指数”这个概念,是由19世纪中期的比利时... 查看详情

场景编程集锦-躺平式赚钱(代码片段)

1.场景描述  “你不理财,财不理你”是投资理财最耀眼的标签。这句话可以说是家喻户晓,深入人心。仅从这一点就足以证明银行市场培育已是硕果累累。如果有人要问:最简单、最安逸的赚钱方式是什么呢?那一定是钱生... 查看详情

场景编程集锦-吉米的总统梦想(代码片段)

1.场景描述  吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路。  开学的第一堂课上,老师用白色的粉笔在黑板上写下了“我的梦想”,同学们都陷入了思考。大卫的梦想是当一名科学... 查看详情

场景编程集锦-寻找最优化方案(代码片段)

1.场景描述  最近由神仙姐姐刘亦菲主演的电视剧《去有风的地方》带火了一方旅游,这个地方就是云南大理沙溪,被喻为“心灵疗伤的圣地”。那里是风光秀丽,美不胜收。有湖光山色、落日余晖,有清雅的民宿、还有淳朴... 查看详情

场景编程集锦-大奖在招手,你要hold住(代码片段)

场景描述  2022年12月7日注定会是一个里程碑的日子。因为从这一天开始,我们真正走出了新冠疫情的阴霾。经济开始逐渐复苏,民生有了烟火气,城市商业中心和购物广场开始回归和再现疫情之前的繁华热闹景象。瞧,寰银... 查看详情

场景编程集锦-世界那么大,我想去看看(代码片段)

场景描述  “世界那么大,我想去看看”。这句话出自于一位中学老师的辞职申请,整个辞职信只有短短10个字,它被喻为史上最具情怀的辞职信。如此任性的辞职信,领导最后真批准了。随着辞职信内容爆光,“世界那么大... 查看详情

场景编程集锦-乒坛争锋:孙颖莎vs伊藤美城(代码片段)

1.场景描述孙颖莎和伊藤美诚是世界女子乒坛的顶尖运动员。根据国际乒联2022年11月15日公布的世界排名,孙颖莎位列第一,伊藤美诚排名第五。孙颖莎是中国女子乒乓球队的三大主力,曾获得2020年东京奥运会女乒团体赛金牌,2... 查看详情

sh告诉git你是谁(代码片段)

查看详情

场景编程集锦-我要当学霸(代码片段)

1.场景描述  学霸一词是近年来流行的网络用语,关于学霸的定义网络上也有不同的版本解释,实际上这是一个见仁见智的问题。在我看来,学霸应该具备的三个特点:首先学霸是品学兼优学生;其次是思维灵活、学习力强;... 查看详情

场景编程集锦-快乐时光咖啡屋(代码片段)

1.场景描述  咖啡、可可和茶并称为世界著名的三大饮品。近十年来,咖啡倍受国人偏爱和追捧。因为咖啡文化与时尚生活、工作和休闲娱乐紧密地联系在一起,喝咖啡也似乎成为了小资生活与时尚生活的象征与标配。然而大... 查看详情

场景编程集锦-银行柜员现金清分(代码片段)

1.场景描述  跨界一词不知道什么时候成为了热词。电影演员学说相声,跨界表演展现多才多艺的才能;县长直播带货,推荐地方土特产,展现即兴表演才能;退役核潜艇艇长担任银行电脑处处长,这个跨界可是有点大。然而... 查看详情

场景编程集锦-吉米的总统梦想(代码片段)

1.场景描述  吉米是太平洋岛国一个贫苦家庭的孩子,他的梦想就是当总统,引领国家走向富强之路。  开学的第一堂课上,老师用白色的粉笔在黑板上写下了“我的梦想”,同学们都陷入了思考。大卫的梦想是当一名科学... 查看详情

场景编程集锦-乒坛争锋:孙颖莎vs伊藤美城(代码片段)

1.场景描述孙颖莎和伊藤美诚是世界女子乒坛的顶尖运动员。根据国际乒联2022年11月15日公布的世界排名,孙颖莎位列第一,伊藤美诚排名第五。孙颖莎是中国女子乒乓球队的三大主力,曾获得2020年东京奥运会女乒团体赛金牌,2... 查看详情

场景编程集锦-考试打假

场景描述考试历来都是人才选拔高效而重要的手段,也是彰显社会公平的重要方面。无论是中国古代的科举考试,还是当今的全国高考,或者是出国留学的雅思托福考试,古今中外概莫能外。你是否还记得中学时代的考试情景,... 查看详情

场景编程集锦–妖兔闹春

场景描述为庆祝中国农历春节,中国邮政每年都会发行生肖纪念邮票。2023葵卯年兔年生肖纪念邮票是一只蓝色的卡通兔。最近一段时间以来,这只小小的兔子搅动了中国互联网舆论场。关于这枚邮票美与丑的评论呈现出了巨大... 查看详情

test(代码片段)

目录1functiongetNowDate()vardate=newDate();varsplit="-";varyear=date.getFullYear();varmonth=date.getMonth()+1;varstrDate=date.getDate();if(month>=1&&month=0&&strDate123123你是谁,为了谁,你的兄弟姐妹又是谁你是谁,为了谁hahaha 查看详情

c#基础编程题集锦(代码片段)

C#基础知识编程题集锦简单字符串加密编写一个应用程序用来输入的字符串进行加密,对于字母字符串加密规则如下:\'a→d’‘b\'→’e’‘w’→z\'......x\'→’a’‘y\'→b\'‘z→c’‘A’→’D’‘B\'→’E’‘W’→’Z’‘X’→’A... 查看详情