安卓通讯录同步抖音头像
本帖最后由 mliang 于 2019-5-22 17:25 编辑### 最近在自学python,学习语法感觉挺枯燥的,看的时候都觉得会了,可是一写代码就懵了。
### 所以想搞个小项目来边学习边练手,这个项目挺简单的
# 获取抖音的通讯录好友头像,然后写入到手机的通讯录中
1. ### 导出联系人文件(.vcf)到电脑上,并同时备份一份。
- ## ***切记一定要备份好通讯录***
- ## ***切记一定要备份好通讯录***
- ## ***切记一定要备份好通讯录***
- ### 在手机通讯录中导入,然后导入到电脑上
- ### 我的手机小米note3,导入出来的文件是3.0的(VERSION:3.0),华为的可能是2.0(VERSION:2.0),我的代码不适合2.0的,因为2.0的文件中对中文做了编码,前两行跟最后一行是固定的,中间的就是一个联系人的信息。姓名不是中文的不可以使用,会乱码。
- >BEGIN:VCARD
VERSION:3.0
N:;张三;;;
FN:张三
TEL;TYPE=CELL:18611111111
ORG;CHARSET=UTF-8:联通
END:VCARD
2. ### 使用mitmdump获取抖音的通讯录好友列表
- 需要安装mitmproxy,requests两个包(pip install 包名)
- 有关mitmproxy的具体配置 <https://blog.csdn.net/freeking101/article/details/83901842>
- 整个过程中用到的包除了上面两个需要自己安装,其他的都是内置的。文件名(douyin_users.py)
```python
import json
'''
pip install mitmproxy,requests
在当前脚本所子目录下运行 mitmdump -s users.txt
打开抖音app,进入通讯录好友页面
'''
# 获取抖音通讯录好友信息
def response(folw):
if 'aweme/v1/user/contact' in folw.request.url:
# 定义一个字典,用来存储需要的数据
users = {}
# 用户信息是json数据
user_list = folw.response.text
# 把json数据转换成python的字典
dict_users = json.loads(user_list)
for user in dict_users['user_list']:
# 只提取里面的名字跟头像的url
name = user['third_name']
url = user['avatar_thumb']['url_list']
# 把数据存储到字典中
users = url
if len(users)>0:
# 如果字典中有数据,就把数据写入到文件中
with open('users.txt', 'a', encoding='utf-8') as f:
# 一行一行的写,'\n'代表换行,方便以后读取数据
f.writelines(json.dumps(users)+'\n')
```
```
3. ### 把头像图片进行base64编码,并写入.vcf文件的PHOTO;ENCODING=BASE64;JPEG:{}后面
- ```python
import json, os, base64, re
import requests
# 当前目录下建立一个img的文件,用来存储用户头像
img_path = os.path.join(os.getcwd(), 'img')
# 需要写入vcf文件中的
photo = 'PHOTO;ENCODING=B;TYPE=JPEG:'
# 读取users.txt中的好友信息
def get_user():
with open('users.txt', 'r') as f:
# 按行读取用户信息
users_list = f.readlines()
# 取到的用户信息是一个列表,列表中的元素是字典
for users in users_list:
users = json.loads(users)
for name, url in users.items():
# 调用下载图片的函数
download_img(name, url)
# 下载好友头像,两个参数,一个用户名(跟手机通讯录存储的名字一样),一个是头像url
def download_img(name, url):
# 如果img文件夹不存在
if not os.path.exists(img_path):
# 创建
os.mkdir(img_path)
# 向url地址发送一个get请求
res = requests.get(url)
# 获取图片后缀名
hz = res.headers['Content-Type'].split('/')
# 下载图片
with open(os.path.join(img_path, '%s.%s' % (name, hz)), 'wb') as f:
f.write(res.content)
print('文件:%s.%s写入完毕' % (name, hz))
# 把图片的base64编码写入.vcf文件中
def write_vcf():
# 读取文件并获取每个联系人的信息
with open('00001.vcf', 'r', encoding='utf-8') as f:
tel = f.read()
# BEGIN:VCARD 中间的信息就是一个联系人的信息 END:VCARD,用正则表达式匹配联系人信息
pa = re.compile('BEGIN:VCARD(.*?)END:VCARD', re.S)
messages = pa.findall(tel)
# FN: 中间是联系人的姓名 \n
n = re.compile('FN:(.*?)\n', re.S)
for mes in messages:
name = n.findall(mes)
# 如果PHOTO不存在联系人信息中,说明通讯录中没有这个人的头像,否则就是有头像不处理
if 'PHOTO' not in mes:
# 返回联系人姓名,跟其他信息
yield name, mes
m = img_base64_encode()
# 把文明写入相应的联系人信息中
with open('00009.vcf', 'a', encoding='utf-8') as f:
# 如果通讯录中的联系人存在m.keys(),就把他的头像信息写入vcf文件中,
# 如果不存在,说明这个人没有开通抖音或者已经有头像了。
if name in m.keys():
f.write('BEGIN:VCARD')
# 此人的其他信息
f.write(mes)
# 此人的头像信息
f.write(photo + m + '\n')
f.write('END:VCARD' + '\n')
# 把头像图片进行base64编码
def img_base64_encode():
# 存储用户名跟头像base64编码的字典
m = {}
for filename in os.listdir(img_path):
# 获取img目录下的所有图片文件的名称,并提取用户名(文件名是以用户名命名的)
name = filename.split('.')
with open(os.path.join(img_path, filename), 'rb') as f:
# 把图片文件进行base64编码
s = base64.b64encode(f.read())
# print('%s的base64编码是:%s' % (name,str(s, encoding='utf-8')))
m = str(s, encoding='utf-8')
return m
# g = write_vcf()
# for a in range(30):
# print(g.__next__())
get_user()
while True:
try:
print(g.__next__())
except StopIteration:
print("已经完毕")
break
```
4. ### 把写入完成的文件传入手机,导入联系人
## 代码有很多不完善的地方,只是实现了功能,我也是在边学边写下完成的。 看起来很牛批 反正我不会 也看不懂 一发出来排版就乱了,第一个帖子不知道怎么弄了。有什么问题的话,版主就给删了吧,实属无意 学习了//// 不错,学习学习
页:
[1]