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程序,可以实函数 ...
随机推荐
- java的枚举2
首先先理解一下java中枚举的本质. java的世界中一切皆是类,下面通过一个例子解释一下enum的本质: package cn.xnchall.enumeration; public class G ...
- 【转】UML的9种图例解析
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中, ...
- java基本语法特殊点
一.关系运算符 instanceof(类型比较运算符) example:a instanceof hello // hello是一个class ==与!=可以用于引用相等运算符( 二.数组 (数组是对 ...
- Scala学习笔记(一)
scala 版HelloWorrld object HelloWorld{ def main(args:Array[String]){ println("Hello World!!!&quo ...
- WordPress修改标签云大小及颜色
修改WordPress标签字体大小: 在cpanel面板中依次打开「wp-includes」→「category-template.php」,找到wp_tag_cloud, 1 2 3 4 5 6 7 ...
- jQuery对于动态生成的元素绑定无效的问题~~
问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...
- Flume - Kafka日志平台整合
1. Flume介绍 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,Flume提供 ...
- Mysql使用规范文档 20180223版
强制:不允许在跳板机上/生产服务器上手工连接,查询或更改线上数据 强制:所有上线脚本必须先在测试环境执行,验证通过以后方可在生产环境执行. 强制:上线脚本的编码格式统一为UTF-8 强制:访问数据库需 ...
- 自己动手写泛型dao
在经过一系列的问题得到解决之后,泛型dao终于写出来了.泛型dao相比于以前写的dao最大的好处就是,大大提高了代码的复用性,以往我们要对数据库中表中的数据进行操作的时候,每张表都需要写一个dao来操 ...
- IntelliJ Idea常用的快捷键
以下是IntelliJ Idea2017版的,基本上不会有什么变化 IntelliJ Idea这个编译器现在非常流行,他强大的快捷键非常好用,相比于eclipse,IntelliJ Idea界面也比e ...