2019独角兽企业重金招聘Python工程师标准>>>

使用工具charles,主要是用来获取访问的API数据的,为啥说初级呢,因为并没有解决mas加密,这样的话只能刷到50条新数据,然后mas就失效了

之前有篇文章 抖音API分析 大概梳理了视频地址获取方式,懒得继续写,正好最近又有兴趣,继续续上

现在既然都分析清楚了,下面就是模拟客户端获取数据下载了

private static String url = "https://aweme.snssdk.com/aweme/v1/feed/?iid=32142611788&ac=4G&os_api=18&app_name=aweme&channel=App%20Store&idfa=67642C64-6404-403A-8B0D-31A059C3A2BD&device_platform=iphone&build_number=17909&vid=9D61EDED-6680-471A-A134-D1C96399BB83&openudid=9a661cd28951ab44f0870508f7af64dfb9b5dc36&device_type=iPhone8,2&app_version=1.7.9&device_id=50862505508&version_code=1.7.9&os_version=10.2.1&screen_width=1125&aid=1128&count=6&feed_style=0&max_cursor=0&min_cursor=0&pull_type=0&type=0&user_id=96840867747&volume=0.00&mas=000171d64eb699219ac45f410bcc83d1accd3ee629e6ec51f8ceb1&as=a1859114c0ed4b50731900&ts=1531121872";public static void main(String[] args) throws Exception{CloseableHttpClient httpClient = org.apache.http.impl.client.HttpClients.createDefault();RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000).build();HttpGet get = new HttpGet(url);get.setConfig(requestConfig);get.setHeader("Accept","*/*");get.setHeader("User-Agent","Aweme/1.7.9 (iPhone; iOS 10.2.1; Scale/3.00)");get.setHeader("Cookie","这里填写个人自己的cookie");CloseableHttpResponse response = httpClient.execute(get);HttpEntity entity = response.getEntity();String content = EntityUtils.toString(entity, "gbk");JSONObject jsonObject = JSON.parseObject(content);if(jsonObject.getInteger("status_code") == 0){JSONArray jsonArray = jsonObject.getJSONArray("aweme_list");for(int i=0;i<5;i++){JSONObject detail = jsonArray.getJSONObject(i);String url = detail.getJSONObject("video").getJSONObject("play_addr_lowbr").getJSONArray("url_list").get(0).toString();System.out.println(url);}}else{System.out.println("is not 0");System.exit(0);}}

跑出来的就是

然后怎么用呢,看下对应的api

其实相当于根据视频的一些唯一标识去获取对应的视频真实地址,本来想用jsoup,想想这么简单整个正则得了

String str = "<a href=\"http://v3-dy-x.ixigua.com/1fc1320a2829de5164add4678abf2192/5b431eef/video/m/220785bb6e0882346e8aff9b7613756f4e71158d06e000055b44e3f1db4/\">Found</a>.";String regEx = "href=\"(.*?)\">";Pattern pattern = Pattern.compile(regEx);Matcher matcher = pattern.matcher(str);if(matcher.find()){System.out.println(matcher.group(1));}

小插曲,使用httpclient访问的时候,接受到302后自动跳转了,我说怎么一个简单的代码跑的时间感觉有点长呢,禁用302跳转就好了

private static String filePath = "/Users/xingzhe/douyin";private static String url = "https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200f660000bctojepcgf31ghmrsmdg&line=0&ratio=720p&media_type=4&vr_type=0&test_cdn=None&improve_bitrate=0";public static void main(String[] args) throws Exception{CloseableHttpClient httpClient = org.apache.http.impl.client.HttpClients.createDefault();RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(15000).setConnectTimeout(15000).setRedirectsEnabled(false).build();HttpGet get = new HttpGet(url);get.setConfig(requestConfig);get.setHeader("Accept","*/*");get.setHeader("User-Agent","Aweme/1.7.9 (iPhone; iOS 10.2.1; Scale/3.00)");CloseableHttpResponse response = httpClient.execute(get);System.out.println(response.getStatusLine().getStatusCode());if(response.getStatusLine().getStatusCode() != 302){System.exit(0);}HttpEntity entity = response.getEntity();String content = EntityUtils.toString(entity, "gbk");String detail = getVideo(content);download(detail);}private static String getVideo(String str){String regEx = "href=\"(.*?)\">";// 编译正则表达式Pattern pattern = Pattern.compile(regEx);// 忽略大小写的写法// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(str);if(matcher.find()){return matcher.group(1);}return null;}private static void download(String videoUrl) throws Exception{// 构造URLURL url = new URL(videoUrl);// 打开连接URLConnection con = url.openConnection();//设置请求超时为5scon.setConnectTimeout(5*1000);// 输入流InputStream is = con.getInputStream();// 1K的数据缓冲byte[] bs = new byte[1024];// 读取到的数据长度int len;// 输出的文件流File sf=new File(filePath);long time = System.currentTimeMillis()/1000;OutputStream os = new FileOutputStream(sf.getPath()+"/"+time+".mp4");// 开始读取while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}// 完毕,关闭所有链接os.close();is.close();}

用上面这个代码就能下载到视频了,写的很随意主要就是完成功能,视频的文件名都直接用的时间戳,批量的话也简单,for循环一下就行,随便搞了下

记录一个小问题,最开始下载使用的 url.openConnection() 这种最原始的方式,下了一会发现403了,又转回使用httpclient下载,get方法加上header,主要是

User-Agent Aweme/1.7.9 (iPhone; iOS 10.2.1; Scale/3.00)

没再出现403

代码所有需要访问url的地方都直接重新new一个httpclient,其他的对象也没有复用也没有排重,下载也没有多线程,娱乐之作,爬抖音最重要的还是在as和mas的生成,因为我测试发现大概下载60或者多少的时候就会返回"status_code": 2151,需要重新抓包搞下mas和as,显然对效率来说是不可接受的,以后再有时间研究下as的生成方式,就这样了

转载于:https://my.oschina.net/u/943305/blog/1843005

抖音API分析,视频批量下载-初级相关推荐

  1. 抖音无水印视频批量下载

  2. 抖音快手短视频批量去水印采集软件v1.8使用文档

    本文的旨在教您如何快速学会使用由哼哼猫去水印提供的抖音快手短视频批量去水印采集软件v1.8版本. 一.下载和安装软件 前往官方下载地址( http://jx.henghengmao.com/page/ ...

  3. 用Python下载抖音无水印视频!

    不知不觉距离小F最开始写的一篇抖音文章,时间也过了一年. 用Python全自动下载抖音视频! 上面这一篇阅读量是所有文章中阅读量最高的,当然还有另外两篇相关的. 用Python生成抖音字符视频! 用数 ...

  4. Python 抖音无水印视频下载

    引言 上篇文章讲到抖音首页视频的爬取和下载,于是我想到能不能下载特定的视频.网上搜索一番,发现有网站提供抖音无水印视频的下载,但是试了几个,发现下载下来都还是有水印的视频.上篇文章已经实现了首页无水印 ...

  5. 关于抖音抓包的一些分析和抖音视频批量下载

    上一篇介绍了抓包软件的使用: Fiddler+夜神模拟器+xposed+justTrustMe手机抓包 这一篇介绍下对抖音里**"喜欢"**的视频批量下载,和一些分析. 1.根据上 ...

  6. 爬虫进阶教程:抖音APP无水印视频批量下载

    一.前言 本文为两类人准备:技术控和工具控. 如果你是工具控,想简单方便地下载无水印的视频,那么可以使用第三方去水印平台: 抖音短视频解析下载平台 如果你是技术控,想要使用自己写的代码下载视频,那么可 ...

  7. video downloadhelper 无时间限制_Python实现超简单【抖音】无水印视频批量下载

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:python乱炖 转载: Python实现超简单[抖音]无水印视频批 ...

  8. php+api抖音随机播放视频源码

    简介: php+api抖音随机播放视频源码,前端纯静态html+css,数据采用php+API接口调用第三方数据,不需要配置环境,上传即用. 源码体积小,视频采集自网络,无视频资源,内置多条播放线路. ...

  9. 用 Python 下载抖音无水印视频

    说起抖音,大家或多或少应该都接触过,如果大家在上面下载过视频,一定知道我们下载的视频是带有水印的,那么我们有什么方式下载不带水印的视频呢?其实用 Python 就可以做到,下面我们来看一下. 很多人学 ...

最新文章

  1. SpringMVC如何实现restful接口
  2. @Async in Spring--转
  3. 实训总结_实训总结汇报!
  4. python插入排序_python 插入排序,选择排序
  5. 迈克尔·戴尔再次到访2019戴尔科技峰会,为“戴尔中国4.0+战略”加个码……
  6. 故宫4天门票已售罄 五一假期大家都去哪儿“看一看”了?
  7. Non-resolvable parent POM for com.supermarket:supermarket:0.0.1-SNAPSHOT: Could not transfer artifac
  8. 恶意广告活动利用 WebKit 0day 实施欺诈
  9. Reinforcement Learning(001)
  10. 项目质量监测(三)e2e test端到端测试——单元测试和端到端测试 e2e test工具-Cypress Nightwatch TeatCafe Codecov-测试结果可视化
  11. android 极简浏览器,盘点最干净简洁的手机浏览器,到底哪个最好用?
  12. 互联网保险投诉量翻倍 众安与安心财险上榜
  13. 中间件技术及双十一实践·EagleEye篇
  14. rxjava面试题,android教程零基础入门
  15. 使用 zk-SNARK 的可编程零知识证明:第 1 部分
  16. DAMO-YOLO全流程代码解读
  17. cmd命令行窗口调整大小
  18. STM32F103C8T6————GPIO工作模式及其部分函数
  19. java盖金字塔的游戏,最强大脑积木金字塔
  20. 如何学习一门新的编程语言

热门文章

  1. 使用Xamarin开发(一)安装配置
  2. 使用”网上办税厅”节约大厅办税时间的技巧
  3. python爬虫之爱思助手音乐爬取
  4. 电子商务网站之购买欲望和购买目标
  5. 文樾杰出五金交电进销存管理系统 v6.12 下载
  6. 宠物医院小程序开发,轻松引流
  7. dedecms模板定制之如何自定义标签
  8. 【技术美术图形部分】纹理基础1.0-纹理管线
  9. 蜘蛛和露珠的故事(得不到的和失去的)
  10. spring使用ExcludeFilter和IncludeFilter