为了解决微信排版导致Markdown内容格式错乱的问题,笔者不得不将费心创作的教程公开至个人网站,方便付费用户阅读原汁原味的原版教程(主要是有动图,打印成PDF还是不够完美)。但是,另一个问题随之而来,那就是公开意味着免费,付费用户岂不成了冤大头?
为了维护付费用户的尊严,笔者特地基于Staticrypt(Nodejs)和nodejs_wheel(Python)实现(套壳)了一个网页加密器,可将普通网页变成需要输入密码的网页(无需后端,纯前端),这样就能让付费用户觉得钱没白花(付费才能解锁)。
网页加密器界面采用最简单的tkinter界面(有点丑陋,只有几个对话框),只做了部分参数的交互输入功能(其他参数的没时间弄)。
生成的加密网页体积会膨胀,但是密码存储在内部,无需后端即可使用。虽然密码无法保证百分比安全,但一般的小白还是只能乖乖付费,这就足够了。
加密器还能生成免密分享码,格式为#staticrypt_pwd={分享码},追加到URL之后,刷新访问可以跳过输入密码的界面。
安装使用方法,使用uv初始化项目(uv sync),然后执行运行加密程序.bat(或者在虚拟环境中运行python main.py),所需的Nodejs库会自动安装。
最后感谢以下项目提供的工具、接口:
代码如下:
[Python] 纯文本查看 复制代码from nodejs_wheel import npx,npm
from tkinter.filedialog import askopenfilenames
from tkinter.simpledialog import askstring
from tkinter.messagebox import askyesno
import os,sys
# 预定义的配置变量
# 输出目录
dist = 'dist/'
# 是否显示生成分享码的选择对话框
share_show = True
# 是否生成分享码
share = True
def main():
# 配置文件名
config = dist+'config.json'
# 选择要加密的网页
file_names = askopenfilenames(
title='选择要加密的网页(支持多选)',
filetypes=[
['网页文件', '*.html'],
]
)
if not file_names:
sys.exit()
config = dist+os.path.basename(file_names[0])+'.json'
# 检查Nodejs依赖
if npm(['ls','staticrypt']):
npm(['install','staticrypt'])
print('所需的Nodejs依赖已安装。')
# 界面显示的内容(可修改)
args = [
'staticrypt',
'--remember','1',
'-d',dist,
'--template-button','解密',
'--template-error','密码错误',
'--template-placeholder','请输入密码',
'--template-remember','24小时内访问无需密码',
'--template-title','正在访问加密的网页',
'--template-toggle-hide','隐藏明文',
'--template-toggle-show','显示明文',
'--template-instructions','无分享码或者分享码过期,可输入密码或者使用新的分享码打开。密码、分享码由网页生成者提供。',
'-c',config,'--short'
]
# 如果输出目录有上次的配置文件,证明没有生成免密分享码,需要询问是否只生成分享码
generate_share_code = False
if os.path.exists(config):
generate_share_code = askyesno(
title='发现同名配置文件',
message='上次该文件没有生成免密分享码,是否生成?',
detail='选择不加密网页,输入原密码可生成免密分享码;\n选择将加密网页,并二次确认是否生成免密分享码',
)
# 密码
password = askstring(
title = '输入密码',
prompt = '请输入原密码,用于生成免密分享码:' if generate_share_code else '请指定密码(留空则退出程序):',
show='*',
initialvalue=''
)
if not password:
sys.exit()
if not generate_share_code:
if password:
args_ext = ['-p',password]
args.extend(args_ext)
args.extend(file_names)
npx(args=args,return_completed_process=True)
if share_show:
share = askyesno(
title='删除配置文件',
message='是否生成免密分享码并删除配置文件?',
detail='选择将生成,并"删除"配置文件;\n选择不生成,同时"保存"配置文件',
)
if share:
args_share = [
'staticrypt','--share','--share-remember','--remember','1','--short','-c',config
]
args_ext = ['-p',password]
args_share.extend(args_ext)
args_share.extend(file_names)
npx(args=args_share,return_completed_process=True)
print(f'{"免密分享码已生成" if generate_share_code and share else ('未生成免密分享码,仅保存配置文件' if generate_share_code else "网页加密完成,可在输出目录查看加密后的同名文件")}{",请妥善保存上面的免密分享码" if share else "和用于生成免密分享码的配置文件"}。')
if share:
os.remove(config)
os.system('pause')
if __name__ == '__main__':
main()
想要正常使用的话,需要创建dist文件夹,安装nodejs_wheel,或者使用我的项目文件:
staticrypt_uv_py.zip
(30.5 KB, 下载次数: 20, 售价: 5 CB吾爱币)
2025-8-19 17:30 上传
点击文件名下载附件
运行截图:

最后附上生成的加密网页截图:
