微博缓存视频导出自行解决方案

本蒟蒻有个爱好,喜欢保存各个方面的数据,比如录制电视新闻、下载重要网页、抄写消息文章,保存起来 然后放着等长毛,长到3米高就能吃了 。有这么个爱好那自然微博是必去之地,截屏复制截到手疼,更重要的就是下载这个那个微博视频保存起来。而作为手机一族,微博视频的操作很让人迷惑:

如果是竖屏的视频,那好说,直接点右上角三个点,然后保存到手机,接下来就出现在DCIM里了:


然而横屏的视频就很让人迷惑:点开只给了一个“缓存”:

然后也能看到之前缓存的视频:

然而就是不知道这些视频放在哪。。。

。。。。。。。。。。


人不能憋死,于是经过一番地毯式搜索,摸到了这些缓存视频的保存位置——

——在主存储目录下/sina/weibo/.weibo_video_cache_new这个隐藏着的旮旯里。。。

2019-09-21更新:已经改到了sinaweibostoragevideo_download里,cover里是封面图,接下来操作的是video文件夹。

(对了,得先能显示隐藏文件。。。)

里面是一堆文件夹,每个文件夹对应一个视频

每个文件夹里面有一个config.json记录视频信息,还有一个没后缀名的东西

连接电脑,MTP把这些东西搞出来:

那个json,没什么新鲜的:

剩下的这个就是操作对象——用视频播放器打开,直接就能播——
然后我们就看到了这是MPEG4视频。。。

所以理论上来说把这个文件后面加个.mp4就能看了,然而——现在有120个视频等着我收拾。。。
这要从头改到尾,估计手要断。

于是第一反应就是求助批处理,那么我们面临这么些个问题:

  • 文件夹名、视频名都是乱的,怎么能够分别读取每个文件夹的视频并批量搞出来?

第一直观想法是dir,这样可以列出所有下面的东西。

  • 然而dir这种显示格式很小清新,怎么能够从中读出这个那个是什么东西、叫什么名?

dir /?如是说:

显示目录中的文件和子目录列表。

DIR [drive:][path][filename] [/A[[:]attributes]] [/B] [/C] [/D] [/L] [/N]
[/O[[:]sortorder]] [/P] [/Q] [/R] [/S] [/T[[:]timefield]] [/W] [/X] [/4]

[drive:][path][filename]
指定要列出的驱动器、目录和/或文件。

/A 显示具有指定属性的文件。
属性 D 目录 R 只读文件
H 隐藏文件 A 准备存档的文件
S 系统文件 I 无内容索引文件
L 解析点 - 表示“否”的前缀
/B 使用空格式(没有标题信息或摘要)。
/C 在文件大小中显示千位数分隔符。这是默认值。用 /-C 来
禁用分隔符显示。
/D 跟宽式相同,但文件是按栏分类列出的。
/L 用小写。
/N 新的长列表格式,其中文件名在最右边。
/O 用分类顺序列出文件。
排列顺序 N 按名称(字母顺序) S 按大小(从小到大)
E 按扩展名(字母顺序) D 按日期/时间(从先到后)
G 组目录优先 - 反转顺序的前缀
/P 在每个信息屏幕后暂停。
/Q 显示文件所有者。
/R 显示文件的备用数据流。
/S 显示指定目录和所有子目录中的文件。
/T 控制显示或用来分类的时间字符域。
时间段 C 创建时间
A 上次访问时间
W 上次写入的时间
/W 用宽列表格式。
/X 显示为非 8.3 文件名产生的短名称。格式是 /N 的格式,
短名称插在长名称前面。如果没有短名称,在其位置则
显示空白。
/4 用四位数字显示年

可以在 DIRCMD 环境变量中预先设定开关。通过添加前缀 - (破折号)
来替代预先设定的开关。例如,/-W。

那么 /B这个很耐人寻味:

使用空格式(没有标题信息或摘要)。

让咱们试试:

成功单独搞出来了文件名。

  • 有了文件名,怎么根据这些文件名收拾各组数据?

那当然就是for循环。cmd的for很强势,我们在这里用到这条语法:

FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

那么我们就可以这样把这一堆文件名全都写进editlib这么个文件里:

  for /f "delims=" %%i in ('dir /ad/b') do echo %%i>>editlib
::for /f "格式“  %%变量 in ('命令')   do  XXX
::delims:cmd的for循环关键字,相当于用等号后面的那个东西来进行对数据的分割,这里留空就是“换行”,每读到dir输出的一个换行就代表读到了一个文件夹名,可以换下一个写入了
::变量要用两个百分号
::这里的命令就是dir,/ad就是显示完整目录
::最后echo全都写入editlib里。

接下来我们就有了完整的文件夹名列表:

于是接下来的操作就是——

  • 循环按照这个表进去每个文件夹里
  • 删掉config.json
  • 把里面剩下的东西(这个视频)拷出来
  • 把这个文件拷出来放到上一个目录里
  • 回来
  • 删掉这个文件夹。

那么求助C++来写这么个批处理:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	system("cd.>editlib");
	system("cd.>operatorlib.bat");
	system("cd.>controllib.bat");//创建这么三个文件
	FILE * fout;//用fout写文件,写出上面的那套方法到一个批处理里:
	fout=fopen("controllib.bat","wb");
	fprintf(fout,"@echo off
");
	fprintf(fout,"for /f "delims=" %%%%i in ('dir /ad/b') do echo %%%%i>>editlib
");//““拿来转义用免得编译器以为那个双引号是字符串结束,用4个”%“来fprintf 2个百分号。
	fclose(fout);//关文件
	system("controllib.bat");//运行一次,然后就有了editlib这个文件夹列表
	freopen("editlib","r",stdin);//重定向标准输入输出流读这个editlib
	freopen("operatorlib.bat","w",stdout);//按照一定语法输出到另一个批处理operatorlib.bat里,这就是我们实现这一系列骚操作用的批处理:
	string way;//每一个文件夹名
	while(cin>>way)//分行读入
	{
		string outputa=way;//然并卵
		cout<<"cd "<<outputa<<endl;//进到这个文件夹里
		cout<<"del config.json"<<endl;//删掉config.json
		cout<<"for /f "delims=" %%j in ('dir /b/s') do rename %%j "<<way<<".mp4"<<endl;//故伎重演,用dir /s/b就可以搞出来里面唯一的那个文件的文件名和完整路径,放入变量%%j里,然后重命名这个文件。
		cout<<"copy * .."<<endl;//把它拷出来
		cout<<"cd .."<<endl;//回来
		cout<<"rmdir /s/q "<<outputa<<endl;//删掉那个文件夹,准备收拾下一个。
	}
	fclose(stdin);
	fclose(stdout);//关文件
	system("operatorlib.bat");//运行一下这个批处理
	system("del editlib");
	system("del operatorlib.bat");
	system("del controllib.bat");//删掉多余的东西
	return 0;
}

编译好,放进这个目录里,运行~

搞定。把这个程序删掉,剩下视频整理走。


备注:

  • 本人是一个蒟蒻,从未在专业角度接受过有关cmd命令及C++的知识传授,一切仅凭自己摸索搞出来。我可以想见,我这个方法极端的LOW,更好的方法一定层出不穷。还希望各位大神看了勿喷,给新手一些支持,谢谢!

  • 实验证明,微博会把你点了缓存的视频还有你平时看的没用的视频缓存都放进这里。测试表明(MIUI 10.3.2 安全中心 垃圾清理)可以先运行一遍手机的垃圾清理再往外搞文件,删掉那些没用的缓存,只留下点过缓存了的。


最后放上这个程序

这个程序

提取码:xc1c

操作完毕。光速逃(雾


2019/09/15更新:发现了一处问题,已经修改。
因为未能详细排查错误,忽略错误提示就直接应用到了实战中,结果收集了半个多月的视频全被rmdir打了水漂。。。

总结经验教训:

  • 写程序不能忽略任何错误提示,并必须经过仔细、严格的测试方可投入使用!要不就是像这样以白忙活了半个月(甚至更惨)作为代价!!

  • 重要资料必须做好备份工作!!!

数据千万条
备份第一条
操作不备份
数据两行泪

原文地址:https://www.cnblogs.com/izwb003/p/weibo_cache_video_copy.html