mliang 发表于 2019-5-22 17:23

安卓通讯录同步抖音头像

本帖最后由 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. ### 把写入完成的文件传入手机,导入联系人
## 代码有很多不完善的地方,只是实现了功能,我也是在边学边写下完成的。

这个叫社会 发表于 2019-5-22 17:30

看起来很牛批 反正我不会 也看不懂      

mliang 发表于 2019-5-22 17:31

一发出来排版就乱了,第一个帖子不知道怎么弄了。有什么问题的话,版主就给删了吧,实属无意

楼上有人 发表于 2019-5-22 17:33

学习了////

langwang66 发表于 2019-5-22 18:20

不错,学习学习
页: [1]
查看完整版本: 安卓通讯录同步抖音头像