PageSourceSearch

https://www.hestudio.net/assets/make-a-python-mfa-app.html-C1RqeNCH.js

js hestudio.net collected 2026-09-24 10:36:54 UTC 77,550 bytes, 295 lines download raw bytes

1import{_ as s,c as a,f as p,o as t}from"./app-D7CCjthX.js";const e={};function o(l,n){return t(),a("div",null,[...n[0]||(n[0]=[p(`<p>我们经常会遇到一些需要验证动态密码的页面,这个时候在手机上有很多此类的 MFA 应用,比如 Microsoft Authenticator,Duo Mobile,谷歌验证器。</p><p>那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有,绝不自己做的原则,我们将使用开源模块拼凑而成。</p><figure><img src="https://img.hestudio.net/img/2022/12/28/63abc608bb033.png" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure><div class="hint-container info"><p class="hint-container-title">相关信息</p><p>这里只讲解它的原理,图形方案交给你们设计。</p></div><hr><h3 id="环境准备" tabindex="-1"><a class="header-anchor" href="#环境准备"><span>环境准备</span></a></h3><p>首先我们需要安装<code>pyotp</code>(获取动态口令)和<code>heframework</code>(简化开发过程),这两个模块均可以通过<code>pip</code>安装。上述模块需要在 Python 3.6 及以上版本才可以运行。</p><h3 id="规划方案" tabindex="-1"><a class="header-anchor" href="#规划方案"><span>规划方案</span></a></h3><p>它首先可以获取动态口令,这是它最直接的功能。获取动态密码需要对应的 Secure,所以它也需要管理 Secure 的功能。管理面板需要包含添加,删除这些基本操作。</p><p>所以我们计划使用<code>json</code>文本交换格式作为 Secure 的存储介质,使用<code>list</code>分别存储 Secure 及其对应的名称。</p><figure><img src="https://img.hestudio.net/img/2022/12/31/63afb45c9805d.jpeg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure><hr><h3 id="大纲代码" tabindex="-1"><a class="header-anchor" href="#大纲代码"><span>大纲代码</span></a></h3><p>我们首先需要根据主程序图写出一个大纲,以准备后续填充代码。这里需要参考一下<a href="https://pypi.org/project/heframework/" target="_blank" rel="noopener noreferrer">heframework</a>的<a href="https://gitee.com/hestudio-framework/main-windows/blob/master/docs/choose.md" target="_blank" rel="noopener noreferrer"><code>choose</code>模块用法</a></p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> heframework</span>
2<span class="line"><span class="token keyword">import</span> sys</span>
3<span class="line"></span>
4<span class="line"></span>
5<span class="line"><span class="token comment"># 获取令牌</span></span>
6<span class="line"><span class="token keyword">def</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
7<span class="line">    <span class="token keyword">pass</span></span>
8<span class="line"></span>
9<span class="line"></span>
10<span class="line"><span class="token comment"># 管理令牌</span></span>
11<span class="line"><span class="token keyword">def</span> <span class="token function">console</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
12<span class="line">    <span class="token keyword">pass</span></span>
13<span class="line"></span>
14<span class="line"></span>
15<span class="line"><span class="token comment"># main</span></span>
16<span class="line"><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
17<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
18<span class="line">        main <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
19<span class="line">            mode<span class="token operator">=</span><span class="token string">&quot;list&quot;</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">&quot;获取令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;管理令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;退出&quot;</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
19 return_text<span class="token operator">=</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;&gt;&gt;&gt;&quot;</span><span class="token punctuation">)</span></span>
20<span class="line">        <span class="token keyword">if</span> main <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
21<span class="line">            get<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
22<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
23<span class="line">            console<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
24<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span></span>
25<span class="line">            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
26<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
27<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
28<span class="line"></span>
29<span class="line"></span>
30<span class="line"><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">&quot;__main__&quot;</span><span class="token punctuation">:</span></span>
31<span class="line">    main<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
32<span class="line"></span>
33<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3 id="管理令牌" tabindex="-1"><a class="header-anchor" href="#管理令牌"><span>管理令牌</span></a></h3><h4 id="大纲" tabindex="-1"><a class="header-anchor" href="#大纲"><span>大纲</span></a></h4><p>根据上面的内容,我们可以写出管理界面的选择器。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token comment"># 添加</span></span>
34<span class="line"><span class="token keyword">def</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
35<span class="line">    <span class="token keyword">pass</span></span>
36<span class="line"></span>
37<span class="line"></span>
38<span class="line"><span class="token comment"># 删除</span></span>
39<span class="line"><span class="token keyword">def</span> <span class="token function">delete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
40<span class="line">    <span class="token keyword">pass</span></span>
41<span class="line"></span>
42<span class="line"></span>
43<span class="line"><span class="token comment"># 大纲</span></span>
44<span class="line"><span class="token keyword">def</span> <span class="token function">console</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
45<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
46<span class="line">        main <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
47<span class="line">            mode<span class="token operator">=</span><span class="token string">&quot;list&quot;</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">&quot;添加令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;删除令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;退出&quot;</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
47 return_text<span class="token operator">=</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;&gt;&gt;&gt;&quot;</span><span class="token punctuation">)</span></span>
48<span class="line">        <span class="token keyword">if</span> main <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
49<span class="line">            add<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
50<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
51<span class="line">            delete<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
52<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span></span>
53<span class="line">            <span class="token keyword">break</span></span>
54<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
55<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
56<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h4 id="添加令牌" tabindex="-1"><a class="header-anchor" href="#添加令牌"><span>添加令牌</span></a></h4><p>在这里就涉及到了<code>json</code>的操作和文件的读写操作。我们还是继续使用<code>heframework</code>作代码的简化。</p><p>这里代码执行的是顺序操作。首先需要用户录入令牌的名称和 Secure。需要检验是否存在<code>token.json</code>文件,如果不存在则新建一个。如果该文件存在则读取该文件,并确保不存在重复的值。</p><p>如果以上判断返回的值为<code>true</code>,先将<code>name</code>和<code>secure</code>对应的<code>list</code>读取到内存,将新增的值通过<code>append()</code>写入,再将内存中的值重新写入<code>json</code>文件中。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> json</span>
57<span class="line"><span class="token keyword">import</span> os</span>
58<span class="line"><span class="token keyword">import</span> time</span>
59<span class="line"></span>
60<span class="line"></span>
61<span class="line"><span class="token keyword">def</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
62<span class="line">    name <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;令牌名称:&quot;</span><span class="token punctuation">)</span></span>
63<span class="line">    secure <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;令牌Secure:&quot;</span><span class="token punctuation">)</span></span>
64<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
65<span class="line">
65        <span class="token builtin">file</span> <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
66<span class="line">        dicts <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>name<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>secure<span class="token punctuation">]</span><span class="token punctuation">}</span></span>
67<span class="line">        <span class="token builtin">file</span><span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dicts<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
68<span class="line">        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
69<span class="line">        <span class="token builtin">file</span><span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
70<span class="line">        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
71<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
72<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
73<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
74<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
75<span class="line">        <span class="token keyword">if</span> name <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
76<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Existed!&quot;</span><span class="token punctuation">)</span></span>
77<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
78<span class="line">            <span class="token keyword">if</span> secure <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
79<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Existed!&quot;</span><span class="token punctuation">)</span></span>
80<span class="line">            <span class="token keyword">else</span><span class="token punctuation">:</span></span>
81<span class="line">                file_after <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
82<span class="line">                names <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span></span>
83<span class="line">                secures <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span></span>
84<span class="line">                names<span class="token punctuation">.</span>append<span class="token punctuation">(</span>name<span class="token punctuation">)</span></span>
85<span class="line">                secures<span class="token punctuation">.</span>append<span class="token punctuation">(</span>secure<span class="token punctuation">)</span></span>
86<span class="line">                dict_after <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> names<span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> secures<span class="token punctuation">}</span></span>
87<span class="line">                file_after<span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dict_after<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
88<span class="line">                time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
89<span class="line">                file_after<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
90<span class="line">
90                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
91<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h4 id="删除令牌" tabindex="-1"><a class="header-anchor" href="#删除令牌"><span>删除令牌</span></a></h4><p>这里依旧使用顺序结构。将<code>token.json</code>读取后,遍历列表。当用户选择后,通过<code>del</code>对应的选项实现删除操作。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> json</span>
92<span class="line"><span class="token keyword">import</span> os</span>
93<span class="line"><span class="token keyword">import</span> time</span>
94<span class="line"></span>
95<span class="line"><span class="token keyword">def</span> <span class="token function">delete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
96<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
97<span class="line">        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No file!&quot;</span><span class="token punctuation">)</span></span>
98<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
99<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
100<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
101<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
102<span class="line">        <span class="token keyword">if</span> <span class="token keyword">not</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
103<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No Token!&quot;</span><span class="token punctuation">)</span></span>
104<span class="line">
104        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
105<span class="line">            num <span class="token operator">=</span> <span class="token number">0</span></span>
106<span class="line">            <span class="token keyword">for</span> i <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
107<span class="line">                num <span class="token operator">+=</span> <span class="token number">1</span></span>
108<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span>num<span class="token punctuation">,</span> <span class="token string">&quot;: &quot;</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span></span>
109<span class="line">            choose <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;请输入你要删除的项目:&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
110<span class="line">            <span class="token keyword">if</span> choose <span class="token operator">&gt;=</span> <span class="token number">1</span> <span class="token keyword">and</span> choose <span class="token operator">&lt;=</span> num<span class="token punctuation">:</span></span>
111<span class="line">                names <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span></span>
112<span class="line">                secures <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span></span>
113<span class="line">                <span class="token keyword">del</span> names<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">(</span>choose<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span></span>
114<span class="line">                <span class="token keyword">del</span> secures<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">(</span>choose<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span></span>
115<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
116<span class="line">                file_after <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
117<span class="line">                dict_after <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> names<span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> secures<span class="token punctuation">}</span></span>
118<span class="line">                file_after<span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dict_after<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
119<span class="line">                time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
120<span class="line">                file_after<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
121<span class="line">
121            <span class="token keyword">else</span><span class="token punctuation">:</span></span>
122<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
123<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3 id="获取令牌" tabindex="-1"><a class="header-anchor" href="#获取令牌"><span>获取令牌</span></a></h3><p>当然,最重要的东西要留在最后,这部分内容是这个程序最重要的部分。</p><p>我们使用<code>pyotp</code>作 token 的运算,如果想了解这部分内容可以去搜索一下<code>TOTP</code></p><p><code>pyotp</code>输出的 6 位数临时密码通常是几秒变化一次,通过我们的了解,其他同类软件的变化周期通常是 30s</p><figure><img src="https://img.hestudio.net/img/2022/12/31/63afdb2b5f077.jpg" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure><p>根据这些我们就可以写出一个动态密码显示器。</p><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> heframework</span>
124<span class="line"><span class="token keyword">import</span> sys</span>
125<span class="line"><span class="token keyword">import</span> json</span>
126<span class="line"><span class="token keyword">import</span> os</span>
127<span class="line"><span class="token keyword">import</span> time</span>
128<span class="line"><span class="token keyword">import</span> pyotp</span>
129<span class="line"></span>
130<span class="line"></span>
131<span class="line"><span class="token keyword">def</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
132<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
133<span class="line">        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No File&quot;</span><span class="token punctuation">)</span></span>
134<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
135<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
136<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>
136load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
137<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
138<span class="line">        <span class="token keyword">if</span> <span class="token keyword">not</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
139<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No Token!&quot;</span><span class="token punctuation">)</span></span>
140<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
141<span class="line">            secure <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
142<span class="line">                mode<span class="token operator">=</span><span class="token string">&quot;json&quot;</span><span class="token punctuation">,</span> json_file<span class="token operator">=</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;选择令牌:&quot;</span><span class="token punctuation">)</span></span>
143<span class="line">            storage <span class="token operator">=</span> pyotp<span class="token punctuation">.</span>TOTP<span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>secure<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
144<span class="line">            win <span class="token operator">=</span> heframework<span class="token punctuation">.</span>refresh_show<span class="token punctuation">(</span>title<span class="token operator">=</span><span class="token string">&quot;令牌&quot;</span><span class="token punctuation">,</span> geometry<span class="token operator">=</span><span class="token string">&quot;200x100&quot;</span><span class="token punctuation">)</span></span>
145<span class="line">            <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
146<span class="line">                t <span class="token operator">=</span> <span class="token number">30</span></span>
147<span class="line">                token_now <span class="token operator">=</span> storage<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
148<span class="line">                <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
149<span class="line">                    code <span class="token operator">=</span> win<span class="token punctuation">.</span>refresh<span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>token_now<span class="token operator">+</span><span class="token string">&quot;\\n剩余时间&quot;</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">&quot;秒&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
150<span class="line">                    t <span class="token operator">-=</span> <span class="token number">1</span></span>
151<span class="line">                    time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
152<span class="line">
152                    <span class="token keyword">if</span> code <span class="token operator">==</span> <span class="token number">21099</span><span class="token punctuation">:</span></span>
153<span class="line">                        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
154<span class="line">                    <span class="token keyword">elif</span> code <span class="token operator">==</span> <span class="token number">20000</span><span class="token punctuation">:</span></span>
155<span class="line">                        <span class="token keyword">pass</span></span>
156<span class="line">                    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
157<span class="line">                        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
158<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div><h3 id="代码汇总和测试" tabindex="-1"><a class="header-anchor" href="#代码汇总和测试"><span>代码汇总和测试</span></a></h3><p>总结代码如下</p><details class="hint-container details"><summary>完整代码</summary><div class="language-python line-numbers-mode has-collapsed-lines collapsed" data-highlighter="prismjs" data-ext="py" style="--vp-collapsed-lines:15;"><pre><code class="language-python"><span class="line"><span class="token keyword">import</span> heframework</span>
159<span class="line"><span class="token keyword">import</span> sys</span>
160<span class="line"><span class="token keyword">import</span> json</span>
161<span class="line"><span class="token keyword">import</span> os</span>
162<span class="line"><span class="token keyword">import</span> time</span>
163<span class="line"><span class="token keyword">import</span> pyotp</span>
164<span class="line"></span>
165<span class="line"></span>
166<span class="line"><span class="token comment"># 获取令牌</span></span>
167<span class="line"><span class="token keyword">def</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
168<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
169<span class="line">        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No File&quot;</span><span class="token punctuation">)</span></span>
170<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
171<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
172<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>
172load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
173<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
174<span class="line">        <span class="token keyword">if</span> <span class="token keyword">not</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
175<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No Token!&quot;</span><span class="token punctuation">)</span></span>
176<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
177<span class="line">            secure <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
178<span class="line">                mode<span class="token operator">=</span><span class="token string">&quot;json&quot;</span><span class="token punctuation">,</span> json_file<span class="token operator">=</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;选择令牌:&quot;</span><span class="token punctuation">)</span></span>
179<span class="line">            storage <span class="token operator">=</span> pyotp<span class="token punctuation">.</span>TOTP<span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>secure<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
180<span class="line">            win <span class="token operator">=</span> heframework<span class="token punctuation">.</span>refresh_show<span class="token punctuation">(</span>title<span class="token operator">=</span><span class="token string">&quot;令牌&quot;</span><span class="token punctuation">,</span> geometry<span class="token operator">=</span><span class="token string">&quot;200x100&quot;</span><span class="token punctuation">)</span></span>
181<span class="line">            <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
182<span class="line">                t <span class="token operator">=</span> <span class="token number">30</span></span>
183<span class="line">                token_now <span class="token operator">=</span> storage<span class="token punctuation">.</span>now<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
184<span class="line">                <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
185<span class="line">                    code <span class="token operator">=</span> win<span class="token punctuation">.</span>refresh<span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">(</span>token_now<span class="token operator">+</span><span class="token string">&quot;\\n剩余时间&quot;</span><span class="token operator">+</span><span class="token builtin">str</span><span class="token punctuation">(</span>t<span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">&quot;秒&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
186<span class="line">                    t <span class="token operator">-=</span> <span class="token number">1</span></span>
187<span class="line">                    time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
188<span class="line">
188                    <span class="token keyword">if</span> code <span class="token operator">==</span> <span class="token number">21099</span><span class="token punctuation">:</span></span>
189<span class="line">                        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
190<span class="line">                    <span class="token keyword">elif</span> code <span class="token operator">==</span> <span class="token number">20000</span><span class="token punctuation">:</span></span>
191<span class="line">                        <span class="token keyword">pass</span></span>
192<span class="line">                    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
193<span class="line">                        sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
194<span class="line"></span>
195<span class="line"></span>
196<span class="line"><span class="token comment"># 管理令牌</span></span>
197<span class="line"></span>
198<span class="line"><span class="token comment"># 添加</span></span>
199<span class="line"><span class="token keyword">def</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
200<span class="line">    name <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;令牌名称:&quot;</span><span class="token punctuation">)</span></span>
201<span class="line">    secure <span class="token operator">=</span> <span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;令牌Secure:&quot;</span><span class="token punctuation">)</span></span>
202<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
203<span class="line">        <span class="token builtin">file</span> <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
204<span class="line">        dicts <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>name<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>secure<span class="token punctuation">]</span><span class="token punctuation">}</span></span>
205<span class="line">        <span class="token builtin">file</span><span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dicts<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
206<span class="line">        time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
207<span class="line">        <span class="token builtin">file</span><span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
208<span class="line">        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
209<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
210<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
211<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>
211load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
212<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
213<span class="line">        <span class="token keyword">if</span> name <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
214<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Existed!&quot;</span><span class="token punctuation">)</span></span>
215<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
216<span class="line">            <span class="token keyword">if</span> secure <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
217<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Existed!&quot;</span><span class="token punctuation">)</span></span>
218<span class="line">            <span class="token keyword">else</span><span class="token punctuation">:</span></span>
219<span class="line">                file_after <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
220<span class="line">                names <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span></span>
221<span class="line">                secures <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span></span>
222<span class="line">                names<span class="token punctuation">.</span>append<span class="token punctuation">(</span>name<span class="token punctuation">)</span></span>
223<span class="line">                secures<span class="token punctuation">.</span>append<span class="token punctuation">(</span>secure<span class="token punctuation">)</span></span>
224<span class="line">                dict_after <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> names<span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> secures<span class="token punctuation">}</span></span>
225<span class="line">                file_after<span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dict_after<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
226<span class="line">                time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
227<span class="line">                file_after<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
228<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
229<span class="line"></span>
230<span class="line"></span>
231<span class="line"><span class="token comment"># 删除</span></span>
232<span class="line"><span class="token keyword">def</span> <span class="token function">delete</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
233<span class="line">    <span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
234<span class="line">
234        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No file!&quot;</span><span class="token punctuation">)</span></span>
235<span class="line">    <span class="token keyword">else</span><span class="token punctuation">:</span></span>
236<span class="line">        read_only_file <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">)</span></span>
237<span class="line">        dicts <span class="token operator">=</span> json<span class="token punctuation">.</span>load<span class="token punctuation">(</span>read_only_file<span class="token punctuation">)</span></span>
238<span class="line">        read_only_file<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
239<span class="line">        <span class="token keyword">if</span> <span class="token keyword">not</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
240<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;No Token!&quot;</span><span class="token punctuation">)</span></span>
241<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
242<span class="line">            num <span class="token operator">=</span> <span class="token number">0</span></span>
243<span class="line">            <span class="token keyword">for</span> i <span class="token keyword">in</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
244<span class="line">                num <span class="token operator">+=</span> <span class="token number">1</span></span>
245<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span>num<span class="token punctuation">,</span> <span class="token string">&quot;: &quot;</span><span class="token punctuation">,</span> i<span class="token punctuation">)</span></span>
246<span class="line">            choose <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span><span class="token builtin">input</span><span class="token punctuation">(</span><span class="token string">&quot;请输入你要删除的项目:&quot;</span><span class="token punctuation">)</span><span class="token punctuation">)</span></span>
247<span class="line">            <span class="token keyword">if</span> choose <span class="token operator">&gt;=</span> <span class="token number">1</span> <span class="token keyword">and</span> choose <span class="token operator">&lt;=</span> num<span class="token punctuation">:</span></span>
248<span class="line">                names <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">]</span></span>
249<span class="line">                secures <span class="token operator">=</span> dicts<span class="token punctuation">[</span><span class="token string">&quot;return_text&quot;</span><span class="token punctuation">]</span></span>
250<span class="line">                <span class="token keyword">del</span> names<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">(</span>choose<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span></span>
251<span class="line">                <span class="token keyword">del</span> secures<span class="token punctuation">[</span><span class="token builtin">int</span><span class="token punctuation">(</span>choose<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">]</span></span>
252<span class="line">
252                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Successfully!&quot;</span><span class="token punctuation">)</span></span>
253<span class="line">                file_after <span class="token operator">=</span> <span class="token builtin">open</span><span class="token punctuation">(</span><span class="token string">&quot;token.json&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;w&quot;</span><span class="token punctuation">)</span></span>
254<span class="line">                dict_after <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">&quot;name&quot;</span><span class="token punctuation">:</span> names<span class="token punctuation">,</span> <span class="token string">&quot;return_text&quot;</span><span class="token punctuation">:</span> secures<span class="token punctuation">}</span></span>
255<span class="line">                file_after<span class="token punctuation">.</span>write<span class="token punctuation">(</span>json<span class="token punctuation">.</span>dumps<span class="token punctuation">(</span>dict_after<span class="token punctuation">)</span><span class="token punctuation">)</span></span>
256<span class="line">                time<span class="token punctuation">.</span>sleep<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span>
257<span class="line">                file_after<span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
258<span class="line">            <span class="token keyword">else</span><span class="token punctuation">:</span></span>
259<span class="line">                <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
260<span class="line"></span>
261<span class="line"></span>
262<span class="line"><span class="token comment"># 大纲</span></span>
263<span class="line"><span class="token keyword">def</span> <span class="token function">console</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
264<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
265<span class="line">        main <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
266<span class="line">            mode<span class="token operator">=</span><span class="token string">&quot;list&quot;</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">&quot;添加令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;删除令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;退出&quot;</span><span class="token punctuation">]</span><span class="token punctuation">,</span> return_text<span class="token operator">=</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;&gt;&gt;&gt;&quot;</span><span class="token punctuation">)</span></span>
267<span class="line">        <span class="token keyword">if</span> main <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
268<span class="line">            add<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
269<span class="line">
269        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
270<span class="line">            delete<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
271<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span></span>
272<span class="line">            <span class="token keyword">break</span></span>
273<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
274<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
275<span class="line"></span>
276<span class="line"></span>
277<span class="line"><span class="token comment"># main</span></span>
278<span class="line"><span class="token keyword">def</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
279<span class="line">    <span class="token keyword">while</span> <span class="token boolean">True</span><span class="token punctuation">:</span></span>
280<span class="line">        main <span class="token operator">=</span> heframework<span class="token punctuation">.</span>choose<span class="token punctuation">(</span></span>
281<span class="line">            mode<span class="token operator">=</span><span class="token string">&quot;list&quot;</span><span class="token punctuation">,</span> name<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">&quot;获取令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;管理令牌&quot;</span><span class="token punctuation">,</span> <span class="token string">&quot;退出&quot;</span><span class="token punctuation">]</span><span class="token punctuation">,</span> return_text<span class="token operator">=</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">,</span> info<span class="token operator">=</span><span class="token string">&quot;&gt;&gt;&gt;&quot;</span><span class="token punctuation">)</span></span>
282<span class="line">        <span class="token keyword">if</span> main <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">:</span></span>
283<span class="line">            get<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
284<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">:</span></span>
285<span class="line">            console<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
286<span class="line">        <span class="token keyword">elif</span> main <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">:</span></span>
287<span class="line">            sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
288<span class="line">        <span class="token keyword">else</span><span class="token punctuation">:</span></span>
289<span class="line">            <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">&quot;Err&quot;</span><span class="token punctuation">)</span></span>
290<span class="line"></span>
291<span class="line"></span>
292<span class="line"><span class="token keyword">if</span> __name__ <span class="token operator">==</span> <span class="token string">&quot;__main__&quot;</span><span class="token punctuation">:</span></span>
293<span class="line">    main<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
294<span class="line"></span>
295<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div><div class="collapsed-lines"></div></div></details><figure><img src="https://img.hestudio.net/img/2022/12/31/63afe382abec2.png" alt="运行界面" tabindex="0" loading="lazy"><figcaption>运行界面</figcaption></figure>`,38)])])}const i=s(e,[["render",o]]),u=JSON.parse('{"path":"/posts/make-a-python-mfa-app.html","title":"通过Python制作一个MFA验证器","lang":"zh-CN","frontmatter":{"title":"通过Python制作一个MFA验证器","tag":["Python"],"category":["Python"],"description":"我们经常会遇到一些需要é
295ªŒè¯åŠ¨æ€å¯†ç çš„é¡µé¢ï¼Œè¿™ä¸ªæ—¶å€™åœ¨æ‰‹æœºä¸Šæœ‰å¾ˆå¤šæ­¤ç±»çš„ MFA 应用,比如 Microsoft Authenticator,Duo Mobile,谷歌验证器。 那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有,绝不自己做的原则,我们将使用开源模块拼凑而成。","head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"通过Python制作一个MFA验证器\\",\\"image\\":[\\"https://img.hestudio.net/img/2022/12/28/63abc608bb033.png\\",\\"https://img.hestudio.net/img/2022/12/31/63afb45c9805d.jpeg\\",\\"https://img.hestudio.net/img/2022/12/31/63afdb2b5f077.jpg\\",\\"https://img.hestudio.net/img/2022/12/31/63afe382abec2.png\\"],\\"dateModified\\":\\"2025-03-13T06:15:20.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"undefined\\",\\"url\\":\\"https://www.hestudio.net/about/\\",\\"email\\":\\"[email protected]\\"}]}"],["meta",{"property":"og:url","content":"https://www.hestudio.net/posts/make-a-python-mfa-app.html"}],["meta",{"property":"og:site_name","content":"heStudio"}],["meta",{"property":"og:title","content":"通过Python制作一个MFA验证器"}],["meta",{"property":"og:description","content":"我们经常会遇到一些需要验证动态密码的页面,这个时候在手机上有很多此类的 MFA 应用,比如 Microsoft Authenticator,Duo Mobile,谷歌验证器。 那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有,绝不自己做的原则,我们将使用开源模块拼凑而成。"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://img.hestudio.net/img/2022/12/28/63abc608bb033.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"og:updated_time","content":"2025-03-13T06:15:20.000Z"}],["meta",{"property":"article:tag","content":"Python"}],["meta",{"property":"article:modified_time","content":"2025-03-13T06:15:20.000Z"}]]},"git":{"createdTime":1672582104000,"updatedTime":1741846520000},"readingTime":{"minutes":5.01,"words":1504},"filePathRelative":"posts/make-a-python-mfa-app.md","excerpt":"<p>我们经常会遇到一些需要验证动态密码的页面,这个时候在手机上有很多此类的 MFA 应用,比如 Microsoft Authenticator,Duo Mobile,谷歌验证器。</p>\\n<p>那么其实我们也可以自己做一个 MFA 验证器。本着只要网上有,绝不自己做的原则,我们将使用开源模块拼凑而成。</p>\\n<figure><img src=\\"https://img.hestudio.net/img/2022/12/28/63abc608bb033.png\\" alt=\\"\\" tabindex=\\"0\\" loading=\\"lazy\\"><figcaption></figcaption></figure>\\n","autoDesc":true}');export{i as comp,u as data};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.