Django 代码324无效视频和状态失败?

Django 代码324无效视频和状态失败?,django,twitter,twitter-oauth,Django,Twitter,Twitter Oauth,我正试图通过twitter API从我的网站上传视频。我从他们的github库代码的异步上传文件中抓取了大文件。我正在分块上传数据。代码如下: (注意,我使用静态文件大小和块进行测试,如果您能提供动态方法建议,我将不胜感激) MEDIA\u ENDPOINT\u URL='1〕https://upload.twitter.com/1.1/media/upload.json' 发布推特https://api.twitter.com/1.1/statuses/update.json' 消费者密钥='

我正试图通过twitter API从我的网站上传视频。我从他们的github库代码的异步上传文件中抓取了大文件。我正在分块上传数据。代码如下: (注意,我使用静态文件大小和块进行测试,如果您能提供动态方法建议,我将不胜感激)

MEDIA\u ENDPOINT\u URL='1〕https://upload.twitter.com/1.1/media/upload.json'
发布推特https://api.twitter.com/1.1/statuses/update.json'
消费者密钥='xxx'
消费者机密='xxx'
访问令牌='xxx xxx'
访问令牌密钥='xxx'
VIDEO_FILENAME=request.FILES['VIDEO']
视频大小=59467
oauth=OAuth1(消费者密钥,
客户机密=消费者机密,
资源\所有者\密钥=访问\令牌,
资源\u所有者\u机密=访问\u令牌\u机密)
请求\u数据={
'command':'INIT',
“媒体类型”:“视频/mp4”,
“总字节数”:视频大小,
“媒体类别”:“推特视频”
}
req=requests.post(url=MEDIA\u ENDPOINT\u url,data=request\u data,auth=oauth)
打印请求
media\u id=req.json()['media\u id']
打印('媒体ID:%s'%str(媒体ID))
段id=0
发送的字节数=0
视频文件=视频文件名
发送的字节数<视频大小:
chunk=vid_file.read(59467)
打印('附加')
请求\u数据={
'命令':'附加',
“媒体id”:媒体id,
“段索引”:段id
}
文件={
“媒体”:块
}
req=requests.post(url=MEDIA\u ENDPOINT\u url,data=request\u data,files=files,auth=oauth)
如果请求状态代码<200或请求状态代码>299:
打印(请求状态\ U代码)
打印(请求文本)
段id=段id+1
已发送字节数=vid_file.tell()
打印(“%s(共%s个字节)%”(str(已发送字节),str(视频大小)))
打印('上传块完成')
请求\u数据={
'command':'FINALIZE',
“媒体id”:媒体id,
“媒体类别”:“推特视频”
}
req=requests.post(url=MEDIA\u ENDPOINT\u url,data=request\u data,auth=oauth)
打印(req.json())
processing_info=req.json().get('processing_info',None)
打印(请求状态\ U代码)
时间。睡眠(5)
请求\u数据={
“状态”:“我刚刚上传了一个带有@TwitterAPI的视频。”,
“媒体id”:req.json()[“媒体id\u字符串”],
“媒体类别”:“推特视频”
}
req=requests.post(url=post\u TWEET\u url,data=request\u data,auth=oauth)
打印(req.json())
上下文={
“r”:请求
}
返回render\u to\u响应('dashboard/manage\u content/display.html',context)
我被以下错误击中:

{“错误”:[{“代码”:324,“消息”:“无效视频”}]} 我正在上传一个1.6MB大小的mp4文件。如果你需要更多的信息,请告诉我


解决方案是使用文件的实际大小,而不仅仅是文件的一部分,并确保使用函数动态获取大小。即使上传了所有块,静态大小也不起作用。

您说mp4是1.6MB,但代码说是59467字节。如果你使用正确的尺寸,它能工作吗?另外,你能直接把视频上传到Twitter网站上吗?如果没有,则可能是文件已损坏。当我尝试使用正确的大小时,APPEND命令在59467字节后抛出错误。所以我想也许我可以在尺寸上妥协一点来测试它。是的,我试过在twitter上上传同样的视频,效果非常好。你对视频大小处理的质疑是对的。发布了对我有用的东西,谢谢你的时间。
    MEDIA_ENDPOINT_URL = 'https://upload.twitter.com/1.1/media/upload.json'
    POST_TWEET_URL = 'https://api.twitter.com/1.1/statuses/update.json'

    CONSUMER_KEY = 'xxx'
    CONSUMER_SECRET = 'xxx'
    ACCESS_TOKEN = 'xxx-xxx'
    ACCESS_TOKEN_SECRET = 'xxx'

    VIDEO_FILENAME = request.FILES['video']
    VIDEO_SIZE = 59467

    oauth = OAuth1(CONSUMER_KEY,
                   client_secret=CONSUMER_SECRET,
                   resource_owner_key=ACCESS_TOKEN,
                   resource_owner_secret=ACCESS_TOKEN_SECRET)

    request_data = {
      'command': 'INIT',
      'media_type': 'video/mp4',
      'total_bytes': VIDEO_SIZE,
      'media_category': 'tweet_video'
    }

    req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, auth=oauth)
    print req
    media_id = req.json()['media_id']

    print('Media ID: %s' % str(media_id))

    segment_id = 0
    bytes_sent = 0
    vid_file = VIDEO_FILENAME

    while bytes_sent < VIDEO_SIZE:
        chunk = vid_file.read(59467)
        print('APPEND')

        request_data = {
            'command': 'APPEND',
            'media_id': media_id,
            'segment_index': segment_id
        }

        files = {
            'media': chunk
        }

        req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, files=files, auth=oauth)

        if req.status_code < 200 or req.status_code > 299:
            print(req.status_code)
            print(req.text)

        segment_id = segment_id + 1
        bytes_sent = vid_file.tell()

        print('%s of %s bytes uploaded' % (str(bytes_sent), str(VIDEO_SIZE)))

    print('Upload chunks complete.')

    request_data = {
        'command': 'FINALIZE',
        'media_id': media_id,
        'media_category': 'tweet_video'
    }

    req = requests.post(url=MEDIA_ENDPOINT_URL, data=request_data, auth=oauth)
    print(req.json())

    processing_info = req.json().get('processing_info', None)
    print(req.status_code)

    time.sleep(5)

    request_data = {
        'status': 'I just uploaded a video with the @TwitterAPI.',
        'media_ids': req.json()['media_id_string'],
        'media_category': 'tweet_video'
    }

    req = requests.post(url=POST_TWEET_URL, data=request_data, auth=oauth)
    print(req.json())

    context = {
        'r': req
    }
    return render_to_response('dashboard/manage_content/display.html', context)