为什么80%的码农都做不了架构师?>>>   hot3.png

昨天看微博发现一个有趣的视频。
视频

然后看了很感动,想下载下来收藏。所以点微博视频进去看了一下,就到了http://video.weibo.com/show?fid=1034:0e906d53094c5d231bf09028af8ba9b1这个链接,打开网页源代码看了一下:

<!doctype html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta id="viewport" name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,minimal-ui"><link class="style" rel="stylesheet" href="http://img.t.sinajs.cn/t4/appstyle/photo/css/pages/miaopai.css?v2"><title>视频</title></head><body><div style="margin:0 auto;text-align:center"><embed type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" quality="high" pluginspage="http://get.adobe.com/cn/flashplayer/" height="480" width="480" src="http://js.t.sinajs.cn/t5/album/static/swf/video/player.swf?_v122326477820508684050" flashvars="list=http%3A%2F%2Fus.sinaimg.cn%2F003BqToKjx06PK8lOidW0104010000220k01.m3u8%3FKID%3Dunistore%2Cvideo%26Expires%3D1423376348%26ssig%3Dvuz2N%252FMVtm" /></div></body></html>

发现播放的是flashvars="list=http%3A%2F%2Fus.sinaimg.cn%2F003BqToKjx06PK8lOidW0104010000220k01.m3u8%3FKID%3Dunistore%2Cvideo%26Expires%3D1423376348%26ssig%3Dvuz2N%252FMVtm"这样一个m3u8文件,不说了,先把m3u8列表下载下来看看,不看不知道,一看吓一跳,原来是个完整的mp4文件。注意上面的链接需要urldecode一下,得到:http://us.sinaimg.cn/003BqToKjx06PK8lOidW0104010000220k01.m3u8?KID=unistore,video&Expires=1423376348&ssig=vuz2N%2FMVtm

#EXTM3U#EXT-X-VERSION:3#EXT-X-TARGETDURATION:207#EXTINF:206.640000,000KDKzUjx06PK8lMcpx01040100JzGp0k01.mp4#EXT-X-ENDLIST

那就好办了,直接下载http://us.sinaimg.cn/000KDKzUjx06PK8lMcpx01040100JzGp0k01.mp4就好了。

为了方便下载同类型的视频,小写了一个代码。https://gist.github.com/jemygraw/412a4fd557d875fd3037

package main
//Usage: vsina http://video.weibo.com/show?fid=1034:0e906d53094c5d231bf09028af8ba9b1import ("bufio""fmt""github.com/astaxie/beego/httplib""io""io/ioutil""net/url""os""regexp""strings""time")func help() {fmt.Println("Usage: vsina <VideoUrl>")}func fetch(videoUrl string) {req := httplib.Get(videoUrl)resp, err := req.Response()if err != nil {fmt.Println("fetch video url error,", err)return}defer resp.Body.Close()respData, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("read video url content error,", err)return}pattern := `flashvars="list=.*"`regx := regexp.MustCompile(pattern)flashVars := regx.FindString(string(respData))if flashVars != "" {size := len(flashVars)m3u8Url, err := url.QueryUnescape(flashVars[16 : size-1])if err != nil {fmt.Println(err)} else {fetchMovie(m3u8Url)}} else {fmt.Println("m3u8 playlist not found")}}func fetchMovie(m3u8Url string) {req := httplib.Get(m3u8Url)resp, respErr := req.Response()if respErr != nil {fmt.Println("fetch m3u8 playlist error,", respErr)return}defer resp.Body.Close()respData, readErr := ioutil.ReadAll(resp.Body)if readErr != nil {fmt.Println("read m3u8 playlist content error,", readErr)return}videoFolder := fmt.Sprintf("video_%d", time.Now().Unix())mkdErr := os.Mkdir(videoFolder, 0775)if mkdErr != nil {fmt.Println("mkdir for m3u8 playlist failed,", mkdErr)return}m3u8Uri, _ := url.Parse(m3u8Url)sReader := strings.NewReader(string(respData))bReader := bufio.NewScanner(sReader)bReader.Split(bufio.ScanLines)for bReader.Scan() {line := bReader.Text()if !strings.HasPrefix(line, "#") {tsFileName := linetsLocalFileName := fmt.Sprintf("%s/%s", videoFolder, line)tsFileUrl := fmt.Sprintf("%s://%s/%s", m3u8Uri.Scheme, m3u8Uri.Host, tsFileName)downloadTS(tsFileUrl, tsLocalFileName)}}fmt.Println()fmt.Println("Result:", videoFolder)}func downloadTS(tsFileUrl string, tsLocalFileName string) {fmt.Println("downloading", tsFileUrl)req := httplib.Get(tsFileUrl)resp, respErr := req.Response()if respErr != nil {fmt.Println("download ts ", tsFileUrl, "failed,", respErr)return}defer resp.Body.Close()tsFp, openErr := os.OpenFile(tsLocalFileName, os.O_CREATE|os.O_WRONLY, 0775)if openErr != nil {fmt.Println("open local file", tsLocalFileName, "failed,", openErr)return}defer tsFp.Close()_, copyErr := io.Copy(tsFp, resp.Body)if copyErr != nil {fmt.Println("download ts", tsFileUrl, " failed,", copyErr)}}func main() {argv := os.Argsargc := len(argv)if argc != 2 {help()return}videoUrl := argv[1]fetch(videoUrl)}

转载于:https://my.oschina.net/Jr413/blog/412045

分享一段可以直接下载新浪微博视频的小程序相关推荐

  1. python批量下载b站_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  2. python批量下载bilibili视频_python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ...

  3. 爆款视频生成器小程序开发及抖音分享接入方案

    一.什么是爆款视频生成器 爆款视频生成器,是一款可以帮助抖音用户快速生成爆款视频的工具,可以帮助创作者提供创作灵感,支持爆款文案+热门视频+创意标题等,模板化视频加持,阻力商家流量提升及团单转化. 2 ...

  4. 小程序源码:老年祝福短视频微信小程序源码下载支持流量主

    这是一款相当于是老年人的一个短视频小程序 里面的视频内容基本都是那些老年人喜欢转发的 所以说可以用此来打入老年人的圈子让老年人看了基本都会转发 所以裂变还是挺不错的! 这一款小程序的视频是自动化的 视 ...

  5. 老年祝福短视频微信小程序源码下载支持流量主

    这是一款相当于是老年人的一个短视频小程序 里面的视频内容基本都是那些老年人喜欢转发的 所以说可以用此来打入老年人的圈子让老年人看了基本都会转发 所以裂变还是挺不错的! 这一款小程序的视频是自动化的 视 ...

  6. 分享一款超多功能工具箱组合微信小程序源码_支持流量主,无需服务器和域名!适合小白

    分享一款超多功能工具箱组合微信小程序源码_支持流量主,无需服务器和域名!适合小白操作! 简介: 超多功能工具箱组合微信小程序功能实用性质特别的高,用户还能覆盖的广一些具体功能列表如下: 1.证件照制作 ...

  7. PerfDog 测试腾讯视频、优酷、爱奇艺视频类小程序性能

    自从经朋友介绍PerfDog这款移动端测试神器后就一直在使用它测试大型游戏的流程度,前两天使用腾讯视频追剧分享到微信时发现发现的链接直接进入腾讯视频的小程序中,试了多个视频软件皆是如此,于是想要试试用 ...

  8. 小程序swiper怎么让内容撑开高度_[视频]微信小程序实战优购商城,涵盖你所学的技能点...

    很多友友都在找视频教程学习,IT技术教程分享网[http://www.mano100.cn]已经为你收集了各种各样的视频教程,不用再到处找视频教程学习了.无论是免费的,还是收费的,都在这里了.只要你注 ...

  9. 方便微信公众号征集图片视频的小程序

    作为自媒体运营者,经常需要在公众号上组织一些活动,需要征集视频.征集照片等,原来都是通过公众号后台回复.邮箱等方式完成收集,但是多渠道维护困难,管理起来不方便,需要花费大量的时间去整理作品,汇总投稿人 ...

  10. 短视频社交小程序开发

    我们常见的短视频软件除了一些常用的,还有一些小的小程序,app都很多,因为近几年来短视频可以说是非常的火热,而短视频电商,是集图文,直播后又一个内容电商的重要抓手,短视频电商可以说是下一个电商的流量风 ...

最新文章

  1. 计算概论(A)/基础编程练习1(8题)/4:求一元二次方程的根
  2. 2021-07-15
  3. 每天一道LeetCode-----获取无重复项/有重复项序列的全排列
  4. flash builder4.7 for Mac升级AIRSDK详解
  5. 2021年中国在线旅游直播专题分析
  6. oracle 11gr2 rac价格,调整Oracle 11gR2 RAC为单实例库
  7. javafx将数据库内容输出到tableview表格
  8. 第四天:使用 session cookie redis完善登录验证及登录路由
  9. 【三维路径规划】基于matlab遗传算法无人机三维路径规划【含Matlab源码 1526期】
  10. 套用这套模板,玩转周报、月报、年报更省事
  11. Fujitsu Lifebook U1010安装XP TabletPC 2005完全攻略
  12. 制造业数据安全如何保证?天翎知识文档管理系统+群晖NAS企业级解决方案
  13. 树形DP(放置街灯,uva 10859)
  14. foxmail清除无法清除的未读邮件
  15. Python 在 excel 中画 饼状图 折线图
  16. 深度学习细粒度分类综述
  17. 【有利可图网】PS教程:利用PS分分钟将照片变成中国风古画效果
  18. YAML 语法快速入门(一)
  19. luogu P1373 小a和uim之大逃离
  20. mysql中一条update的执行过程

热门文章

  1. 不二越机器人编程手册_NACHI机器人说明书
  2. 项目研发阶段性总结模板
  3. insert用法小结
  4. c++ insert
  5. word文档中表格计算机功能在哪,word文档筛选功能在哪里
  6. Java8新特性 Stream流式思想(三)
  7. w ndoWs10开机时间长,如何解决Win10正式版开机慢且开机黑屏时间长问题【图文教程】...
  8. throw 关键字,throw 必须写在方法体中,并且 throw new xxxException的话,如果是运行时的异常可以不用管,如果是编译的异常需要进行处理
  9. angelhack_我的团队如何撼动AngelHack Seattle Hackathon
  10. 训练过程loss突然增大可能的原因