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)的更多相关文章

  1. 手写一个简单的starter组件

    spring-boot中有很多第三方包,都封装成starter组件,在maven中引用后,启动springBoot项目时会自动装配到spring ioc容器中. 思考: 为什么我们springBoot ...

  2. Python使用Socket写一个简单聊天程序

    b2b模式的聊天工具 服务端: # 链接 while True: print('等待连接...') sock,adr = server_socket.accept() while True: try: ...

  3. Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统

    一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...

  4. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  5. 用node.js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  6. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

  7. express 写一个简单的web app

    之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...

  8. 用C写一个简单的推箱子游戏(二)

    下面接着上一篇随笔<用C写一个简单的推箱子游戏(一)>来写 tuidong()函数是用来判断游戏人物前方情况的函数,是推箱子游戏中非常重要的一个函数,下面从它开始继续介绍推箱子的小程序怎么 ...

  9. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

随机推荐

  1. ajax 状态码

    状态码定义 ... 10 信息1xx ... 10.1 100继续 ... 10.1.1 101交换协议 ... 10.1.2 成功的2xx ... 10.2 200 OK ... 10.2.1 20 ...

  2. Get the Job You Want(大学英语综合教程4课文)

    UNIT3-1 Harvey Mackay, who runs his own company, often interviews applicants for jobs. Here he lets ...

  3. 关系型数据库工作原理-事务管理(二)(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  4. JavaScript之事件及动画

    一.事件 常用事件 click(function(){...}) //单击事件 hover(function(){...}) //鼠标经过事件 blur(function(){...}) //失去光标 ...

  5. spring+springMVC 整合 MongoDB 实现注册登录

    发现一入手 MongoDB,便无法脱离,简要说一下,MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 也是在 Nosql 中我最喜欢的一种 ...

  6. 安装Accumulo——突破自己,就是成长

    前言 在我刚开始接触分布式集群的时候,是自己在几台虚拟机中手动安装的 Hadoop 和 Spark ,所以当时对 Hadoop 的配置有个简单的印象 ,但是后面发现了 Cloudera 和 Ambar ...

  7. Java运行时内存划分

    这篇文章可以说是摘抄自周志明的<深入理解Java虚拟机>,但是加上了自己的理解,印象可以更深些. Java虚拟机在执行Java程序的时候会把他所管理的内存划分为若干个不同的数据区域,各个区 ...

  8. 详解小白利用eclipse+CDT+MinGW搭建C++开发环境

    安装JDK.安装Eclipse     2.打开Eclipse 找到“help”下的“Eclipse marketplace” 如图:    3.选择相应的C插件: 因为安装过所以显示installe ...

  9. oracle相同SID对外提供多个service_names

    为数据库设置多个服务名(通过SCOPE=both设置,同时修改参数文件) SQL> show parameter service_names; NAME TYPE VALUE --------- ...

  10. 造轮子-Java泛型堆排

    个人博客地址:http://kyle.org.cn/2018/03/13/heapsort/ Java实现泛型堆排算法,用于N个对象中选择最大或者最小的前M个,其中M<=N 类似于Mysql中o ...