1. 本次目标 http://www.qiqi.la/vod-detail-id-46194.html
  2. 目的,down魔道祖师,实现
  3. 前期分析文件得到以下粗略步骤
  4. 1 进入二级页面,找到
  5. <iframe width="100%" height="" src="https://cn2.zuixinbo.com/share/722caafb4825ef5d8670710fa29087cf" frameborder="" allowfullscreen=""></iframe>
  6. 得到网址
  7. 2 访问 https://cn2.zuixinbo.com/share/722caafb4825ef5d8670710fa29087cf
  8. 需要带上协议头
  9. Referer: https://cn2.zuixinbo.com/share/722caafb4825ef5d8670710fa29087cf
  10. User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
  11. 返回另一个页面response_1
  12. 得到文件标题 <title>重新压制魔道祖师 前尘篇02 序章 诛邪(下)福利加长版 高清(480P).qlv</title>
  13. 3 response_1
  14. 得到:var main = "/20180710/4671_a5ef5a19/index.m3u8?sign=b0023d8b455da27a4294b38c7815f7b3";
  15. 拼合网页:https://cn2.zuixinbo.com/20180710/4671_a5ef5a19/index.m3u8?sign=b0023d8b455da27a4294b38c7815f7b3
  16. 访问:得到返回结果
  17. #EXTM3U
  18. #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608
  19. 1000k/hls/index.m3u8
  20. 4 拼合 https://cn2.zuixinbo.com/20180710/4671_a5ef5a19/1000k/hls/index.m3u8
  21. 带协议访问
  22. Referer: https://cn2.zuixinbo.com/share/722caafb4825ef5d8670710fa29087cf
  23. User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
  24. 得到.ts下载文件路径
  25. 分段下载
  26. 5 拼合.ts文件
  27.  
  28. 有空更新完整代码
     2018-10-21
        开始编写代码 

     发现在重新写代码的过程中,发现直接在播放页面就有全部的播放地址,只不过是用usc2的
        编码转换了一下,我们需要把其转换成ansi编码
    2 OK,这下直接拿到播放地址,做一下格式化的工作,进行第2步解析,上面的第一步工作算是白费了一片心思

    3 按照上面步骤依次完成,基本没问题

    

  1. # -*- coding:utf-8 -*-
  2. # @time:2018-10-21 14:43
  3. # @Auther:1043453579@qq.com
  4.  
  5. from urllib.request import Request
  6. from urllib.request import urlopen
  7. import re,time,os
  8. from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
  9.  
  10. static_url_1 = 'http://www.qiqi.la/vod-detail-id-46194.html'
  11. class A(object):
  12. def __init__(self,url,e=15):
  13. self.header= {'user-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
  14. self.path = os.getcwd()
  15. self.e = e
  16. self.static_url='https://cn2.zuixinbo.com'
  17.  
  18. def num_of_e(self,url_2):#进入二级页面
  19. res = urlopen(Request(url=url_2,headers=self.header)).read()
  20. res = res.decode()
  21.  
  22. title = self.take_middle_text(res,'<title>',txt_e='</title>') #标题
  23. var_main=re.search('var main = "(.*?)";',res).group(1) #访问下级地址
  24. if not var_main:
  25. exit()
  26. return {'var_main':var_main,'referer':url_2,'标题':title}
  27.  
  28. def open_3(self,url,referer='',**kwargs):
  29. url=self.static_url+url
  30. a={'Referer': referer}
  31. a.update(self.header)
  32. res = urlopen(Request(url=url,headers=a)).read()
  33. res = res.decode()
  34. _=self.take_middle_text(res,'1080x608','.m3u8')+'.m3u8' #得到ts视频地址
  35. return {'url':_.split(),'regerer1':url}
  36.  
  37. def open_4(self,url,referer1='',**kwargs):
  38. referer=referer1
  39. referer= referer.split('/')
  40. referer=referer[0:-1]
  41. referer.append(*url)
  42. url='/'.join(referer)
  43. print(url)
  44. a = {'Referer': referer1}
  45. a.update(self.header)
  46. res = urlopen(Request(url=url,headers=a)).read()
  47. res = res.decode()
  48. ts_list=[]
  49. for i in res.split('\n'):
  50. try:
  51. if i[0]!='#':
  52. ts_list.append(i)
  53. except:pass
  54. return {'ts_list':ts_list,'url':url}
  55.  
  56. def take_middle_text(self,txt, txt_s, txt_e='', seeks=0, seeke=0):
  57. # 取出中间文本,真返回中间文本,假返回False
  58. # seeks有传参,会按照取前几位取值
  59. # seeke有传参,会按照取后几位取值
  60. try:
  61. if txt_e or seeks or seeke:
  62. pass
  63. else:
  64. raise 1
  65. s_1 = txt.find(txt_s)
  66. if s_1 == -1:
  67. raise 1
  68. l_1 = len(txt_s)
  69. if txt_e:
  70. s_2 = txt.find(txt_e)
  71. if s_1 == -1 or s_2 == -1:
  72. return False
  73. return txt[s_1 + l_1:s_2]
  74. if seeks:
  75. return txt[s_1 - seeks:s_1]
  76. if seeke:
  77. return txt[s_1 + l_1:s_1 + l_1 + seeke]
  78. except:
  79. return '传参错误或未找到传参文本'
  80.  
  81. def down_ts(self,dict,path_1):
  82. url = os.path.dirname(dict['url'])+'/'
  83. ts_list=dict['ts_list']
  84. for i in ts_list:
  85. print(path_1,'这里是path_1')
  86. path = os.path.join(path_1, i)
  87. print(path,'这里是path_ts文件网址')
  88. if os.path.exists(path):
  89. print('已存在,跳过')
  90. else:
  91. try:
  92. res = urlopen(Request(url=url+i,headers=self.header)).read()
  93. with open(path,'wb') as f:
  94. f.write(res)
  95. print('成功写入一条')
  96. except:
  97. print('写入失败')
  98.  
  99. def main(self,url):
  100. dict_1 = self.num_of_e(url) #'这里返回一个字典 '
  101. dict_2 = self.open_3(dict_1['var_main'],dict_1['referer'])
  102. dict_3 = self.open_4(dict_2['url'], dict_2['regerer1']) #这里的url未提纯
  103. title = dict_1['标题']
  104. path = os.path.join(self.path,title)
  105. #@print(title,'这里是标题')
  106. if not os.path.exists(path):
  107. os.mkdir(path) #没有就创建一个新的目录
  108. self.down_ts(dict_3,path)
  109.  
  110. if __name__ == '__main__':
  111.  
  112. ex = ProcessPoolExecutor(2)
  113. a_1 = A(static_url_1, 15)
  114. with open('2.txt', 'r', encoding='utf8') as f:
  115. for i in f:
  116. a = i.split()[0].split('$')[1].split('#')[0]
  117. print(ex.submit(a_1.main,a).result())
  118. ex.shutdown()

---第一版,用双进程当作并发,代理未加,隔几天再优化一下,先这样吧

2018-10-30

  1. # -*- coding:utf-8 -*-
  2. # @time:2018-10-21 14:43
  3. # @Auther:1043453579@qq.com
  4.  
  5. from urllib.request import Request
  6. from urllib.request import urlopen
  7. import re,time,os
  8. from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
  9.  
  10. static_url_1 = 'http://www.qiqi.la/vod-detail-id-46194.html'
  11. class A(object):
  12. def __init__(self):
  13. self.header= {'user-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
  14. self.path = os.getcwd()
  15. #self.static_url='https://cn2.zuixinbo.com'
  16. self.static_url = ''
  17. #self.r = redis.Redis(host='127.0.0.1',port=6379,db=0)
  18.  
  19. def get_proxy(self):
  20. return {'http':self.r.randomkey().deocode()}
  21.  
  22. def down_1(self,url,referer='',code=True):
  23. while True:
  24. #proxy = self.get_proxy()
  25. #这里设置代理
  26. try:
  27. _ = self.header
  28. if referer:
  29. a = {'Referer': referer}
  30. _.update(a)
  31. res = urlopen(Request(url=url, headers=_),timeout=60).read()
  32. if code:
  33. res = res.decode()
  34. if res:
  35. time.sleep(1)
  36. return res
  37. else:
  38. raise 1
  39. except Exception as e:
  40. print('请求失败',url)
  41. with open('3.txt','a+') as f:
  42. f.write(url)
  43. f.write('\n')
  44. time.sleep(10)
  45.  
  46. def num_of_e(self,url_2):#进入二级页面
  47. res = self.down_1(url_2)
  48. title = self.take_middle_text(res,'<title>',txt_e='</title>') #标题
  49. var_main=re.search('var main = "(.*?)";',res).group(1) #访问下级地址
  50. if not var_main:
  51. exit()
  52. return {'var_main':var_main,'referer':url_2,'标题':title}
  53.  
  54. def open_3(self,url,referer='',**kwargs):
  55. url=self.static_url+url
  56. res = self.down_1(url,referer=referer)
  57. _=self.take_middle_text(res,'1080x608','.m3u8')+'.m3u8' #得到ts视频地址
  58. return {'url':_.split(),'regerer1':url}
  59.  
  60. def open_4(self,url,referer1='',**kwargs):
  61. referer=referer1
  62. referer= referer.split('/')
  63. referer=referer[0:-1]
  64. referer.append(*url)
  65. url='/'.join(referer)
  66. print(url)
  67. res = self.down_1(url,referer=referer1)
  68. ts_list=[]
  69. for i in res.split('\n'):
  70. try:
  71. if i[0]!='#':
  72. ts_list.append(i)
  73. except:pass
  74. return {'ts_list':ts_list,'url':url}
  75.  
  76. def take_middle_text(self,txt, txt_s, txt_e='', seeks=0, seeke=0):
  77. # 取出中间文本,真返回中间文本,假返回False
  78. # seeks有传参,会按照取前几位取值
  79. # seeke有传参,会按照取后几位取值
  80. try:
  81. if txt_e or seeks or seeke:
  82. pass
  83. else:
  84. raise 1
  85. s_1 = txt.find(txt_s)
  86. if s_1 == -1:
  87. raise 1
  88. l_1 = len(txt_s)
  89. if txt_e:
  90. s_2 = txt.find(txt_e)
  91. if s_1 == -1 or s_2 == -1:
  92. return False
  93. return txt[s_1 + l_1:s_2]
  94. if seeks:
  95. return txt[s_1 - seeks:s_1]
  96. if seeke:
  97. return txt[s_1 + l_1:s_1 + l_1 + seeke]
  98. except:
  99. return '传参错误或未找到传参文本'
  100.  
  101. def down_ts(self,dict,path_1):
  102. url = os.path.dirname(dict['url'])+'/'
  103. ts_list=dict['ts_list']
  104. for i in ts_list:
  105. path = os.path.join(path_1, i)
  106. if os.path.exists(path):
  107. print('已存在,跳过',i)
  108. else:
  109. try:
  110. res = urlopen(Request(url=url+i,headers=self.header),timeout=60).read()
  111. time.sleep(1)
  112. if res:
  113. with open(path,'wb') as f:
  114. f.write(res)
  115. print('成功写入一条',i)
  116. else:
  117. raise 1
  118. except Exception as e:
  119. with open('3.txt','a+') as f:
  120. _ = '-'.join([str(i) for i in time.localtime()[0:6]])
  121. f.write(_ +'###'+e+'$$$'+url)
  122. f.write('\n')
  123. print('写入失败',i,e)
  124. time.sleep(5)
  125.  
  126. def main(self,url):
  127. _ = url.split('com')
  128. self.static_url=_[0]+'com'
  129. dict_1 = self.num_of_e(url) #'这里返回一个字典 '
  130. dict_2 = self.open_3(dict_1['var_main'],dict_1['referer'])
  131. dict_3 = self.open_4(dict_2['url'], dict_2['regerer1']) #这里的url未提纯
  132. title = dict_1['标题']
  133. path = os.path.join(self.path,title)
  134. #@print(title,'这里是标题')
  135. if not os.path.exists(path):
  136. os.mkdir(path) #没有就创建一个新的目录
  137. self.down_ts(dict_3,path)
  138.  
  139. if __name__ == '__main__':
  140. ex = ProcessPoolExecutor(3)
  141. a_1 = A()
  142. with open('2.txt', 'r', encoding='utf8') as f:
  143. for i in f:
  144. a = i.split()[0].split('$')[1].split('#')[0]
  145. ex.submit(a_1.main,a)
  146. ex.shutdown()
  147.  
  148. #BUG在网页的提交网址中

--代理未加,需要的请自行加上代理,稍微优化了一下,里面的2.txt是下载地址,见下面

  1. 01$https://cn2.zuixinbo.com/share/722caafb4825ef5d8670710fa29087cf#
  2. 02$https://cn2.zuixinbo.com/share/fbad540b2f3b5638a9be9aa6a4d8e450#
  3. 03$https://v-xunlei.com/share/c457d7ae48d08a6b84bc0b1b9bd7d474#
  4. 04$https://v-xunlei.com/share/8db1d4a631a6e9a24e2c0e842e1f1772#
  5. 05$https://v-xunlei.com/share/197f76fe309657064dbec74d9eea4be4#
  6. 06$https://v-xunlei.com/share/92b70a527191ca64ca2df1cc32142646#
  7. 07$https://v-xunlei.com/share/abc99d6b9938aa86d1f30f8ee0fd169f#
  8. 08$https://v-xunlei.com/share/22cdb13a83f73ccd1f79ffaf607b0621#
  9. 09$https://v-xunlei.com/share/aceacd5df18526f1d96ee1b9714e95eb#
  10. 10$https://v-6-cn.com/share/075b051ec3d22dac7b33f788da631fd4#
  11. 11$https://v-6-cn.com/share/4670c07872d5314c6ad6ffa633d4a059#
  12. 12$https://v-xunlei.com/share/2bba9f4124283edd644799e0cecd45ca#
  13. 13$https://v-cntv-cn.com/share/d87aa42cd08ba8612664a73dbdb64221#
  14. 14$https://v-cntv-cn.com/share/63ceea56ae1563b4477506246829b386#
  15. 15$https://v-cntv-cn.com/share/e8a69bf65aefc23d0f360ab695e9eac7

--这里是下载地址

2020-05-02

  1. # -*- coding:utf-8 -*-
  2. # @time:2018-10-21 14:43
  3. # @Auther:1043453579@qq.com
  4.  
  5. from urllib.request import Request
  6. from urllib.request import urlopen
  7. import re, os
  8.  
  9. class A(object):
  10. def __init__(self):
  11. self.header = {
  12. 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36',
  13. #':authority':'m3u8.xingc.vip'
  14. }
  15. self.path = os.getcwd()
  16. # self.static_url='https://cn2.zuixinbo.com'
  17. self.static_url = ''
  18. # self.r = redis.Redis(host='127.0.0.1',port=6379,db=0)
  19.  
  20. def get_proxy(self):
  21. return {'http': self.r.randomkey().deocode()}
  22.  
  23. def down_1(self, url, referer='', code=True):
  24. while True:
  25. # proxy = self.get_proxy()
  26. # 这里设置代理
  27. try:
  28. _ = self.header
  29. if referer:
  30. a = {'Referer': referer}
  31. _.update(a)
  32. res = urlopen(Request(url=url, headers=_), timeout=5).read()
  33. if code:
  34. res = res.decode()
  35. if res:
  36. return res
  37. else:
  38. raise 1
  39. except Exception as e:
  40. print('请求失败', url)
  41.  
  42. def num_of_e(self, url_2): # 进入二级页面
  43. res = self.down_1(url_2)
  44. if res:
  45. return res
  46. else:
  47. return None
  48.  
  49. def take_middle_text(self, txt, txt_s, txt_e='', seeks=0, seeke=0):
  50. # 取出中间文本,真返回中间文本,假返回False
  51. # seeks有传参,会按照取前几位取值
  52. # seeke有传参,会按照取后几位取值
  53. try:
  54. if txt_e or seeks or seeke:
  55. pass
  56. else:
  57. raise 1
  58. s_1 = txt.find(txt_s)
  59. if s_1 == -1:
  60. raise 1
  61. l_1 = len(txt_s)
  62. if txt_e:
  63. s_2 = txt.find(txt_e)
  64. if s_1 == -1 or s_2 == -1:
  65. return False
  66. return txt[s_1 + l_1:s_2]
  67. if seeks:
  68. return txt[s_1 - seeks:s_1]
  69. if seeke:
  70. return txt[s_1 + l_1:s_1 + l_1 + seeke]
  71. except:
  72. return '传参错误或未找到传参文本'
  73.  
  74. def down_ts(self, list_1, path_1,url,temp_int):
  75. import requests
  76. for i in list_1:
  77. path = os.path.join(path_1, i)
  78. if os.path.exists(path):
  79. print('已存在,跳过', i)
  80. else:
  81. while True:
  82. try:
  83. res = requests.get(url=url + i, headers=self.header,timeout=5)
  84. if res:
  85. with open(path, 'wb') as f:
  86. f.write(res.content)
  87. print('成功写入一条', i,temp_int)
  88. break
  89. except Exception as e:
  90. print('requests写入失败',temp_int)
  91.  
  92. def main(self, url,title):
  93. _ = url.split('/')
  94. _url="/".join(_[0:-1])+"/"
  95. dict_1 = self.num_of_e(url) # '这里返回m3u8的内容'
  96. m3u8_list=re.findall('\d+.ts',dict_1)
  97. print(m3u8_list)
  98. path = os.path.join(self.path, title)
  99. if not os.path.exists(path):
  100. os.mkdir(path) # 没有就创建一个新的目录
  101. self.down_ts(m3u8_list, path,_url,len(m3u8_list))
  102.  
  103. if __name__ == '__main__':
  104. #ex = ProcessPoolExecutor(3)
  105. a_1 = A()
  106. a='https:***/index.m3u8'
  107. a_1.main(a,'name')

m3u8单文件,单线程下载(去代理)

2020-05-22 02:31:31

发现最近两年的视频基本都做了加密措施,综合网上的帖子,没有啥值得使用的地方,于此写下

aes-128加密系列 :男人的小视频梦想

使用工具:winhex

使用库命令:binascii.b2a_hex("二进文本")

有一朋友问我,一个小视频APP站做加密,怎么解不出来

m3u8文件上小图,如下:

解密如下:

好的,代码就不发了,自行根据上面的代码进行整改,解密代码如下

  1. import binascii
  2. from Crypto.Cipher import AES
  3. with open('0.ts','rb+') as f:
  4. a = f.read()
  5. print(len(a)%16) #取余为0 就加16位,不为0 就加(16-余数)
  6. a=a+b'\00'*16 #取余为0 就加16位,不为0 就加(16-余数)
  7. print(a)
  8. cryptos = AES.new(binascii.a2b_hex('5a43c7619623bc347fa7dcea3ddfb1b2'), AES.MODE_CBC,bytes.fromhex('3e420d580bd9244dd608850e0dec7ac8'))
  9. c= cryptos.decrypt(a)
  10. with open('0_2.ts','wb') as c1:
  11. c1.write(c)

--解密AES

m3u8系列(一)练手spider的更多相关文章

  1. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  2. 适合Python的5大练手项目, 你练了么?

    在练手项目的选择上,还存在疑问?不知道要从哪种项目先下手? 首先有两点建议: 最好不要写太应用的程序练手,要思考什么更像是知识,老只会写写爬虫是无用的,但是完全不写也不行. 对于练手的程序,要注意简化 ...

  3. 适合Python 新手的5大练手项目,你练了么?

    接下来就给大家介绍几种适合新手的练手项目. 0.算法系列-排序与查找 Python写swap很方便,就一句话(a, b = b, a),于是写基于比较的排序能短小精悍.刚上手一门新语言练算法最合适不过 ...

  4. 70个Python练手项目列表(都有完整教程)

    前言: 不管学习那门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从 ...

  5. 10个Python基础练习项目,你可能不会想到练手教程还这么有趣

    美国20世纪最重要的实用主义哲学家约翰·杜威提出一个学习方法,叫做:Learning By Doing,在实践中精进.胡适.陶行知.张伯苓.蒋梦麟等都曾是他的学生,杜威的哲学也影响了蔡元培.晏阳初等人 ...

  6. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  7. python新手70个练手项目

    不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行. 这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自 ...

  8. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  9. Cocos2d-Lua (练手) 微信打飞机

    学习下lua,目前入门级,使用版本为 v3.3 Final For Win,空闲时间不足,只能断断续续写点东西.   一.子弹效果          子弹只做了一种,扇形发射,可以增加扇形大小,子弹的 ...

随机推荐

  1. PAT 甲级 1038 Recover the Smallest Number (30 分)(思维题,贪心)

    1038 Recover the Smallest Number (30 分)   Given a collection of number segments, you are supposed to ...

  2. ElasticSearch——Curator索引管理

    简介 curator 是一个官方的,可以管理elasticsearch索引的工具,可以实现创建,删除,段合并等等操作.详见官方文档 功能 curator允许对索引和快照执行许多不同的操作,包括: 从别 ...

  3. (十四)用session和过滤器方法检验用户是否登录

    一.session方法 1.1 编写登录页面文件(index.html) <!doctype html> <html> <head> <title>测试 ...

  4. python面向对象之类属性,实例属性

    python中的属性分为类属性和实例属性,之前已经说过一些,这里主要是对类属性与实例属性的增删改查 首先是对类属性的增删改查,下面这个是对类属性的修改,在书写类时,已经对类属性occupation进行 ...

  5. 第二十章 无状态Web应用集成——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 在一些环境中,可能需要把Web应用做成无状态的,即服务器端无状态,就是说服务器端不会存储像会话这种东西,而是每次请求时带上相应的用户名进行登录.如一些REST风格的AP ...

  6. gocheck框架

    1.  引用包 :  gocheck "gopkg.in/check.v1" 2. 自动化测试入口   :Test_run(t *testing.T) 3. 将自定义的测试用例集, ...

  7. charles 新的修改请求

    本文参考:charles 新的修改请求 compose New 是新出一个弹窗,自己手动一个个的去写: 可以写各种状态: – URL: – Method: – GET – POST – PUT – D ...

  8. go项目部署到linxu

    环境: 在mac上编译, 编译后上传到linux, 然后运行代码 go项目打包 一.直接部署到linux 1. 在mac上, 进入到项目目录, 执行以下命令, 进行编译: CGO_ENABLED=0 ...

  9. el-table中通过renderHeader方法为表头添加hover等效果

    在我们的日常工作中有时候需要为element表格的表头进行自定义操作.在element官网中也有提到renderHeader方法.但是并未给出具体实现方法.现在具体说一下. 在element官网(ht ...

  10. Kali中安装VMwaretools

    VMware Workstation 中 虚拟机选项,安装VMware Tools 选项. 在虚拟机中,打开VMware Tools,将 VMwareTools-10.1.15-6627299.tar ...