Python 将 QQ 好友头像生成祝福语的实现代码


Posted in Python onMay 03, 2020

本文我们来看一下如何使用 Python 将 QQ 好友头像拼成“五一快乐”四个字。我们可以将整个实现过程分为两步:爬取 QQ 好友头像、利用好友头像生成文字。

爬取头像

爬取 QQ 好友头像我们需要借助于 QQ 邮箱,首先我们从浏览器上登录 QQ 邮箱,之后按 F12 键打开开发者工具并用鼠标选中 Network 选项,如下图所示:

Python 将 QQ 好友头像生成祝福语的实现代码

再接着我们按 F5 键刷新一下网页,然后在 Filter 中输入 laddr_lastlist ,如下图所示:

Python 将 QQ 好友头像生成祝福语的实现代码

我们再点 Name 下的链接,点击之后右侧会出现一个窗口,我们用鼠标选中 Response 项,如下图所示:

Python 将 QQ 好友头像生成祝福语的实现代码

我们最后将 Response 下面出现的内容复制到 txt 文件。

获取了爬取需要用到的东西后我们就可以开始实现爬取了,我们使用 requests 库将头像图片爬取来下存到本地,代码实现如下所示:

# 获取头像
def get_head():
 file = codecs.open('qqfriends.txt', 'rb', 'utf-8')
 s = file.read()
 pattern = re.compile(r'\d+@qq.com')
 # 正则表达式匹配所有的 qq 号
 all_mail = pattern.findall(s)
 # 用于存储需要访问的链接
 all_link = []
 url = 'http://qlogo.store.qq.com/qzone/'
 for mail in all_mail:
 qq = mail.replace('@qq.com', '')
 l = url + qq + '/' + qq + '/100'
 all_link.append(l)
 # 初始化下载图片数量
 i = 0
 # 获取朋友头像数量
 friends_count = len(all_link)
 print('共{}个头像'.format(friends_count))
 # 遍历链接,下载头像
 for link in all_link:
 i += 1
 saveurl = 'head/' + str(i) + '.png'
 print('第 %d 个' % i, end=' ')
 sava2img(link, saveurl)
 return True

# 存储图片函数,picurl 是图片的 URL,saveurl 是本地存储位置
def sava2img(picurl, saveurl):
 try:
 start = time.time()
 response = requests.get(picurl, stream=True)
 # 下载图片到本地
 with open(saveurl, 'wb') as file:
  file.write(response.content)
  print('下载完成...', end=' ')
 end = time.time()
 time_ = end - start
 print('用时: %.2f秒' % (time_))
 return True
 except:
 print('出错了...')

生成文字

现在 QQ 头像图片已经有了,我们再看一下如何用这些图片生成文字,这里需要用到一下第三方库 PIL ,安装使用 pip install Pillow ,我们需要先将 “五一快乐” 四个字转化为汉字库的点阵数据再使用,现在看一下具体实现:

# 将字转化为汉字库的点阵数据
def char2bit(textStr):
 KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]
 target = []
 global count
 count = 0
 for x in range(len(textStr)):
 text = textStr[x]
 rect_list = [] * 16
 for i in range(16):
  rect_list.append([] * 16)
 gb2312 = text.encode('gb2312')
 hex_str = binascii.b2a_hex(gb2312)
 result = str(hex_str, encoding='utf-8')
 area = eval('0x' + result[:2]) - 0xA0
 index = eval('0x' + result[2:]) - 0xA0
 offset = (94 * (area-1) + (index-1)) * 32
 font_rect = None
 with open("HZK16", "rb") as f:
  f.seek(offset)
  font_rect = f.read(32)
 for k in range(len(font_rect) // 2):
  row_list = rect_list[k]
  for j in range(2):
  for i in range(8):
   asc = font_rect[k * 2 + j]
   flag = asc & KEYS[i]
   row_list.append(flag)
 output = []
 for row in rect_list:
  for i in row:
  if i:
   output.append('1')
   count+=1
  else:
   output.append('0')
 target.append(''.join(output))
 return target

# 生成图片文字
def head2char(workspace,folder,self,outlist):
 # 将工作路径转移至头像文件夹
 os.chdir(folder)
 # 获取文件夹内头像列表
 imgList = os.listdir(folder)
 # 获取头像图片个数
 numImages = len(imgList)
 # 设置头像裁剪后尺寸
 eachSize = 100
 # 变量 n 用于循环遍历头像图片
 n=0
 # 变量 count 用于为最终生成的单字图片编号
 count = 0
 # 初始化颜色列表,用于背景着色
 colorlist = ['#FFFACD','#F0FFFF','#BFEFFF','#b7facd','#ffe7cc','#fbccff','#d1ffb8','#febec0','#E0EEE0']
 # index 用来改变不同字的背景颜色
 index = 0
 # 每个 item 对应不同字的点阵信息
 for item in outlist:
 # 将工作路径转到头像所在文件夹
 os.chdir(folder)
 # 新建一个带有背景色的画布,16 * 16点阵,每个点处填充 2 * 2 张头像图片,故长为 16 * 2 * 100
 canvas = Image.new('RGB', (3200, 3200), colorlist[index]) # 新建一块画布
 # index 变换,用于变换背景颜色
 index = (index+1)%9
 count += 1
 # 每个 16 * 16 点阵中的点,用四张 100 * 100 的头像来填充
 for i in range(16*16):
  # 点阵信息为 1,即代表此处要显示头像来组字
  if item[i] == "1":
  # 循环读取连续的四张头像图片
  x1 = n % len(imgList)
  x2 = (n+1) % len(imgList)
  x3 = (n+2) % len(imgList)
  x4 = (n+3) % len(imgList)
  # 以下四组 try,将读取到的四张头像填充到画板上对应的一个点位置
  # 点阵处左上角图片 1/4
  try:
   # 打开图片
   img = Image.open(imgList[x1])
  except IOError:
   print("有1张图片读取失败,已使用备用图像替代")
   img = Image.open(self)
  finally:
   # 缩小图片
   img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
   # 拼接图片
   canvas.paste(img, ((i % 16) * 2 * eachSize, (i // 16) * 2 * eachSize))
  # 点阵处右上角图片 2/4
  try:
   img = Image.open(imgList[x2])
  except IOError:
   print("有1张图片读取失败,已使用备用图像替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
   canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, (i // 16) * 2 * eachSize))
  # 点阵处左下角图片 3/4
  try:
   img = Image.open(imgList[x3])
  except IOError:
   print("有1张图片读取失败,已使用备用图像替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
   canvas.paste(img, ((i % 16) * 2 * eachSize, ((i // 16) * 2 + 1 ) * eachSize))
  # 点阵处右下角图片 4/4
  try:
   img = Image.open(imgList[x4])
  except IOError:
   print("有1张图片读取失败,已使用备用图像替代")
   img = Image.open(self)
  finally:
   img = img.resize((eachSize, eachSize), Image.ANTIALIAS)
   canvas.paste(img, (((i % 16) * 2 + 1) * eachSize, ((i // 16) * 2 + 1) * eachSize))
  #调整 n 以读取后续图片
  n= (n+4) % len(imgList)
 os.chdir(workspace)
 # 创建文件夹用于存储输出结果
 if not os.path.exists('output'):
  os.mkdir('output')
 os.chdir('output')
 # 存储将拼接后的图片,quality 为图片质量,1 - 100,100 最高
 canvas.save('result%d.jpg'% count, quality=100)

看一下实现效果:

Python 将 QQ 好友头像生成祝福语的实现代码

到此这篇关于用 Python 将 QQ 好友头像生成祝福语的文章就介绍到这了,更多相关python qq好友祝福语内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
基于Python获取照片的GPS位置信息
Jan 20 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
Python字符串split及rsplit方法原理详解
Jun 29 Python
通过实例解析python and和or使用方法
Nov 14 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
Python使用pdb调试代码的技巧
May 03 #Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 #Python
Python使用多进程运行含有任意个参数的函数
May 02 #Python
python多进程使用函数封装实例
May 02 #Python
Python中使用filter过滤列表的一个小技巧分享
May 02 #Python
python同时遍历两个list用法说明
May 02 #Python
python多线程实现同时执行两个while循环的操作
May 02 #Python
You might like
FCKeditor添加自定义按钮
2008/03/27 PHP
sphinx增量索引的一个问题
2011/06/14 PHP
微信公众平台开发之配置与请求
2015/08/26 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
js数组与字符串的相互转换方法
2014/07/09 Javascript
把文本中的URL地址转换为可点击链接的JavaScript、PHP自定义函数
2014/07/29 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
2019/01/19 Javascript
Python中的is和id用法分析
2015/01/26 Python
python读写json文件的简单实现
2017/04/11 Python
Python用sndhdr模块识别音频格式详解
2018/01/11 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
Python Subprocess模块原理及实例
2019/08/26 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
有趣、实用和鼓舞人心的产品:Inspire Uplift
2019/11/05 全球购物
为什么需要版本控制?
2013/08/08 面试题
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
流动人口婚育证明
2014/10/19 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
公积金具结保证书
2015/05/11 职场文书
2015年高二班主任工作总结
2015/05/25 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
MySQL数据库之存储过程 procedure
2022/06/16 MySQL