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去除字符串中的换行符
Oct 11 Python
pyhton列表转换为数组的实例
Apr 04 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
May 04 Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
对python xlrd读取datetime类型数据的方法详解
Dec 26 Python
python自动化测试之如何解析excel文件
Jun 27 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
Python实现TCP探测目标服务路由轨迹的原理与方法详解
Sep 04 Python
Python编译为二进制so可执行文件实例
Dec 23 Python
如何基于线程池提升request模块效率
Apr 18 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 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获得当前的脚本网址
2007/12/10 PHP
PHP UTF8编码内的繁简转换类
2009/07/20 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
使用Thinkphp框架开发移动端接口
2015/08/05 PHP
注意!PHP 7中不要做的10件事
2016/09/18 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
php接口技术实例详解
2016/12/07 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
js 居中漂浮广告
2010/03/21 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
2014/09/26 NodeJs
js实现每日自动换一张图片的方法
2015/05/04 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
js判断非127开头的IP地址的实例代码
2020/01/05 Javascript
python学习手册中的python多态示例代码
2014/01/21 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
解决Python 爬虫URL中存在中文或特殊符号无法请求的问题
2018/05/11 Python
Python 变量类型详解
2018/10/10 Python
python中强大的format函数实例详解
2018/12/05 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
python 经典数字滤波实例
2019/12/16 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python作用域与名字空间原理详解
2020/03/21 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
如何删除一个表里面的重复行
2013/07/13 面试题
服装设计专业毕业生推荐信
2013/11/09 职场文书
趣味体育活动方案
2014/02/08 职场文书
优秀员工推荐信
2014/05/10 职场文书
工程索赔意向书
2014/08/30 职场文书
法院个人总结
2015/03/03 职场文书
优秀大学生自荐信
2015/03/26 职场文书