<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 原文地址：itchat+pillow实现微信好友头像爬取和拼接。原文github地址
Step1:  =======注意=======
这里我用Python2.7，实际上代码在Python3.6,3.5运行一切正常。itchat更新后就没有再测试啦。
注意微信更新了反广告机制，注意不要一次性发太多东西，避免被微信封号。
=======注意=======
核心
itchat读取微信好友列表和头像
用pillow拼接头像画图
登录微信网页版，itchat.auto_login()会生成QR码，使用手机扫一扫即可登录。
提示Please scan the QR code to log in.时，用手机扫描弹出的二维码
命令行二维码技巧：
1. 通过以下命令可以在登陆的时候使用命令行显示二维码：itchat.auto_login(enableCmdQR=True)
2. 若背景色为浅色（白色），可以将enableCmdQR赋值为负值：itchat.auto_login(enableCmdQR=-1)
Step2:  使用friends储存好友列表，update=True可以确保好友列表是最新的。注意好友列表第0个是自己
Step3:  friends好友列表第0个是自己，我们可以看一下。顺带说一下，好友列表的顺序 （貌似） 是按照好友添加顺序
Step4:  创建一个目录，用来保存所有好友头像。注意使用os.chdir(user)切换个到工作目录，方便后续保存图片。
Step5:  批量下载好友头像，储存到friends[i]['img']中。然后我们print(friends[0]看看有没有变化（正常情况下应该可以看到增加了img，以二进制方式储存头像）。因为我家网络经常链接失败，所以用try...except...来写这一段。
"UserName"这个字段开头总有个@符号，直接暴力去除。如果不喜欢的话，可以把"UserName"换成"PYQuanPin"，不过不保证重名。
同时把头像保存在user目录地下，方便下一步使用。
python使用open经常报错：TypeError
Step6:  看看我有多少个好友（friends里面有多少条记录），看看下载了多少头像（os.listdir(os.getcwd())看目录底下有多少文件）
Step7:  单个图像边长eachsize=64像素，一行eachline=int(sqrt(numImages))+1个头像，最终图像边长eachSize*eachline
Step8:  import图像处理Python图像处理库：PIL中Image
1. 新建一块画布
2. 在坐标（0,0）位置放上第一个人头像
3. 向右平移坐标
Step9:  看一下拼接好的图像是什么样的（注意文件过大是常有的现象，请先去掉注释）
回到上一级目录（没人想在一堆文件里面找拼图吧？）
然后保存文件，顺带发送给文件传输助手
Step10:  至此，大功告成，别忘记退出网页版微信
<ASSISTANT_TASK:>
Python Code:
#我的Python版本是：
import sys  
print(sys.version)
print(sys.version_info)
Explanation: 原文地址：itchat+pillow实现微信好友头像爬取和拼接。原文github地址
End of explanation
import itchat
itchat.auto_login()
Explanation: =======注意=======
这里我用Python2.7，实际上代码在Python3.6,3.5运行一切正常。itchat更新后就没有再测试啦。
注意微信更新了反广告机制，注意不要一次性发太多东西，避免被微信封号。
=======注意=======
核心
itchat读取微信好友列表和头像
用pillow拼接头像画图
登录微信网页版，itchat.auto_login()会生成QR码，使用手机扫一扫即可登录。
提示Please scan the QR code to log in.时，用手机扫描弹出的二维码
命令行二维码技巧：
1. 通过以下命令可以在登陆的时候使用命令行显示二维码：itchat.auto_login(enableCmdQR=True)
2. 若背景色为浅色（白色），可以将enableCmdQR赋值为负值：itchat.auto_login(enableCmdQR=-1)
End of explanation
friends = itchat.get_friends(update=True)[0:]
Explanation: 使用friends储存好友列表，update=True可以确保好友列表是最新的。注意好友列表第0个是自己
End of explanation
friends[0]
Explanation: friends好友列表第0个是自己，我们可以看一下。顺带说一下，好友列表的顺序 （貌似） 是按照好友添加顺序
End of explanation
import os
user = friends[0]["PYQuanPin"][0:]
print(user)
os.mkdir(user)
os.chdir(user)
os.getcwd()
Explanation: 创建一个目录，用来保存所有好友头像。注意使用os.chdir(user)切换个到工作目录，方便后续保存图片。
End of explanation
for i in friends:
    try:
        i['img'] = itchat.get_head_img(userName=i["UserName"])
        i['ImgName']=i["UserName"][1:] + ".jpg"
    except ConnectionError:
        print('get '+i["UserName"][1:]+' fail')
    fileImage=open(i['ImgName'],'wb')
    fileImage.write(i['img'])
    fileImage.close()
#这里不建议看friends[0]，太长了
Explanation: 批量下载好友头像，储存到friends[i]['img']中。然后我们print(friends[0]看看有没有变化（正常情况下应该可以看到增加了img，以二进制方式储存头像）。因为我家网络经常链接失败，所以用try...except...来写这一段。
"UserName"这个字段开头总有个@符号，直接暴力去除。如果不喜欢的话，可以把"UserName"换成"PYQuanPin"，不过不保证重名。
同时把头像保存在user目录地下，方便下一步使用。
python使用open经常报错：TypeError: an integer is required的解决方案
错误是由于从os模块引入了所有的函数导致的，os模块下有一个open函数，接受整型的文件描述符和打开模式，from os import *引入os模块的open函数，覆盖了python内建的open函数，导致错误。删除from os import *这行，然后再根据需要，指定引入os模块下的函数
End of explanation
friendsSum=len(friends)
imgList=os.listdir(os.getcwd())
numImages=len(imgList)
print('I have ',friendsSum,'friend(s), and I got ',numImages,'image(s)')
Explanation: 看看我有多少个好友（friends里面有多少条记录），看看下载了多少头像（os.listdir(os.getcwd())看目录底下有多少文件）
End of explanation
import math
eachSize=64
eachLine=int(math.sqrt(numImages))+1
print("单个图像边长",eachSize,"像素，一行",eachLine,"个头像，最终图像边长",eachSize*eachLine)
Explanation: 单个图像边长eachsize=64像素，一行eachline=int(sqrt(numImages))+1个头像，最终图像边长eachSize*eachline
End of explanation
import PIL.Image as Image
toImage = Image.new('RGBA', (eachSize*eachLine,eachSize*eachLine))#新建一块画布
x = 0
y = 0
for i in imgList:
    try:
        img = Image.open(i)#打开图片
    except IOError:
        print("Error: 没有找到文件或读取文件失败",i)
    else:
        img = img.resize((eachSize, eachSize), Image.ANTIALIAS)#缩小图片
        toImage.paste(img, (x * eachSize, y * eachSize))#拼接图片
        x += 1
    if x == eachLine:
        x = 0
        y += 1
print("图像拼接完成")
Explanation: import图像处理Python图像处理库：PIL中Image
1. 新建一块画布
2. 在坐标（0,0）位置放上第一个人头像
3. 向右平移坐标
End of explanation
toImage.show()
os.chdir(os.path.pardir)
os.getcwd()
toImage.save(friends[0]["PYQuanPin"][0:]+".jpg")
itchat.send_image(friends[0]["PYQuanPin"][0:]+".jpg", 'filehelper')
Explanation: 看一下拼接好的图像是什么样的（注意文件过大是常有的现象，请先去掉注释）
回到上一级目录（没人想在一堆文件里面找拼图吧？）
然后保存文件，顺带发送给文件传输助手
End of explanation
itchat.logout()
Explanation: 至此，大功告成，别忘记退出网页版微信
End of explanation
<END_TASK>