用Python實現一個簡單的批量無水印快手抖音批量下載器

文中介紹的方法僅限學習使用,切勿做非法用途

結合上一篇說了一個通過在手機上面搭建Http服務去破解App的密鑰,如何真正的實現一個批量下載視頻的功能呢?
我們用Python3簡單的寫了一個腳本,可以搜索特定用戶,選擇用戶後,下載這個用戶所有的視頻。
項目地址:https://github.com/tbruceyu/AppCaller , 歡迎Star

關鍵接口

  1. 搜索用戶的接口:http://api.ksapisrv.com/rest/n/search/user
  2. 查找用戶視頻接口:http://api.ksapisrv.com/rest/n/feed/profile2
  3. 用AppCaller搭建的破解密鑰接口

有了這些接口後,我們就可以開始寫代碼了,代碼很簡單,我直接貼出來了:

# -*- coding: utf-8 -*-
import json
import os
from urllib import request
import requests

__KEY_SERVER_HOST = 'http://172.16.70.147:8889/api'


def search_user(keyword, pcursor=None):
    key_req_json = {
        'url': 'http://api.ksapisrv.com/rest/n/search/user?app=0&kpf=ANDROID_PHONE&ver=6.4&c=BAIDU',
        'commonParams': 'mod=huawei%28MI%208%29&appver=6.4.0.9003&ftt=K-F-T&isp=CTCC&kpn=KUAISHOU&'
                        'lon=33.337841&language=zh-cn&sys=ANDROID_9&max_memory=512&ud=0&country_code=cn&'
                        'pm_tag=11694575470&oc=BAIDU&hotfix_ver=&did_gt=1539073091012&iuid=&net=WIFI&'
                        'did=ANDROID_2ec0f9e99f32fb16&lat=33.979012',
        'field': {
            'keyword': keyword,
            'client_key': '3c2cd3f3',
            'os': 'android',
        },
        'header': {
            'User-Agent': ['kwai-android'],
            'Accept-Language': ['zh-cn'],
            'X-REQUESTID': ['193601906'],
            'Host': ['api.ksapisrv.com']
        },
        'method': 'post'
    }
    if pcursor is not None:
        key_req_json['field'] = {
            'keyword': keyword,
            'pcursor': str(pcursor),
            'client_key': '3c2cd3f3',
            'os': 'android',
        }
    res_json = requests.post(url=__KEY_SERVER_HOST, data=json.dumps(key_req_json)
                             , headers={'Content-Type': 'application/json'})
    request_data = json.loads(res_json.text)
    url = request_data['url']
    field_data = request_data['field']

    header_data = {}
    for k in request_data['header'].keys():
        header_data[k] = request_data['header'][k][0]
    search_data = json.loads(requests.post(url=url, data=field_data
                                           , headers=header_data).text)
    if len(search_data['users']) <= 0:
        return []
    return search_data['pcursor'], search_data['users']


def get_video(uid, pcursor=None):
    key_req_json = {
        'url': 'http://api.ksapisrv.com/rest/n/feed/profile2?app=0&kpf=ANDROID_PHONE&ver=6.4&c=BAIDU',
        'commonParams': 'mod=huawei%28MI%208%29&appver=6.4.0.9003&ftt=K-F-T&isp=CTCC&kpn=KUAISHOU&'
                        'lon=33.337841&language=zh-cn&sys=ANDROID_9&max_memory=512&ud=0&country_code=cn&'
                        'pm_tag=11694575470&oc=BAIDU&hotfix_ver=&did_gt=1539073091012&iuid=&net=WIFI&'
                        'did=ANDROID_2ec0f9e99f32fb16&lat=33.979012',
        'field': {
            "token": "", "user_id": str(uid), "lang": "zh", "count": "30", "privacy": "public",
            "referer": "ks://profile/133107719/5202502011931030729/1_i/1648554269758459910_h139/8",
            "browseType": "1", "client_key": "3c2cd3f3", "os": "android"
        },
        'header': {
            'User-Agent': ['kwai-android'],
            'Accept-Language': ['zh-cn'],
            'X-REQUESTID': ['193601906'],
            'Host': ['api.ksapisrv.com']
        },
        'method': 'post'
    }
    if pcursor is not None:
        key_req_json['field'] = {
            "token": "", "pcursor": str(pcursor), "user_id": str(uid), "lang": "zh", "count": "30", "privacy": "public",
            "referer": "ks://profile/133107719/5202502011931030729/1_i/1648554269758459910_h139/8",
            "browseType": "1", "client_key": "3c2cd3f3", "os": "android"
        }
    res_json = requests.post(url=__KEY_SERVER_HOST, data=json.dumps(key_req_json)
                             , headers={'Content-Type': 'application/json'})
    request_data = json.loads(res_json.text)
    url = request_data['url']
    field_data = request_data['field']

    header_data = {}
    for k in request_data['header'].keys():
        header_data[k] = request_data['header'][k][0]
    user_data = json.loads(requests.post(url=url, data=field_data
                                         , headers=header_data).text)
    return user_data['pcursor'], user_data['feeds']


if __name__ == "__main__":
    keyword = input("輸入關鍵字:")

    user_count = 0
    pcursor, search_res = search_user(keyword)
    if len(search_res) == 0:
        print("沒有找到用戶")
        exit(1)
    users = search_res
    target_user = None
    while True:
        for user in users:
            print("{0}. {1}".format(user_count, user['user_name']))
            user_count += 1
        print("請輸入用戶編號(翻頁請直接按回車鍵):")
        choose = input("輸入關鍵字:")
        if choose.isnumeric():
            target_user = users[int(choose)]
            break
        else:
            pcursor, new_users = search_user(keyword, pcursor)
            users += new_users
    print(target_user)
    pcursor = None
    if not os.path.exists("output"):
        os.mkdir("output")
    feed_count = 0
    while True:
        pcursor, feeds = get_video(target_user['user_id'], pcursor)
        if len(feeds) == 0:
            print("已經全部下載完成!")
            break
        for feed in feeds:
            video_url = feed['main_mv_url']
            if video_url is None:
                video_url = feed['main_mv_urls'][0]
            target_file = "./output/{0}.mp4".format(feed_count)
            if not os.path.exists(target_file):
                try:
                    request.urlretrieve(video_url, target_file)
                except Exception as e:
                    print("下載失敗:" + video_url)
            feed_count += 1

操作步驟

廢話不多說,開始行動吧:

  1. 首先把項目clone下來,然後./gradlew assembleDebug編譯我們的App。
  2. 編譯成功後安裝AppCaller:adb install -r app/build/outputs/apk/debug/app-debug.apk
  3. 然後安裝slave程序:adb install -r clients/kuaishou.apk
  4. 在手機上打開AppCaller,添加快手App,然後點擊開啓
    在這裏插入圖片描述
  5. 查看手機的IP地址:ifconfig ,查看wlan0的IP地址
  6. 把tools/download.py的__KEY_SERVER_HOST = ‘http://172.16.70.147:8889/api’ IP地址改爲手機上面的IP地址
  7. 運行腳本,然後輸入用戶名,選擇一個用戶,就可以開始下載啦。輸出如下:
xxx@bogon:~/Projects/AppCaller/tools$ python3.7 download.py
輸入關鍵字:手工耿
0. V手工~耿
1. 手工耿弟
2. 陌路離腸(耿灣手工鞋墊)
3. 耿哥手工玫瑰
4. 手工耿
5. 手工耿 非物質文化遺產
6. 耿灣?手工?豆腐
7. 手工編制耿梅
8. 耿耿?DIY手工製作
9. 耿姐的手工針線43387
10. 耿氏手工豆腐
11. 耿記手工辣條
12. 耿青春的手工傳奇
13. 耿馬勐永宋永芳傳統手工傣
14. 耿大妮~全國手工活外放
15. 耿姐手工編織手鍊腳鏈腰鏈
16. 五棵樹手工幹豆腐耿麗娜
17. 機械加工耿師
18. 東宿村粉面粉條加工耿保忠
19. 招縫紉機工!耿文龍177362
20. 數控車牀對外加工耿增旺
21. 精衆化工耿常見
22. 昭通架子工耿華
23. 外架工耿國
24. ,建築電工耿振勇138338914
25. 數控車工,耿哥
26. 農民工耿哥
27. 御通花園財源建工耿洪泉
28. 我是機修工耿濤
29. 羊毛衫加工,耿利東
請輸入用戶編號(翻頁請直接按回車鍵):
輸入關鍵字:0
下載視頻成功:http://jsmov2.a.yximgs.com/upic/2019/10/22/20/BMjAxOTEwMjIyMDAxNDhfMzMyODQyMTExXzE4Nzc4OTc3ODI1XzFfMw==_b_B3f60bcff9bbda1a56505e434f59966bb.mp4?tag=1-1572264843-p-0-z65nxxy1b6-8a39387debd35122&type=hot
下載視頻成功:http://jsmov2.a.yximgs.com/upic/2019/10/16/11/BMjAxOTEwMTYxMTM1NDhfMzMyODQyMTExXzE4NTY2MzY5MjAyXzFfMw==_b_Bded1516bcf28343539c26b3cc2e9a469.mp4?tag=1-1572264843-p-0-8mrzya9pw3-4db9ce8b186a3901&type=hot
下載視頻成功:http://jsmov2.a.yximgs.com/upic/2019/10/10/20/BMjAxOTEwMTAyMDM2NDdfMzMyODQyMTExXzE4NDAxNzkyMzAwXzFfMw==_b_B2d039e11c3263491d8c3001ac7a844fc.mp4?tag=1-1572264843-p-0-oeziowhxdt-5b5f7260c44b14b2&type=hot
下載視頻成功:http://jsmov2.a.yximgs.com/upic/2019/10/03/08/BMjAxOTEwMDMwODAyMTZfMzMyODQyMTExXzE4MTIwOTQ3MjExXzFfMw==_b_Bca3c27612dc62ea907887edd48ac6ccf.mp4?tag=1-1572264843-p-0-wjycc4zqsi-045d9b68d9f8a7fb&type=hot
下載視頻成功:http://jsmov2.a.yximgs.com/upic/2019/10/01/10/BMjAxOTEwMDExMDM4MjRfMzMyODQyMTExXzE4MDI4MzgzODk2XzFfMw==_b_B072a824dbf29fbabeddff896d671ebcd.mp4?tag=1-1572264843-p-0-kwqvozhrff-039073ab5a551e15&type=hot
......
``
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章