python安装及写一个简单的验证码组件(配合node)
1.安装Python
到官网下载响应系统的版本(这里以windows为例):https://www.python.org/downloads/windows/
然后就是不断地“下一步”
2.运行
要想node那样可以在命令行运行,要首先配置好系统的全局环境变量:
win10为例:“此电脑”--->“属性”--->“高级系统设置”--->“高级”下的“环境变量”--->找到“path”--->添加两个变量(python的安装目录和这个目录下的Scripts)
打开cmd,打python就可以运行了,同时python包管理器pip也可以运行了
3.开发验证码组件
先下载pillow库:
pip install pillow
photo.py:
# 引入pillow库
from PIL import Image,ImageDraw,ImageFont
# 引入randint用于生成随机int
from random import randint
# 引入sys
import sys w = int(sys.argv[1])
h = int(sys.argv[2])
fs = int(sys.argv[3])
s = sys.argv[4] # 用PIL的Image创建画布(颜色模式,(宽,高),(颜色对应最大取值))
img = Image.new('RGB',(w,h),(255,255,255)) # 用PIL的ImageDraw创建画笔gd
gd = ImageDraw.Draw(img) # 循环把文字输出
for i in range(len(s)):
# for下面记得缩进,不然报错
# 画文字
gd.text(
# 起始坐标点
(i*w/len(s)+randint(8,15),(h-fs)/2+randint(-5,5)),
# 要画的文字
s[i],
# 颜色
(randint(0,255),randint(0,255),randint(0,255)),
# 字体
ImageFont.truetype("C:\\Windows\\Fonts\\BuxtonSketch.ttf",fs)
) for i in range(20):
# for下面记得缩进,不然报错
# 画线
gd.line(
# 起点和终点 坐标点
(randint(0,w),randint(0,h),randint(0,w),randint(0,h)),
# 颜色
(randint(0,255),randint(0,255),randint(0,255)),
# 线宽度
1
) for i in range(int(w*h/200)):
# for下面记得缩进,不然报错
# 画点
gd.point(
# 坐标
(randint(0,w),randint(0,h)),
# 颜色
(randint(0,255),randint(0,255),randint(0,255))
) # 保存图片
img.save('1.png','PNG')
运行命令如:
python photo.py sdfs
就会生成 宽高200,100 字体50 内容为“sdfs”的验证码
4.配合node使用
const koa = require('koa')
const koaRouter = require('koa-router')
const cp = require('child_process')
const fs = require('fs')
const static = require('koa-static') const server = new koa()
server.listen(8088) const r = new koaRouter()
server.use(r.routes()) r.get('/verify_code', async ctx => {
let {w,h,fs} = ctx.query
w = w ? w : 200
h = h ? h : 100
fs = fs ? fs : 50
let seeds = 'abcdefghijklimnopqrstuvwxyzABCDEFGHIJKLMNOPQRST2345678'
let arr = []
for(let i=0;i<5;i++) {
arr.push(seeds[parseInt(seeds.length*Math.random())])
}
let data = await newVerify(w,h,fs,arr.join('')).catch(e=>{})
ctx.body = data
}) function newVerify(w,h,fontSize,str) {
return new Promise(async (resolve,reject)=> {
cp.exec(`python photo.py ${w} ${h} ${fontSize} ${str}`, err => {
if(err) {
reject()
}
fs.readFile('./1.png', (err, data) => {
if(err) {
reject()
} else {
resolve(data)
}
})
})
})
} server.use(static('./www'))
python安装及写一个简单的验证码组件(配合node)的更多相关文章
- 手写一个简单的starter组件
spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...
- Python使用Socket写一个简单聊天程序
b2b模式的聊天工具 服务端: # 链接 while True: print('等待连接...') sock,adr = server_socket.accept() while True: try: ...
- Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统
一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
- 如何写一个简单的shell
如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...
- express 写一个简单的web app
之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...
- 用C写一个简单的推箱子游戏(二)
下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
随机推荐
- Docker下redis的主从、持久化配置
Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...
- javaScript执行环境、作用域链与闭包
一.执行环境 执行环境定义了变量和函数有权访问的其他数据,决定了他们各自的行为:每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.虽然我们编写的代码无法访问这个对象 ...
- OSI模型和TCP/IP协议族(三)
TCP/IP协议族 TCP/IP协议族的开发要比OSI模型更早,因此TCP/IP协议族的分层结构无法准确地与OSI模型一一对应.原始的TCP/IP协议族定义为建立再硬件基础上的四个软件层,不通过目前T ...
- python web开发-flask中的url带斜线和不带斜线区别详解
通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url&qu ...
- JavaScript编码规范(1)
参考的是百度公司的JS规范,分为两部分.这是第一部分 [建议] JavaScript 文件使用无 BOM 的 UTF-8 编码. 空格 [强制] 二元运算符两侧必须有一个空格,一元运算符与操作对象之间 ...
- 如何配置springboot一访问服务器本地图片
大家好,之前写过一篇配置tomcat访问服务器本地资源的,但现在使用了springboot内嵌tomcat\jeyyt后,怎么来访问本地资源呢? 打好springboot框架后,在applicatio ...
- java--计时器
计时器 一.窗口化 public class Pro extends JFrame{ private JTextField textField = new JTextField(45);//系统时间文 ...
- 理解python的元类
看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创 ...
- 读headFirst设计模式 - 工厂模式
每次写博客都不知道要怎么引入要写的主题,挺头疼的一件事.今天就直接开门见山,今天要学的就是工厂模式,工厂就是批量生产制造东西的地方.在这里,工厂就是批量生产对象的地方. 学习书上的例子 假如你现在有一 ...
- Linux下面如何用tcpdump抓包
很多时候我们的系统部署在Linux系统上面,在一些情况下定位问题就需要查看各个系统之间发送数据报文是否正常,下面我就简单讲解一下如何使用tcpdump抓包 tcpdump是Linux下面的一个开源的抓 ...