两碗包 发表于 2023-11-27 19:39

申请会员ID:Alpaca_【未报到,已注销】

-=========================================================-
1、申 请 I D :Alpaca_
2、个人邮箱:2513150647@qq.com
3、原创技术文章:

通过python爬取爱奇艺视频到本地
项目是去年做的,今年没怎么写逆向,先用这个过审核了

# 爱奇艺视频下载逆向

1. 找到m3u8视频链接

   !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221105124907109.png)

2. 视频详情页:

   url:https://pcw-api.iqiyi.com/video/video/playervideoinfo?tvid=5175273237810200&locale=cn_s&callback=Qa63062b19104c9508ca7d2398ce6c645

3. 视频内容请求参数分析:

   URL:https://cache.video.iqiyi.com/dash

   | 参数类型      |                            参考值                            | 变值 | 描述                                 |
   | :------------ | :----------------------------------------------------------: | ---: | ------------------------------------ |
   | tvid          |                     1615261206566600                     |   变 |                                    |
   | bid         |                           600                              |      | 清晰度,600为1080p,500超清,300高清 |
   | vid         |               bfd2f90a885d99e1af2133aad94b5447               |   变 |                                    |
   | src         |                     01010031010000000000                     |      |                                    |
   | vt            |                              0                               |      |                                    |
   | rs            |                              1                               |      |                                    |
   | uid         |                     3332594213163264                     |   变 |                                    |
   | ori         |                           pcw                              |      |                                    |
   | ps            |                              1                               |      |                                    |
   | k_uid         |               952a32c9f139f8f46f704f8ed42a250f               |   变 |                                    |
   | pt            |                              0                               |      |                                    |
   | d             |                              0                               |      |                                    |
   | s             |                                                            |      |                                    |
   | lid         |                                                            |      |                                    |
   | cf            |                                                            |      |                                    |
   | ct            |                                                            |      |                                    |
   | authKey       |               2def2a2637c02f92608fb4b22689fb6a               |   变 |                                    |
   | k_tag         |                              1                               |      |                                    |
   | dfp         | a0a115d368ece94755b4879a16e6070a28e7e4b74a0f2a51d86fb28ddd00845023 |   变 |                                    |
   | loacle      |                            zh_cn                           |      |                                    |
   | proi          |                  {"ff":"f4v","code":2}                     |      |                                    |
   | pck         | 1bVnzm2TIa7AdztPlTGAm1ANo50vrLZMvfZUJVbDS11ym3EX23xNogu3TBIrlQL9OgdDz8b |   变 |                                    |
   | k_err_retries |                              0                               |      |                                    |
   | up            |                                                            |      |                                    |
   | sr            |                              1                               |      |                                    |
   | qd_v          |                              2                               |      |                                    |
   | tm            |                        1667623225114                         |   变 |                                    |
   | qdy         |                              a                               |      |                                    |
   | qds         |                              0                               |      |                                    |
   | k_ft1         |                     706436220846084                        |      |                                    |
   | k-ft4         |                     1161084347621396                     |      |                                    |
   | k_ft5         |                            262145                            |      |                                    |
   | k_ft7         |                              4                               |      |                                    |
   | bop         | {"version":"10.0","dfp":"a0a115d368ece94755b4879a16e6070a28e7e4b74a0f2a51d86fb28ddd00845023"} |   变 |                                    |
   | ut            |                              1                               |      |                                    |
   | vf            |               83e3771bfeb804dd1312a66d81e248d6               |   变 |                                    |

4. 参数分析:

   1. tvid:网页源码中可找到("v":{"tvid":)

      ```python
      re.search('"tvid":(?P<tvid>.*?),').group('tvid')
      ```

   2. vid:网页源码中可找到

      ```python
      re.findall('"bid":600,"vid":"(.*?)"')
      ```

   3. uid:cookie中名为P00003的值

   4. k_uid:cookie中,名为QY_PUSHMSG_ID(其实就是个32位伪随机数)

   5. authKey:在pcweb.wonder.6e664f99.js文件中可以找到生成代码

   6. dfp:.iqiyi.com域的cookie中可以找到

   7. pck:翻了好久的js代码,最后发现就是cookie里面的P00001的值

      !(教程.assets/image-20221106215502037.png)

   8. tm:

   9. k_ft1-7:不变

   10. bop:{"version":"10.0","dfp":"dfb的值"}

   11. vf:vf是由webpack打包的一段函数生成(7w多行)

       webpack分发器在pcweb.wonder.xxxxx.js函数里面

       !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221129133521282.png)

       加密函数本体在mmc.authkey.xxxxx.js中,将分发器之前的代码全部删除,使用码云中开源的wepack打包器将函数打包出来,项目地址:[渔滒 / webpack_ast · GitCode](https://gitcode.net/zjq592767809/webpack_ast)

       在控制台使用

       ``` node webpack_mixer.js -l pcweb.wonder.xxxx.js -m mmc.authkey.xxxx.js -o webout.js```

       会生成一个webout.js文件,即为导出的函数,导出的函数很长,我们只保留vf代码需要的1043与545两个键值对应的函数即可

       调用方法

       ```js
       const { JSDOM } = require("jsdom");
       const dom = new JSDOM("<html><head></head><body><p>hello world</p></body></html>")
       global.window = dom.window;
       global.document = window.document;
       global.self = window;
      
      
       const n = require("./webout.js");
       const i = n('545')
       console.log(i.mmc('传入url值,格式为/dash?...........&ut=1'))
      
       ```

       调用后会发现返回值与web中的vf值不同,是因为检测到node环境了,只需要将aU函数修改为返回6即可(原本为很长的一个switch-case语句,当环境为web时该函数返回6)

       !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221129134541802.png)

5. 返回值分析:

   1. ```python
      ['data']['program']['video']['m3u8']
      # m3u8文件地址
      ```

   2. ```py
      ['data']['program']['video']['duration']
      # 视频时长
      ```

   3. ```py
      ['data']['program']['video']['vsize']
      # 视频大小
      ```

拿到m3u8地址后
# 爱奇艺爬虫

1. 找到m3u8视频链接

   !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221105124907109.png)

2. 视频详情页:

   url:https://pcw-api.iqiyi.com/video/video/playervideoinfo?tvid=5175273237810200&locale=cn_s&callback=Qa63062b19104c9508ca7d2398ce6c645

3. 视频内容请求参数分析:

   URL:https://cache.video.iqiyi.com/dash

   | 参数类型      |                            参考值                            | 变值 | 描述                                 |
   | :------------ | :----------------------------------------------------------: | ---: | ------------------------------------ |
   | tvid          |                     1615261206566600                     |   变 |                                    |
   | bid         |                           600                              |      | 清晰度,600为1080p,500超清,300高清 |
   | vid         |               bfd2f90a885d99e1af2133aad94b5447               |   变 |                                    |
   | src         |                     01010031010000000000                     |      |                                    |
   | vt            |                              0                               |      |                                    |
   | rs            |                              1                               |      |                                    |
   | uid         |                     3332594213163264                     |   变 |                                    |
   | ori         |                           pcw                              |      |                                    |
   | ps            |                              1                               |      |                                    |
   | k_uid         |               952a32c9f139f8f46f704f8ed42a250f               |   变 |                                    |
   | pt            |                              0                               |      |                                    |
   | d             |                              0                               |      |                                    |
   | s             |                                                            |      |                                    |
   | lid         |                                                            |      |                                    |
   | cf            |                                                            |      |                                    |
   | ct            |                                                            |      |                                    |
   | authKey       |               2def2a2637c02f92608fb4b22689fb6a               |   变 |                                    |
   | k_tag         |                              1                               |      |                                    |
   | dfp         | a0a115d368ece94755b4879a16e6070a28e7e4b74a0f2a51d86fb28ddd00845023 |   变 |                                    |
   | loacle      |                            zh_cn                           |      |                                    |
   | proi          |                  {"ff":"f4v","code":2}                     |      |                                    |
   | pck         | 1bVnzm2TIa7AdztPlTGAm1ANo50vrLZMvfZUJVbDS11ym3EX23xNogu3TBIrlQL9OgdDz8b |   变 |                                    |
   | k_err_retries |                              0                               |      |                                    |
   | up            |                                                            |      |                                    |
   | sr            |                              1                               |      |                                    |
   | qd_v          |                              2                               |      |                                    |
   | tm            |                        1667623225114                         |   变 |                                    |
   | qdy         |                              a                               |      |                                    |
   | qds         |                              0                               |      |                                    |
   | k_ft1         |                     706436220846084                        |      |                                    |
   | k-ft4         |                     1161084347621396                     |      |                                    |
   | k_ft5         |                            262145                            |      |                                    |
   | k_ft7         |                              4                               |      |                                    |
   | bop         | {"version":"10.0","dfp":"a0a115d368ece94755b4879a16e6070a28e7e4b74a0f2a51d86fb28ddd00845023"} |   变 |                                    |
   | ut            |                              1                               |      |                                    |
   | vf            |               83e3771bfeb804dd1312a66d81e248d6               |   变 |                                    |

4. 参数分析:

   1. tvid:网页源码中可找到("v":{"tvid":)

      ```python
      re.search('"tvid":(?P<tvid>.*?),').group('tvid')
      ```

   2. vid:网页源码中可找到

      ```python
      re.findall('"bid":600,"vid":"(.*?)"')
      ```

   3. uid:cookie中名为P00003的值

   4. k_uid:cookie中,名为QY_PUSHMSG_ID(其实就是个32位伪随机数)

   5. authKey:在pcweb.wonder.6e664f99.js文件中可以找到生成代码

   6. dfp:.iqiyi.com域的cookie中可以找到

   7. pck:翻了好久的js代码,最后发现就是cookie里面的P00001的值

      !(教程.assets/image-20221106215502037.png)

   8. tm:

   9. k_ft1-7:不变

   10. bop:{"version":"10.0","dfp":"dfb的值"}

   11. vf:vf是由webpack打包的一段函数生成(7w多行)

       webpack分发器在pcweb.wonder.xxxxx.js函数里面

       !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221129133521282.png)

       加密函数本体在mmc.authkey.xxxxx.js中,将分发器之前的代码全部删除,使用码云中开源的wepack打包器将函数打包出来,项目地址:[渔滒 / webpack_ast · GitCode](https://gitcode.net/zjq592767809/webpack_ast)

       在控制台使用

       ``` node webpack_mixer.js -l pcweb.wonder.xxxx.js -m mmc.authkey.xxxx.js -o webout.js```

       会生成一个webout.js文件,即为导出的函数,导出的函数很长,我们只保留vf代码需要的1043与545两个键值对应的函数即可

       调用方法

       ```js
       const { JSDOM } = require("jsdom");
       const dom = new JSDOM("<html><head></head><body><p>hello world</p></body></html>")
       global.window = dom.window;
       global.document = window.document;
       global.self = window;
      
      
       const n = require("./webout.js");
       const i = n('545')
       console.log(i.mmc('传入url值,格式为/dash?...........&ut=1'))
      
       ```

       调用后会发现返回值与web中的vf值不同,是因为检测到node环境了,只需要将aU函数修改为返回6即可(原本为很长的一个switch-case语句,当环境为web时该函数返回6)

       !(C:\Users\Alpaca\AppData\Roaming\Typora\typora-user-images\image-20221129134541802.png)

5. 返回值分析:

   1. ```python
      ['data']['program']['video']['m3u8']
      # m3u8文件地址
      ```

   2. ```py
      ['data']['program']['video']['duration']
      # 视频时长
      ```

   3. ```py
      ['data']['program']['video']['vsize']
      # 视频大小
      ```

在此便可拿到m3u8视频地址

再获取一个cookie就可尝试用python下载了,cookie有许多获取方式,我这边比较简单粗暴,直接读取chrome本地的cookie文件,不同版本cookie文件地址不同,需要自己找一下

```python
def get_local_cookie_dic(cookie_url):# 获取cookie字典
    UserDataDir = os.environ['LOCALAPPDATA'] + r'\Google\Chrome\User Data'
    LocalStateFilePath = UserDataDir + r'\Local State'
    CookiesFilePath = UserDataDir + r'\Default\Cookies'

    try:
      con = sqlite3.connect(CookiesFilePath)
    except:
      return
    res = con.execute('select host_key,name,encrypted_value from cookies').fetchall()
    con.close()

    cookie = {}
    key = pull_the_key(get_string(LocalStateFilePath))# 获取key
    for i in res:
      cookie_value = DecryptString(key, i)# 解密cookie
      if i == cookie_url:
            if i == 'ptag':
                continue
            cookie] = cookie_value

    return cookie
```

之后获取cookie之后便可尝试下载视频了,我这里的代码都是之前做的一个项目里面用到的,直接搬过来用了

```python
    def get_download_url_list(self):# 获取m3u8文件链接
      video_type = 'movie'
      not_download_list = iqiyi_video_table().search_not_download(video_type)# 获取未下载的视频列表
      for video_info in not_download_list: # 遍历未下载的视频列表
            path = f'{iqiyi_setting_table().get_setting("Video_Path")}/{video_type}/{video_info["video_title"]}.mp4' # 视频保存路径
            params = all_params(video_info['tvid'], video_info['url'])# 获取视频下载链接的参数
            download_list_resp = requests.get('https://cache.video.iqiyi.com/dash', headers=headers, cookies=cookie_dic,
                                              params=params)    # 获取视频下载链接
            m3u8 = download_list_resp.json()['data']['program']['video']['m3u8']
            download_url_list = re.findall('EXTINF:\d+,\n(.*?)\n#', m3u8, re.S)
            if not download_url_list: # 如果下载链接获取失败
                self.download_error_sign.emit(f'{video_info["video_title"]}m3u8下载链接获取失败')
                return
            for index, url in enumerate(download_url_list): # 遍历下载链接列表
                self.video_download(url, path) # 下载视频
                self.download_success_sign.emit(index, len(download_url_list), video_type, video_info['video_title'])
            iqiyi_video_table().update_state(video_info['tvid'], int(time.time() * 1000), 1)
```

```python
    def video_download(self, url, path):
      """
      :param path: 视频保存路径
      :param url: 视频下载的直接地址
      """
      with open(path, mode='ab') as video_file:
            video_count = requests.get(url, headers, cookies=cookie_dic)
            video_file.write(video_count.content)
```

最后下载好的文件

![](教程.assets/image-20231127192637770.png)



=============================================================================================================================================================

Hmily 发表于 2023-11-29 11:29

I D:Alpaca_
邮箱:2513150647@qq.com

申请通过,欢迎光临吾爱破解论坛,期待吾爱破解有你更加精彩,ID和密码自己通过邮件密码找回功能修改,请即时登陆并修改密码!
登陆后请在一周内在此帖报道,否则将删除ID信息。

PS:登录后文章整理一下发到脱壳破解区,还有格式也处理一下吧,论坛支持markdown的,可以点击markdown按钮输入。

Hmily 发表于 2023-12-11 11:06

未报到,账号删除。

发表于 2024-1-10 22:39

Hmily 发表于 2023-12-11 11:06
未报到,账号删除。

我过来回复了好几遍都发不出去啊

Hmily 发表于 2024-1-11 10:50

游客 111.60.108.x 发表于 2024-1-10 22:39
我过来回复了好几遍都发不出去啊

登陆后请在一周内在此帖报道

你连登录都没有,游客报道???自己等开放注册吧,这个渠道只有一次机会。
页: [1]
查看完整版本: 申请会员ID:Alpaca_【未报到,已注销】