提示:如果你认为本文对你有帮助,请点一下关注.
如果有问题可以联系我**:https://gitee.com/xiaoyuren/gpt3
前言
前几天一个朋友让帮忙做一个好看视频自动上传的软件,分析了几个小时。主要难点在于
authorization如何获取,分析js的加密方法。还有百度的旋转验证码如何去验证。
本文将讲解一下上传一个视频的完整协议,以及其中使用的各个参数如何获取 如何加密。本文只分
析协议,你可以用你熟悉的语言实现。
一、登录
登录一般有2种方式:
- POST登录请求
- 携带cookie请求
我们使用的cookie的方式,这样就不用登录可以直接发送请求。具体实现可以从浏览器复制cookie,也可以在自己软件中调用ie webbrowser或者chromium登录后自动获取cookie。
二、协议分析
当我们在浏览器上传和发布视频时会看到一些的post请求和get请求,这里有几个请求是我们能用到的。
- https://dream.haokan.com/creator/pcvodtoken
请求返回的信息如下:
{
'timestamp': 1684815801,
'logid': '1401267629',
'status': 0,
'msg': 'success',
'data': {
'ak': '',
'sk': '',
'token': '',
'mediaId': '',
'video': {
'mediaIdMode': 'hk-video-publish',
'processModel': 'online_template_watermark',
'fileNamePrefix': 'haokancreator_'
},
'videoUploadInfo': {
'bucket': 'hk-video-publish',
'bosobject': 'vod-gechgi84v43uhfhp/mda-pen67e4pdxf2kn.mp4',
'mediaId': 'mda-pen67e6idxf2kn',
'host': 'bj.bcebos.com'
}
}
}
为了方便观看,我把其中的一些参数的内容给删掉了。我们可以获取:ak、sk、token、bucket、bosobject、mediaId。这些是后面能用到的参数。
- https://bj.bcebos.com/v1/hk-video-publish/vod-gechgi84v43uhfhp/mda-pen67e6idxf2kn.mp4?uploads=
这个请求链接中的参数可以对应第一个请求返回的值去设置,请求返回的内容我们需要获取其中的uploadId值。但是要注意,这个请求的header信息中有几个关键部分要设置:
值 | 说明 |
---|---|
x-bce-date | 当前的日期时间 |
x-bce-security-token | 第一个请求获取的token |
authorization | 通过js获取的一段加密字符串 |
上面主要的参数是authorization,分析下他js代码的部分如下图
如果有问题可以联系我**:https://gitee.com/xiaoyuren/gpt3
上图是生成authorization的关键部分,里面还有一些调用的方法这里就不展示了,可自行跟进调试。我们直接说结论:通过分析看到:authorization实际上就是把一段字符串给通过sha256算法给做了2次加密,第一次加密是把SK作为密钥,把bce-auth-v1/ak/当前时间 (替换为实际参数) 作为加密内容。第二次加密把第一次加密的内容作为密钥,把上面提到的字符串作为内容加密,最终得到了authorization。上面提到的字符串如下:
POST
/v1/hk-video-publish/vod-gechgi84v43uhfhp/mda-pen6uqspqh63pi50.mp4
uploads=
content-length:0
content-type:video%2Fmp4
host:bj.bcebos.com
x-bce-date:时间
x-bce-security-token:toekn
上面字符替换为实际参数,实际上每行字符串是使用\n分隔,我上面为了方面展示就直接换行显示了
- https://bj.bcebos.com/v1/hk-video-publish/vod-gechgi84v43uhfhp/mda-pen74ed6n3ze6b9z.mp4?partNumber=1&uploadId=uploadId的值
这个是上传视频的请求,请求时put方式,请求同样需要第二个请求提到的那些header信息,请求返回我们需要获取其中的 etag参数
-
https://bj.bcebos.com/v1/hk-video-publish/vod-gechgi84v43uhfhp/mda-pen75e1ymqtj4jbj.mp4?uploadId=uploadId的值
-
https://dream.haokan.com/creator/pcarticlecacheupdate
通过上面链接获取其中返回值的id。至此上传视频相关的部分已经完成,下面是上传封面。
需要先请求上面的第一个请求不同的是请求参数mediatype=2
- https://bj.bcebos.com/v1/baidu-rmb-videopic-1/hk/2305/1684818779671008af0fea99526a94f27ed332b875e3cc4e8306.jpg
上面是上传封面的请求,同样是put请求,其中的参数同上传视频需要的参数差不多。至此准备工作都做好了 就开始发布了。
- https://dream.haokan.com/creator/pcpublish?channel=pcpublish
发布需要用的参数如下:
"title": title,
"desc": desc,
"hkFeedCat": "",
"copyrightName": "",
"content": '{"title":"'+title+'","local":1,"videoName":"'+title+'.mp4","mediaId":"'+mediaId+'"}',
"coverLayout": "one",
"coverImages": '[{"src":"'+src+'"}]',
"videoInfo": '{"mediaId":"'+mediaId+'","sourceBucket":"'+sourceBucket+'","sourceKey":"'+sourceKey+'","host":"bj.bcebos.com","duration":9.3,"byteSize":'+size+'}',
"articleId": "",
"topicList": "[]",
"ideaCode": "",
"feoType": "1",
"ds": ds,
"tk": tk,
"positionLatLng": "{}",
"cacheId": dataid,
"goodsList": "[]",
"stickers": "",
"watermarkType": "0"
这些参数在上面那些请求中全部都有获取,这里就不一一讲解了。可以对上传返回信息做一个判断:如果msg=success则表示上传成功,如果msg为空则表示有旋转验证码,其他情况则直接显示msg中的内容(错误信息)
总结
文章中最后提到的旋转验证码,如果是自己的账号一般不会出现验证码,如果是购买的普通账号或者百度ck账号会出现验证码。因为篇幅问题,这里就不讲了后面在进行讲解。
如果有问题可以联系我**:https://gitee.com/xiaoyuren/gpt3