前言
用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模拟新浪微博登录和发布文章的部分,希望大家多多关注。
【蝴蝶效应-虎】