最近开发的一个网站采用的是固定图片验证码,结果被人恶意灌流+恶意注册,导致了一些不必要的消耗,决定稍稍升级一下验证码,给“君子”们加点难度(开源OCR是真的便宜,普通验证码根本挡不住!)引言传统的验证码方法包括图片固定验证码GIF固定验证码拖动验证码行为验证码前两个方法虽然能够在一定程度上防止自动化攻击,但随着OCR技术的发展,这些传统方法的安全性越来越受到挑战。而后两个方法开源的都有破解方案,商业公司的又太贵,与这些方法相比,GIF运算验证码就颇具性价比,通过动态展示公式,大大增加了自动化解析的难度,从而提升了验证码的安全性。环境准备和导入必要的库要开始我们的项目,首先需要准备Python环境,并导入几个关键的库:PIL:Python Imaging Library,提供了强大的绘图以及图像处理能力。io.BytesIO:用于在内存中读写bytes,我们将利用它来生成和存储GIF。random:用来生成随机的数学公式和噪声效果。介绍核心实现流程实现GIF运算验证码的过程可以分为以下几个关键步骤:输出公式的确定: 该步骤通过随机方法生成简单的数学公式,如加法和乘法,确保生成的每个验证码

大盘鸡除了我爸做的小炒鸡丁外这是我吃过的最好吃的有关于鸡的菜。不同于新疆大盘鸡,这款是改良后的菜谱更加适合湖南人,辣中带鲜十分美味。备料一年生嫩鸡半只 1kg以内土豆一个 200g小米椒(朝天椒)20个蒜粒 15粒生姜 一小块红花椒 30颗青花椒 20颗香叶 2片草果 一个八角 两颗白芷 一片(可有可无)灵魂王守义十三香大蒜叶 两根任意面条一份(刀削面最好)先准备好上述材料,然后再跟着下面图片备菜首先处理土豆,将土豆切成滚刀块备用,如图再将鸡剁成二厘米大小的鸡块并洗干净血水,这一步可以叫菜市场大叔代劳,记得叮嘱说是炒鸡用.将 小米椒,蒜粒,生姜 切段切丁大蒜页切段再准备香料,将需要青红花椒,草果,八角这些需要过油的香料装到碗中方便烹饪,香叶,白芷加水后再放入。烹饪起锅烧油到见油出现波纹。转中火,倒入土豆炸至表面金黄捞出备用,过程勤搅动成色如图用剩下的油将鸡炒至表面微黄鸡倒出后不要急着翻动先炸至定型再炒至表面微黄捞出鸡肉用剩下的油将配菜及需要过油的香料炒香后加入鸡肉,翻炒后再加入白芷香叶。随后马上倒入任意品牌的啤酒,我这里是最便宜的雪花加一瓶啤酒,刚好没过鸡肉,啤酒不够就加水然后一勺盐一

想变,无方向无思想无毅力,不如从眼前事情做起。心血来潮翻看了QQ空间,看了以前的留言和说说下的评论,才发现这些年一路走丢了这么多的朋友。QQ空间留言和说说告诉我16-17年大概是我最开心的时候,同时也可能是我最不开心的时候,或许不该用开心来描述,感觉不太准确应该是"故事“比较多的时候。我也不知道为什么那个时候的我那么”有趣“,认识了各路英雄豪杰,多多少少都能聊上几句,生日会互相问候并准备小礼物,过年过节也会互道贺词,没想到我也能记住这么多人的生日,哈哈哈哈哈。貌似是从18年开始我的世界开始与”过去“告别,老朋友失去了联络,网友间的问候也没了下文,貌似是一种默契,互相在对方的好友列表里但是互不打扰问候,活脱脱的新时代的”陌生人“。我也在想究竟是什么让我发生了如此改变,想了许久我觉得答案可能是 ”成长“ 二字,我也觉得这实在是太笼统太复杂了,但是好像只有如此笼统如此复杂的词才能解释我为什么”性情大变“。不想过于深入的追溯为什么断联的原因,只想在未来与以前聊得来的伙伴们互询近况,或许是一条信息,一个电话,一份手写的邮件,哈哈哈。或许在我联系ta的时候,ta会疑惑我是谁,为什么突然找ta,是不

人们常说“以史为鉴,可以知兴替;以人为鉴,可以明得失。”在这里我们不深入探究其深意,只抓住其表面意义,来定义我们今天的主题,分析这悄然逝去又充满机遇的2023,以及即将到来还被“战争迷雾”所笼罩的2024。2023 概况开年不顺及自甘堕落2023年的开局本应是忙碌的工作安排,无数待执行的新年计划,然而我却恰恰相反。刚经历了一场康复期漫长而痛苦的手术,还面临着首次被辞退失业的打击,让我陷入了无所适从的困境中,整日茫然无措。心灵上的打击远比身体上的打击更容易让人自我怀疑。过去,我一直是一个充满自信的人,但这次的裁员让我觉得自己并不是一个不可替代的人,只是一个普通的岗位上的螺丝钉,顶多是个能自我调整的高级螺丝钉。这一度让我的自信心跌入谷底,因此我开始刻意回避找工作这个话题,并陷入了长达4个月的自暴自弃中,沉迷于游戏世界。幡然醒悟,好运常在三月底,由于过度沉迷游戏和失业导致的经济问题,我与老秦大吵了一架。幸运的是这场吵架让我彻底清醒过来,急迫感瞬间充斥心头。手机上正在跑动的游戏人物仿佛也失去了原本的活力和魅力。这几个月的失业,再加上手术和康复期间的开支,让原本并不富裕的存款所剩无几,现在回想起

1. 获取超级管理员权限首先,我们需要获取超级管理员权限,执行以下命令:sudo -i2. 设置用户权限将username替换为你的用户名,执行以下命令,将用户添加到/etc/sudoers.d/root文件中:echo ‘username ALL=(ALL:ALL) NOPASSWD:ALL’ | sudo tee -a /etc/sudoers.d/root3. 开启超权限登录接下来,我们需要修改/etc/ssh/sshd_config文件,开启超权限登录。执行以下命令:sudo sed -i -e ‘s/#PermitRootLogin prohibit-password/PermitRootLogin yes/g’ -e ‘s/#PasswordAuthentication yes/PasswordAuthentication yes/g’ /etc/ssh/sshd_config4. 为用户设置密码将username替换为你的用户名,将password替换为你的密码,执行以下命令设置用户密码:echo username:password| chpasswd5. 重启SSH服务

Linux 2023-08-27

这个脚本可以让你方便地更改系统时区,而不需要手动修改配置文件。首先,脚本会列出所有可用的大洲,让你选择你所在的大洲。然后,它会列出该大洲下所有可用的时区,让你选择你所在的时区。接着,脚本会备份旧的时区文件,并创建新的时区链接。最后,它会获取当前时间和新时区的时间偏移量,计算时间差,并设置系统时间。这个脚本非常方便实用,让你可以轻松地更改系统时区。如果你需要更改时区,只需要运行这个脚本,按照提示进行选择即可。脚本vim change_timezone.sh #!/bin/bash function list_timezones_by_continent() { continent=$1 echo "List of available time zones:" timedatectl list-timezones | grep "^$continent/" } echo "List of available continents:" echo "1. Africa" echo "2.

Linux 2023-06-06

服务端下载frp并解压cd /home wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz tar -xzvf frp_0.48.0_linux_amd64.tar.gz修改配置 vim /home/frp_0.48.0_linux_amd64/frps.ini[common] bind_port = 7000 dashboard_port = 7500 token = asdasdahwuih # 请随机 dashboard_user = tioit # 请设置 dashboard_pwd = tioit # 请设置配置服务# yum yum install systemd # apt apt install systemd vim /etc/systemd/system/frps.service写入启动命令[Unit] # 服务名称,可自定义 Description = frp server After = network.target sysl

Linux 2023-04-24

摘要:本文将指导你如何在Ubuntu系统上搭建Python3和Node.js开发环境。这两个环境在软件开发领域中非常受欢迎,无论是构建网站、应用程序还是其他类型的项目。安装Node.js和npm首先,你需要在Ubuntu上安装Node.js和npm。Node.js是一个用于构建服务器端和网络应用程序的JavaScript运行时环境。npm是Node.js的默认包管理器,用于安装、共享和管理Node.js项目中使用的代码模块。打开终端并运行以下命令:sudo apt install nodejs npm接下来,安装n模块来管理Node.js版本:sudo npm install n -g现在,安装最新的稳定版Node.js:sudo n stable安装Python3和pip要在Ubuntu上安装Python3,只需运行以下命令:sudo apt install python3接下来,安装Python包管理器pip:sudo apt install python3-pip设置pip源在/home目录下创建一个.pip文件夹,并进入文件夹创建pip.conf配置文件mkdir ~/.pip

Linux 2023-04-22

在vs code中安装插件Remote Development首先,您需要在VSCode中安装Remote Development插件。这将允许您通过SSH连接到远程服务器并在VSCode中进行远程开发。连接到远程服务器点击VSCode右下角的连接按钮。选择remote-ssh选项。选择Add New SSH Host。按照格式输入连接信息:ssh username@ip:port,例如:ssh [email protected]。输入连接密码即可。开启密钥登录以提高安全性和便利性为了避免掉线等问题导致频繁输入密码,我们需要开启密钥登录。要在Ubuntu中开启密钥登录,您需要遵循以下步骤:在本地计算机上创建SSH密钥对(如果尚未创建):打开终端并输入以下命令:ssh-keygen # 一直按回车即可,也可以选择自定义密钥的名称和位置。将公钥上传到远程服务器:使用以下命令将公钥复制到远程服务器(将your_username和remote_host替换为实际值):ssh-copy-id your_username@remote_host # 如果报错请执行 function ssh-c

简介:在本篇博客中,我们将探讨如何使用双指针滑动窗口方法解决一个常见的字符串问题:找到给定字符串中最长无重复字符的子串长度。我们将介绍两个解决方案:通用模板版本和优化版本。问题描述:给定一个字符串,找到其中最长的无重复字符的子串。返回其长度。示例: 输入:s = "abcabcbb" 输出:3 解释:最长无重复子串为 "abc",长度为 3。解法1:双指针滑动窗口通用版本在这个解法中,我们使用双指针滑动窗口方法,同时维护一个列表str_list来存储窗口内的字符。快指针(right)遍历整个字符串,慢指针(left)始终在快指针的左侧。当遇到新字符时,将其添加到str_list中;当遇到重复字符时,将慢指针所指字符从str_list中移除,并将慢指针向右移动。在遍历过程中,我们不断更新最长无重复子串的长度。class Solution: def lengthOfLongestSubstring(self, s: str) -> int: str_list = [] left, right, res

简介:在这篇博客中,我们将学习如何使用Python的PIL库来制作简单的图片。PIL库(Python Imaging Library)是一个强大的图像处理库,可以让我们轻松地创建、编辑和保存图像。步骤1:安装PIL库首先,我们需要安装PIL库。打开终端或命令提示符,输入以下命令:pip install pillow步骤2:导入库并设置参数在Python脚本中,我们需要导入PIL库中的Image, ImageDraw和ImageFont模块。接着,设置图片的宽度、高度、背景颜色和字体颜色,文字内容。from PIL import Image, ImageDraw, ImageFont background_color = '#f1f2f6' font_color ='black' width, height = 170, 130 text1 = "两数之和" text2 = "LeetCode"步骤3:创建图片并绘制文本使用Image.new()函数创建一个新的图片对象,并使用ImageDraw.Draw()函数创建一个绘图对象。然后,设置文本的

Python 2023-04-12

1.两数之和from typing import List class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: """ 【空间换时间】 哈希表解法,将值与下标存在哈希表内,遍历时拿和值-当前值=目标值 再判断目标值是否存在哈希表中,如果存在直接返回 Args: nums (List[int]): _description_ target (int): _description_ Returns: List[int]: _description_ """ map = {} for index, value in enumerate(nums): result = targ

将扁平结构转换为树形结构在前端开发的过程中免不了要处理各种展示树结构的场景,后端往往是返回一整个列表让前自己处理,这里我基于 JS 和 TS 分别实现了此功能JavaScriptconst sourceList = [ { id: 1, name: 'A', parent_id: null }, { id: 2, name: 'B', parent_id: 1 }, { id: 3, name: 'C', parent_id: 1 }, { id: 4, name: 'D', parent_id: 2 }, { id: 5, name: 'E', parent_id: 2 }, { id: 6, name: 'F', parent_id: 3 }, ]; function buildTree(sourceList, parent_id = null) { const treeList = []; for (const item of sourceList) { if (parent_id === item.parent_id) {

前端 2023-04-04

在现代软件中我们对数据的重视程度逐渐提高,数据可谓是现代软件的灵魂,这导致我们在删除数据时不能是真正意义上的删除数据而是一种逻辑删除也叫软删除,接下来我们就来用Python实现软删除软删除 V1.0class TestModel(Model): name = models.CharField(max_length=50, null=True, verbose_name='更新人') is_valid = models.BooleanField(default=True, verbose_name='数据有效/无效', db_index=True) xm = TestModel.objects.create({'name':'小明'}) xl = TestModel.objects.create({'name':'小刘'}) TestModel.objects.count() # 2 xl.is_valid= False TestModel.objects.filter(is_valid=True).count() # 1如上操作我们就实现了最基础的数据软

Python 2023-04-04

摘要:本文介绍了如何使用Python实现一个基于Trie Tree的敏感词过滤器。我们将通过创建一个Trie树数据结构,向其中插入敏感词,然后检查给定文本是否包含这些敏感词。这是一种高效的文本过滤方法,可以用于各种应用场景。在处理文本数据时,我们可能需要检查文本中是否包含敏感词。这在诸如论坛、评论系统等需要内容审查的场景中尤为重要。本文将介绍如何使用Python实现一个基于Trie Tree的敏感词过滤器。定义 Trir Tree首先,我们需要创建一个Trie树数据结构。Trie树是一种用于存储字符串的树形结构,它可以高效地查询字符串是否存在于树中。为了实现Trie树,我们需要创建一个表示Trie节点的类,如下所示:class TrieNode: def __init__(self): self.children = {} self.is_end_of_word = False接下来,我们创建一个表示整个Trie树的类。这个类包含一个根节点,以及用于向树中插入字符串和搜索字符串的方法。class Trie: def __init__(se

Python 2023-04-03

递归实现class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: # 都结束了末尾节点就为None if l1 == None and l2 == None: return None # 补齐 [9,9,9,9] + [9] 的情况 if l1 == None: l1=ListNode(0) if l2 == None: l2= ListNode(0) # 值加 sum = l1.val + l2.val

在开发中我们极有可能遇到以下情况金额流水表 tab_money_streamIdMoneyIsPositivepush_datetimeuuid10f2020-11-11uuid5t2020-11-11这个时候我们需要统计某个用户某天一共赚了多少钱,这个时候我们使用sql来完成这件事情是非常简单的,如下:select sum( case is_positive when true then `money` else 0 end)- sum( case is_positive when false then `money` else 0 end) as balance from tab_money_stream where to_char(push_datetime, 'YYYY-MM-DD') = '2020-11-1

Python 2023-04-01

Pycharm设置新建文件的文件头在Python2的开发中我们通常需要在文件头部加入文件头:#!/usr/bin/env python # -*- coding: utf-8 -*-用于避免默认ascii编码对中文注释不支持导致的报错在Pycharm中有对应的设置可以直接让文件在生成时自动插入特定的文件头设置路径如下:file-->settings-->editor-->file and code templates示例模板内容#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : ${DATE} ${HOUR}:${MINUTE} # @Author : ThisIsAuthorName # @File : ${NAME}.py # @Software: PyCharm 2023.1可选模板参数${DATE} 当前系统日期 ${DAY} 每月的当前日期 ${DS} 美元符号$。此变量用于转义美元字符,使其不被视为模板变量的前缀。 ${FILE_NAME} 新文件的名称。

Python 2023-03-08

在处理数据时,我们经常需要将扁平结构(如数据库表中的数据)转换为树形结构。这种转换在许多场景中都非常有用,例如构建层级菜单、组织结构图或者文件系统。在本文中,我们将介绍如何使用 Python 将给定的扁平数据列表转换为树形结构。首先,我们需要一个包含节点信息的列表。列表中的每个元素都应包含一个 parent_id 属性,表示其父节点。为了简化示例,我们假设列表中的元素是字典,如下所示:source_list = [ {'id': 1, 'name': 'A', 'parent_id': None}, {'id': 2, 'name': 'B', 'parent_id': 1}, {'id': 3, 'name': 'C', 'parent_id': 1}, {'id': 4, 'name': 'D', 'parent_id': 2}, {'id': 5, 'name': 'E', 'parent_id': 2}, {'id': 6, 'name': 'F', 'parent_id': 3}, ]现在,我们将实现一个名为 build_tre

Python 2023-02-07