python抓取抖音热门视频,抖音然后上传高清视频

  python抓取抖音热门视频,抖音然后上传高清视频

  当前项目中有需求。用户可以在我们的平台上管理自己的Tik Tok号,并使用Tik Tok的一些功能,例如发布自己的抖音视频。这个需求可以通过Tik Tok开放平台提供的一些接口来实现,最大支持4 G的视频发布,最长时长15分钟。为了减轻网关的压力,目前我们采用的是分片上传。

  使用界面发布视频的过程大致可以分为:

  1.调用【初始化上传】接口获取唯一值upload_id,有效期2小时。

  2.把大视频文件分块,带上分段视频,upload_id和切片参数个数,调用【切片上传接口】,把视频文件上传到Tik Tok的服务器上。

  3.调用[完成视频]接口获取video_id

  4.调用【创建抖音视频】接口,带上video_id参数,发布自己的抖音视频。

  成功执行以上四个步骤后,您可以在Tik Tok看到您上传的视频。

  因为upload_id的值会有一些特殊的符号,所以需要用urlencode进行编码和处理。

  我还增加了断点续传的功能。比如我要上传的视频被分成了6段,但是上传了3段视频后,发生了一些意外,需要重新上传视频。前三段视频重新请求时,并不会真正上传到服务器,从而减少了流量的消耗。

  我用redis记录了上传视频的信息,创建了一个set set,以upload_id的值为名称,设置有效期为2小时。我上传了具有相同upload_id的分段视频,并将分段视频保存到set set集合中。如果分段视频的信息已经存在,我不会上传分段视频;否则我会调用分段上传接口上传到服务器。

  初始化上传的代码:

  类v1 inituploadview(API view):def get(self,request): Initialize upload user=request . log in _ user open _ id=user . open _ id flag,Access _ token=check _ Access _ token(request)如果flag为false:返回响应({error :请重新登录 },status=status . http _ 401 _ unauthorized)init _ URL= https://open . dou yin . com/video/part/init/?open_id={}access_token={} 。format(open_id,access _ token)init _ RES=requests . post(URL=init _ URL)。json()print(init_res=====,init_res)if init_res.get(data ,{})。get(error_code )!=0:返回响应({error: init_res.get(data ,{})。get(description)},status=状态。HTTP _ 400 _ BAD _ REQUEST)upload _ id=init _ RES . get( data ,{})。get(upload_id) # Get upload_id#在redis中创建一个空集并设置2小时的过期时间r _ db.sadd (upload _ id,0) r _ db.expire (upload _ id,7200)返回响应({upload _ id )

  用于将视频片段上传到服务器的代码:

  类v1 videopartuploadview(API视图):def post(自身,请求): 分片上传文件到服务器上:param request:return: user=request。log in _ user open _ id=user。open _ id标志,access _ token=check _ access _ token(请求)如果旗为False:返回响应({error :请重新登录},状态=状态. HTTP _ 401 _未授权)数据=请求。数据上传id=数据。get( upload _ id )零件号=数据。get( part _ number )upload _ id _ encode=urlencode({ upload _ id :upload _ id })if not upload _ id或r_db.ttl(上传id) 0:返回响应({ 错误:上传id已失效})如果不是check _ params _ is _ int(零件号):返回响应({ 错误:分片类型错误})零件号=字符串(零件号)视频文件=请求. FILES.get(video_file )如果不是视频文件:返回响应({ 错误:请上传文件},状态=状态. HTTP_200_OK)后缀=str(视频文件).拆分(.)[-1]if suffix.lower() not in (avi , wmv , mpeg , mp4 , m4v , mov , asf , flv , f4v , rmvb , rm , 3gp , vob ):返回响应({ 错误:请上传avi、wmv、mpeg、mp4、m4v、mov、asf、flv、f4v、rmvb、rm、3gp、vob的文件})size=video _ file。size if int(size)20971520:#设置分块大小为20mr返回响应({ 错误:视频大小不能超过20M})#获取该上传编号的列表part _ set={ p . decode( utf8 )for p in r _ db。s members(upload _ id)} if part _ set中的part _ number:返回响应({ error _ code :0, description : })part _ URL=f https://open。窦寅。com/video/part/upload/?open _ id={ open _ id } access _ token={ access _ token } \ f 零件号={零件号} upload _ id _ enco部门号=请求。post(URL=part _ URL,files={video: video_file}).json()res=part_res.get(data ,{})print(part_res===,part_res)if res.get(error_code )!=0:返回响应({ error :RES . get( description )},status=status .HTTP _ 400 _错误请求)其他:r_db.sadd(上传标识,零件号)#记录已上传的视频返回响应(分辨率)

  完成上传视频和创建视频的代码:

  类v1 videocreateview(API view):def post(self,request): 完成上传创建视频:param request:return: user=request。log in _ user open _ id=user。open _ id标志,access _ token=check _ access _ token(请求)如果旗为False:返回响应({error :请重新登录},状态=状态HTTP _ 401 _未授权)请求_数据=请求。数据文本=请求_数据。get( text )#视频标题,poi _ id=request _ data。get( poi _ id )#地理位置id兴趣点名称=请求数据。get( poi _ name )#地理位置名称cover _ tsp=请求_数据。get( cover _ tsp )#将传入的指定时间点对应帧设置为视频封面(单位:秒)at _ users=request _ data。get( at _ users )upload _ id=request _ data。get( upload _ id )upload _ id _ encode=urlencode({ upload _ id :upload _ id })if at _ users:at _ users=at _ users。split(,)complete _ URL=f https://open。窦寅。com/video/part/complete/?open _ id={ open _ id } access _ token={ access _ token } upload _ id _ encodocomplete _ RES=requests。post(URL=complete _ URL,data={upload_id: upload_id}).json()print(complete_res====,complete _ RES)if complete _ RES . get( data ,{}).get(error_code )!=0:返回响应({ error :complete _ RES . get( data ,{}).get(description)},状态=状态HTTP _ 400 _ BAD _ REQUEST)video _ id=complete _ RES . get( data ,{}).get(video ,{}).get(video_id)##创建视频create _ URL=https://open.douyin.com/video/create/?open_id={}access_token={} .format(open_id,access _ token)data _ create={ video _ id :video _ id, text: text,} if poi _ id:data _ create[ poi _ id ]=poi _ name:data _ create[ poi _ name ]=poi _ name if cover _ tsp:data _ create[ cover _ tsp ]=cover _ tsp if at _ users:at _ users=at _ users。split(,)data _ create[ at _ users ]=at _ users JSON()RES _ data=RES _ create。get( data )if RES _ data。get(错误代码).=0:返回响应({ error :res_data。get( description )})返回响应(RES _ data)

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: