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实现去除下载电影和电视剧文件名中的多余字符的方法
Sep 23 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
Python实现的弹球小游戏示例
Aug 01 Python
学习Python selenium自动化网页抓取器
Jan 20 Python
python3 对list中每个元素进行处理的方法
Jun 29 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
Apr 08 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
python 写函数在一定条件下需要调用自身时的写法说明
Jun 01 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
python 制作一个gui界面的翻译工具
May 14 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
PHP中for循环语句的几种变型
2006/11/26 PHP
一个好用的PHP验证码类实例分享
2013/12/27 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
动手学习无线电
2021/03/10 无线电
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
轻松学习jQuery插件EasyUI EasyUI实现树形网络基本操作(2)
2015/11/30 Javascript
artDialog+plupload实现多文件上传
2016/07/19 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
2017/07/18 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
element-ui 表格数据时间格式化的方法
2018/08/24 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
简单谈谈python中的语句和语法
2017/08/10 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
Python基本类型的连接组合和互相转换方式(13种)
2019/12/16 Python
python wav模块获取采样率 采样点声道量化位数(实例代码)
2020/01/22 Python
python 等差数列末项计算方式
2020/05/03 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
工厂总经理岗位职责
2014/02/07 职场文书
2014年两会学习心得体会
2014/03/10 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
政审证明材料
2015/06/19 职场文书
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server