吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5454|回复: 4
收起左侧

[Python 转载] 安卓通讯录同步抖音头像

[复制链接]
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)
    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'][0]
                # 把数据存储到字典中
                users[name] = url
            if len(users)>0:
                # 如果字典中有数据,就把数据写入到文件中
                with open('users.txt', 'a', encoding='utf-8') as f:
                    # 一行一行的写,'\n'代表换行,方便以后读取数据
                    f.writelines(json.dumps(users)+'\n')



​    ```

  1. 把头像图片进行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('/')[1]
     # 下载图片
     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)[0]
             # 如果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[name] + '\n')
                         f.write('END:VCARD' + '\n')

    把头像图片进行base64编码

    def img_base64_encode():

    存储用户名跟头像base64编码的字典

     m = {}
     for filename in os.listdir(img_path):
         # 获取img目录下的所有图片文件的名称,并提取用户名(文件名是以用户名命名的)
         name = filename.split('.')[0]
         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[name] = 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

  2. 把写入完成的文件传入手机,导入联系人

    代码有很多不完善的地方,只是实现了功能,我也是在边学边写下完成的。

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
wushaominkk + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

这个叫社会 发表于 2019-5-22 17:30
看起来很牛批 反正我不会 也看不懂        
 楼主| mliang 发表于 2019-5-22 17:31
一发出来排版就乱了,第一个帖子不知道怎么弄了。有什么问题的话,版主就给删了吧,实属无意
楼上有人 发表于 2019-5-22 17:33
langwang66 发表于 2019-5-22 18:20
不错,学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 10:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表