Python 生成便签图片

最近有文字转图片的需求,但是不太想下载 APP,就使用 Python Pillow 实现了一个,效果如下: PIL 提供了 PIL.ImageDraw.ImageDraw.text 方法,可以方便的把文字写到图片上,简单示例如下: from PIL import Image, ImageDraw, ImageFont # get an image base = Image.open('Pillow/Tests/images/hopper.png').convert('RGBA') # make a blank image for the text, initialized to transparent text color txt = Image.new('RGBA', base.size, (255,255,255,0)) # get a font fnt = ImageFont.truetype('Pillow/Tests/fonts/FreeMono.ttf', 40) # get a drawing context d = ImageDraw.Draw(txt) # draw text, half opacity d.text((10,10), "Hello", font=fnt, fill=(255,255,255,128)) # draw text, full opacity d.text((10,60), "World", font=fnt, fill=(255,255,255,255)) out = Image.alpha_composite(base, txt) out.show() 为什么要计算文字的宽高呢?把文字直接写到背景图不可以么? ...

2018-07-08 · 3 min · 469 words

newrelic python agent 源码分析-1

Newrelic 是APM(Application Performance Management)(应用性能管理/监控)解决方案提供商。项目中,通常用它来追踪应用的性能。最近看了一下 newrelic-python-agent 源码,这是查看源码过程中的一些记录。 目录结构 newrelic 目录结构如下: newrelic ├── admin # 常用命令 ├── api # 探针 ├── bootstrap ├── common ├── core ├── extras │ └── framework_django │ └── templatetags ├── hooks # 数据库 web 各个库的一些探针 │ ├── framework_tornado │ ├── framework_tornado_r3 │ └── framework_tornado_r4 ├── network ├── packages │ ├── requests │ │ └── packages │ │ ├── chardet │ │ └── urllib3 │ │ ├── packages │ │ │ └── ssl_match_hostname │ │ └── util │ └── wrapt └── samplers 命令 使用 newrelic-admin help 可以列出所有命令: ...

2018-05-16 · 3 min · 509 words

小程序开发:上传图片到腾讯云

这是小程序开发第二篇,主要介绍如何上传图片到腾讯云,之所以选择腾讯云,是因为腾讯云免费空间大😂 准备工作 上传图片主要是将图片上传到腾讯云对象存储(COS)。 要使用对象存储 API,需要先执行以下步骤: 购买腾讯云对象存储(COS)服务 在腾讯云 对象存储控制台 里创建一个 Bucket 在控制台 个人 API 密钥 页面里获取 AppID、SecretID、SecretKey 内容 编写一个请求签名算法程序(或使用任何一种服务端 SDK) 计算签名,调用 API 执行操作 所以我们要做的准备工作有: 进入腾讯云官网,注册帐号 登录云对象存储服务(COS)控制台,开通COS服务,创建资源需要上传的Bucket 在小程序官网上配置域名信息(否则无法在小程序中发起对该域名的请求) 这些配置过程这里就不做说明了,接下来主要介绍步骤4、5。 小程序上传图片到 cos 流程如下图: 在这个过程中我们需要实现的是,鉴权服务器返回签名的步骤以及小程序的相关步骤。 COS鉴权服务 使用对象存储服务 COS 时,可通过 RESTful API 对 COS 发起 HTTP 匿名请求或 HTTP 签名请求,对于签名请求,COS 服务器端将会进行对请求发起者的身份验证。 匿名请求:HTTP 请求不携带任何身份标识和鉴权信息,通过 RESTful API 进行 HTTP 请求操作。 签名请求:HTTP 请求时添加签名,COS服务器端收到消息后,进行身份验证,验证成功则可接受并执行请求,否则将会返回错误信息并丢弃此请求。 腾讯云COS对象存储,基于密钥 HMAC (Hash Message Authentication Code) 的自定义 HTTP 方案进行身份验证。 上传图片是一个签名请求,需要进行签名验证。之所以我们 签名流程 客户通过对 HTTP 请求进行签名,并将签名后的请求发送至腾讯云进行签名验证,具体流程如下图所示。 我们使用 sdk 开发,这个流程大致了解下就行,签名的实现 sdk 已经包含,只需要调用方法即可。 ...

2017-08-27 · 3 min · 461 words

小程序开发:python sanic 实现小程序登录注册

开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步。这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案。 微信小程序登录时序图如下: 这个流程分为两大部分: 小程序使用 wx.login() API 获取 code,调用 wx.getUserInfo() API 获取 encryptedData 和 iv,然后将这三个信息发送给第三方服务器。 第三方服务器获取到 code、encryptedData和 iv 后,使用 code 换取 session_key,然后将 session_key 利用 encryptedData 和 iv 解密在服务端获取用户信息。根据用户信息返回 jwt 数据,完成登录。 下面我们先看一下小程序提供的 API。 小程序登录 API 在这个授权登录的过程中,用到的 API 如下: wx.login wx.getUserInfo wx.chekSession 是可选的,这里并没有用到。 wx.login(OBJECT) 调用此接口可以获取登录凭证(code),以用来换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)。 如果接口调用成功,返回结果如下: 参数名 类型 说明 errMsg String 调用结果 code String 用户允许登录后,回调内容会带上 code(有效期五分钟),开发者需要将 code 发送到开发者服务器后台,使用code 换取 session_key api,将 code 换成 openid 和 session_key code 换取 session_key 开发者服务器使用登录凭证 code 获取 session_key 和 openid。其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。所以这一步应该在服务器端实现。 ...

2017-07-30 · 5 min · 929 words

微信公号DIY:MongoDB 简易ORM & 公号记账数据库设计

前两篇 微信公号DIY 系列: 微信公号DIY:一小时搭建微信聊天机器人 微信公号DIY:训练聊天机器人&公号变身图片上传工具 介绍了如何使用搭建&训练聊天机器人以及让公号支持图片上传到七牛,把公号变成一个七牛图片上传客户端。这一篇将继续开发公号,让公号变成一个更加实用的工具账本(理财从记账开始)。 代码: 项目代码已上传至github,地址为gusibi/momo:https://github.com/gusibi/momo HUGOMORE42 账本功能 账本是一个功能比较简单应用,公号内只需要支持: 记账(记账,修改金额,取消记账) 账单统计(提供数据和图片形式的统计功能) 当然后台管理功能就比较多了,这个以后再介绍。 对于数据存储,我选择的是MongoDB(选MongoDB的原因是,之前没用过,想试一下),我们先看下MongoDB和关系型数据库的不同。 MongoDB 什么是MongoDB ? MongoDB 是由C++语言编写的,是一个开放源代码的面向文档的数据库,易于开发和缩放。 mongo和传统关系数据库的最本质的区别在那里呢?MongoDB 是文档模型。 关系模型和文档模型的区别在哪里? 关系模型需要你把一个数据对象,拆分成零部件,然后存到各个相应的表里,需要的是最后把它拼起来。举例子来说,假设我们要做一个CRM应用,那么要管理客户的基本信息,包括客户名字、地址、电话等。由于每个客户可能有多个电话,那么按照第三范式,我们会把电话号码用单独的一个表来存储,并在显示客户信息的时候通过关联把需要的信息取回来。 而MongoDB的文档模式,与这个模式大不相同。由于我们的存储单位是一个文档,可以支持数组和嵌套文档,所以很多时候你直接用一个这样的文档就可以涵盖这个客户相关的所有个人信息。关系型数据库的关联功能不一定就是它的优势,而是它能够工作的必要条件。 而在MongoDB里面,利用富文档的性质,很多时候,关联是个伪需求,可以通过合理建模来避免做关联。 MongoDB 概念解析 在mongodb中基本的概念是文档、集合、数据库,下表是MongoDB和关系型数据库概念对比: SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table collection 数据库表/集合 row document 数据记录行/文档 column field 数据字段/域 index index 索引 table joins 表连接,MongoDB不支持 primary key primary key 主键,MongoDB自动将_id字段设置为主键 通过下图实例,我们也可以更直观的的了解Mongo中的一些概念: 接下来,我从使用的角度来介绍下如何使用 python 如何使用MongoDB,在这个过程中,我会实现一个简单的MongoDB的ORM,同时也会解释一下涉及到的概念。 简易 Python MongoDB ORM python 使用 mongodb 首先,需要确认已经安装了 PyMongo,如果没有安装,使用以下命令安装: pip install pymongo # 或者 easy_install pymongo 详细安装步骤参考: PyMongo Installing / Upgrading ...

2017-07-16 · 4 min · 659 words

微信公号DIY:训练聊天机器人&公号变身图片上传工具

上一篇 一小时搭建微信聊天机器人 介绍了如何搭建一个可用的聊天机器人,但是和机器人聊完你会发现,聊天机器人实在是太傻了,来回就那么几句。这是因为我们给聊天机器人的数据太少,他只能在我们给的训练集中找它认为最合适的。那么,如何导入更多的训练数据呢? 我能想到最简单的方法是找对话的数据,然后把这些数据作为训练数据训练机器人。 感谢 candlewill 已经收集好了大量的训练数据,dialog_corpus https://github.com/candlewill/Dialog_Corpus 。 HUGOMORE42 这个库中包含电影台词、中英文短信息、自然语言处理相关的数据集、小黄鸡语料等。这里我选择电影台词语料。 语料地址为:dgk_lost_conv:https://github.com/rustch3n/dgk_lost_conv chatterbot 训练逻辑处理模块 这个模块提供训练机器人的方法,chatterbot自带了通过输入list来训练([“你好”, “你好啊”] 后者是前者的回答)以及通过导入Corpus格式文件来训练的方式。 这里我们选择使用第一种,通过输入list来训练机器人。 处理训练数据 首先下载数据集: wget https://codeload.github.com/rustch3n/dgk_lost_conv/zip/master # 解压 $ unzip dgk_lost_conv-master.zip 我们先打开一个文件看下数据结构: E M 你得想想办法 我弟弟是无辜的 M 他可是美国公民啊 M 对此我也无能为力 M 你当然能 M 再去犯罪现场看看 定能证实清白 M 你看 我不过是个夜间办事员而已 M 你若真想解决问题 M 最好等领事来 M 他早上才上班 M 我很抱歉 E M 那我自己来搞定 M 你兄弟 M 关在哪个监狱? M 索纳监狱 E M 怎么了? M 那里关的都是最穷凶极恶的罪犯 M 别的监狱都不收 .conv 语料文件中:E 是分隔符 M 表示会话。因为我是使用输入list 的方式训练数据,这时我可以以分隔符E为分隔,将一段对话放入一个list中,那么上述例子中的训练数据应该被格式化为: ...

2017-07-08 · 3 min · 571 words

微信公号DIY:一小时搭建微信聊天机器人

最近借用了女朋友的公号,感觉如果只是用来发文章,太浪费微信给提供的这些功能了。想了想,先从最简单的开始,做一个聊天机器人吧。 使用Python实现聊天机器人的方案有多种:AIML、chatterBot以及图灵聊天机器人和微软小冰等。 考虑到以后可能会做一些定制化的需求,这里我选择了chatterBot(github 项目地址:https://github.com/gunthercox/ChatterBot)。 chatterbot是一款python接口的,基于一系列规则和机器学习算法完成的聊天机器人。具有结构清晰,可扩展性好,简单实用的特点。 HUGOMORE42 chatterBot 的工作流程如图: 输入模块(input adapter)从终端或者API等输入源获取数据 输入源会被指定的逻辑处理模块(logic Adapter)分别处理,逻辑处理模块会匹配训练集中已知的最接近输入数据句子A,然后根据句子A去找到相关度最高的结果B,如果有多个逻辑处理模块返回了不同的结果,会返回一个相关度最高的结果。 输出模块(output adapter)将匹配到的结果返回给终端或者API。 值得一说的是chatterBot 是一个模块化的项目,分为 input Adapter、logic Adapter、storage Adapter、output Adapter以及Trainer 模块。 logic Adapter是一个插件式设计,主进程在启动时会将用户定义的所有逻辑处理插件添加到logic context中,然后交MultiLogicAdapter 进行处理,MultiLogicAdapter 依次调用每个 logic Adapter,logic Adapter 被调用时先执行can_process 方式判断输入是否可以命中这个逻辑处理插件。比如”今天天气怎么样“这样的问题显然需要命中天气逻辑处理插件,这时时间逻辑处理插件的can_process 则会返回False。在命中后logic Adapter 负责计算出对应的回答(Statement对象)以及可信度(confidence),MultiLogicAdapter会取可信度最高的回答,并进入下一步。 下面我们来看下 chatterBot 如何使用 chatterBot 安装&使用 安装 chatterBot 是使用Python编写的,可以使用 pip 安装: pip install chatterbot chatterBot 的中文对话要求Python3 以上版本,建议在Python3.x 环境下开发 测试 打开iPython,输入测试一下 In [1]: from chatterbot import ChatBot # import ChatBot In [2]: momo = ChatBot('Momo', trainer='chatterbot.trainers.ChatterBotCorpusTrainer') /Users/gs/.virtualenvs/py3/lib/python3.6/site-packages/chatterbot/storage/jsonfile.py:26: UnsuitableForProductionWarning: The JsonFileStorageAdapter is not recommended for production environments. self.UnsuitableForProductionWarning # 这里storage adapter 默认使用的是 json 格式存储数据的,如果想在服务端部署,应该避免使用这种格式,因为实在是太慢了 In [3]: momo.train("chatterbot.corpus.chinese") # 指定训练集,这里我们使用中文 # 下边是对话结果 In [4]: momo.get_response('你好') Out[4]: <Statement text:你好> In [5]: momo.get_response('怎么了') Out[5]: <Statement text:没什么.> In [6]: momo.get_response('你知道它的所有内容吗?') Out[6]: <Statement text:优美胜于丑陋.> In [7]: momo.get_response('你是一个程序员吗?') Out[7]: <Statement text:我是个程序员> In [8]: momo.get_response('你使用什么语言呢?') Out[8]: <Statement text:我经常使用 Python, Java 和 C++ .> 这时你已经可以和机器人对话了,不过现在由于训练数据太少,机器人只能返回简单的对话。 ...

2017-07-05 · 5 min · 1035 words

网站微信登录-python 实现

最近我们的网站要加微信登录功能,找了python sdk 感觉都不满意,然后就参考instagram python sdk 自己造了轮子。 轮子 github 地址 python-weixin 根据需求选择相应的登录方式 微信现在提供两种登录接入方式 移动应用微信登录 网站应用微信登录 HUGOMORE42 这里我们使用的是网站应用微信登录 按照 官方流程 注册并通过开放平台开发者资质认证 注册微信开放平台帐号后,在帐号中心中填写开发者资质认证申请,并等待认证通过。 创建网站应用 通过填写网站应用名称、简介和图标,以及各平台下载地址等资料,创建网站应用 接入微信登录 在资源中心查阅网站应用开发文档,开发接入微信登陆功能,让用户可使用微信登录你的网站应用 如果已经完成上面的操作,请继续往下看 微信网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为: 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数; 通过code参数加上AppID和AppSecret等,通过API换取access_token; 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。 获取access_token 时序图 具体流程请参考官方文档,我们这里只说一下python的实现方法。官方文档地址 点这里 参考python-instagram 我写了一个 [python-weixin] (https://github.com/gusibi/python-weixin)一个微信python SDK 不过现在还只有微信接入、获取用户信息、 刷新refresh_token 等简单功能 安装 方法一 手动安装 首先 需要把代码clone到本地 python setup.py install 方法二 pip install pip install git+https://github.com/gusibi/python-weixin.git@master 使用方式 from weixin.client import WeixinAPI APP_ID = 'your app id' APP_SECRET = 'your app secret' REDIRECT_URI = 'http://your_domain.com/redirect_uri' # 这里一定要注意 地址一定要加上http/https scope = ("snsapi_login", ) api = WeixinAPI(appid=APP_ID, app_secret=APP_SECRET, redirect_uri=REDIRECT_URI) authorize_url = api.get_authorize_url(scope=scope) 现在将 authorize_url地址(如 http://yoursite.com/login/weixin)在浏览器打开, 将跳转到微信登录页面,使用手机扫码登录后将跳转到 ...

2016-09-05 · 2 min · 263 words