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 相关文章推荐
pyqt4教程之widget使用示例分享
Mar 07 Python
Python下的Softmax回归函数的实现方法(推荐)
Jan 26 Python
python实现下载文件的三种方法
Feb 09 Python
Python图片裁剪实例代码(如头像裁剪)
Jun 21 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python2包含中文报错的解决方法
Jul 09 Python
简单的Python调度器Schedule详解
Aug 30 Python
python的slice notation的特殊用法详解
Dec 27 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 Python
Python tempfile模块生成临时文件和临时目录
Sep 30 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 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
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
Smarty模板简单配置与使用方法示例
2016/05/23 PHP
JavaScript 异步调用框架 (Part 6 - 实例 & 模式)
2009/08/04 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
Jquery实现控件的隐藏和显示实例
2014/02/08 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
webuploader模态框ueditor显示问题解决方法
2016/12/27 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
element ui里dialog关闭后清除验证条件方法
2018/02/26 Javascript
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
2019/09/05 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
企业门卫岗位职责
2013/12/12 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
考试作弊检讨书
2015/01/27 职场文书
MySQL之DML语言
2021/04/05 MySQL
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技
Spring Boot优化后启动速度快到飞起技巧示例
2022/07/23 Java/Android