前言
用Java HttpClient模拟今日头条发布视频,登陆,获取文章列表,发布文章,发布图片和视频的分享,已经接近于尾声了,这是最后一篇关于今日头条发布文章的分享了,不过学习和研究永远是没有止步的,如果有兴趣的同学,欢迎留言啦。这篇文章中,主要是来分享,如何来使用HttpClient模拟发布今日头条的视频文章。
从上面图片中,可以看到,今日头条中,有很多文章,是视频类型的,包括一些游戏视频,电视剧剪辑,电影花絮等,那要怎么用java模拟在今日头条中发布视频呢? 今天的分享,就此开始。
分析及代码
Java模拟今日头条发布视频,其实视频文章的封面发布方式,和上一篇文章中((HttpClient技术)(今日头条系列)HttpClient发布图集)分享的发布图片的方式是一模一样的,通过抓包,可以看到,没有任何差异,封面的上传方式,请参考文章中的上传图片代码部分,这里主要分享,如何发布视频。从抓包来看,视频不是一次性上传成功的,而是通过分段上传的,当然通过测试发现,一次性也是可以成功的,就是需要的时间比较久而已。
实际测试发现,一次性上传和分段上传,没有任何差异,我这里就偷个懒,分享一次性上传的代码,如果有想研究Java HttpClient模拟分段发布视频的代码,我后面会分享一个新浪微博模拟发布视频的代码,它就是分段的形式。
模拟上传视频
System.out.println("上传视频大小:"+ filesize + ",每次网站允许上传大小" + 10485759) ; while(isNotFinished){ System.out.println("分段上传视频") ; long start = 0 ; g4 = new HttpOptions(upload_url) ; g4.setHeader("Accept", "*/*") ; g4.setHeader("Origin", "https://mp.toutiao.com") ; g4.setHeader("Access-Control-Request-Method", "POST") ; g4.setHeader("Access-Control-Request-Headers", "content-range, content-type") ; g4.setHeader("Connection", "Keep-Alive") ; g4.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko") ; response2 = httpClient.execute(g4); if(response2.getStatusLine().getStatusCode() == 204){ g3 = new HttpPost(upload_url) ; FileBody bin = new FileBody(updateFile, updateFile.getName(), "application/octet-stream", "UTF-8") ; MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("video_file", bin);//file1为请求后台的File upload;属性 g3.setEntity(reqEntity); response2 = httpClient.execute(g3); sg1 = EntityUtils.toString(response2.getEntity(),"utf-8") ; System.out.println("分段上传视频结果:"+sg1) ; if(response2.getStatusLine().getStatusCode() == 200 && sg1.indexOf("\"message\":\"success\"")!=-1 && sg1.indexOf("expect_bytes")!=-1 ){ String expect_bytes = "" ; sg1 = sg1.substring(sg1.indexOf("expect_bytes")+14) ; expect_bytes = sg1.substring(0, sg1.indexOf(",")) ; if(expect_bytes.equals("-1")){ System.out.println("上传视频完毕!") ; break ; } } } }
视频发布upload_url,是在进入发布页面的时候获取到的,在发布页面的Html中有upload_url和upload_id两个属性,需要事先获取到,然后通过upload_url上传视频,成功后,在提交的时候会用到upload_id.
发布视频
g3 = new HttpPost("https://mp.toutiao.com/core/article/edit_article_post/?source=mp&type=purevideo") ; g3.setHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*") ; g3.setHeader("X-CSRFToken", "undefined") ; g3.setHeader("X-Requested-With", "XMLHttpRequest") ; g3.setHeader("Accept-Language", "zh-CN") ; g3.setHeader("Cache-Control", "no-cache") ; g3.setHeader("Connection", "Keep-Alive") ; g3.setHeader("Referer", "https://mp.toutiao.com/profile_v2/publish") ; g3.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko") ; g3.setHeader("Content-Type", "application/x-www-form-urlencoded") ; //这里的upload_id是刚进入页面的时候获取到的 String formatContent = "<p>{!-- PGC_VIDEO:{\"sp\":\"toutiao\",\"vid\":\"" +upload_id+"\",\"vu\":\""+upload_id+"\",\"thumb_url\":\""+original+"\",\"vname\":\""+title+"\"} --}</p>" ; List<NameValuePair> qparams = new ArrayList<NameValuePair>(); qparams.add(new BasicNameValuePair("article_type","1")); //0 文章 1:视频 qparams.add(new BasicNameValuePair("title", title)); qparams.add(new BasicNameValuePair("abstract", title)); qparams.add(new BasicNameValuePair("tag","")); qparams.add(new BasicNameValuePair("extern_link","")); qparams.add(new BasicNameValuePair("is_fans_article","0")); qparams.add(new BasicNameValuePair("content", formatContent)); qparams.add(new BasicNameValuePair("add_third_title","0")); qparams.add(new BasicNameValuePair("timer_status", isImediate? "0" : "1")); //0立刻发送 1 定时发送 qparams.add(new BasicNameValuePair("timer_time", publishTime)); // 必须24小时之内 qparams.add(new BasicNameValuePair("recommend_auto_analyse","0")); qparams.add(new BasicNameValuePair("article_label","")); qparams.add(new BasicNameValuePair("from_diagnosis","0")); qparams.add(new BasicNameValuePair("article_ad_type", "2")); qparams.add(new BasicNameValuePair("praise", "0")); qparams.add(new BasicNameValuePair("pgc_debut", "0")); qparams.add(new BasicNameValuePair("save","1")); UrlEncodedFormEntity params = new UrlEncodedFormEntity(qparams, "UTF-8"); g3.setEntity(params); response2 = httpClient.execute(g3); sg1 = EntityUtils.toString(response2.getEntity(),"utf-8") ; sg1 = StringRandomUtils.unicodeToString(sg1) ; System.out.println(sg1);
模拟提交后,后台可以正常看到发布的视频,其实从抓包和分析来看,模拟发布视频部分的代码,要比发布图片文章的部分复杂一些,当然发布视频的,整体模拟过程,需要的时间要久很多。
小结
使用Java HttpClient模拟头条部分,已经全部分享结束了,后面会接着分享,使用Java HttpClient模拟新浪微博登录和发布文章的部分,希望大家多多关注。