使用RestSharp调用Instagram私有API上传视频遇内部服务器错误求助
Instagram私有API视频上传Post请求内部服务器错误问题
已通过Graph API实现Instagram视频上传,作为技术挑战尝试私有API时卡壳一周:Options和Get请求均执行成功,但最终的Post上传请求返回内部服务器错误。抓包确认请求体应为二进制视频数据,但当前构造方式有误,具体代码及问题如下:
成功的Options请求
var tstamp = Bridge.UnixMs; var request = new RestRequest($"/rupload_igvideo/fb_uploader_{tstamp}", Method.Options); request.AddHeader("Host", "i.instagram.com"); request.AddHeader("Connection", "keep-alive"); request.AddHeader("Accept", "*/*"); request.AddHeader("Access-Control-Request-Method", "GET"); request.AddHeader("Access-Control-Request-Headers", "x-asbd-id,x-ig-app-id"); request.AddHeader("Origin", "https://www.instagram.com"); request.AddHeader("Sec-Fetch-Mode", "cors"); request.AddHeader("Sec-Fetch-Site", "same-site"); request.AddHeader("Sec-Fetch-Dest", "empty"); request.AddHeader("Referer", "https://www.instagram.com/"); request.AddHeader("Accept-Encoding", "gzip, deflate, br"); request.AddHeader("Accept-Language", "en-US,en;q=0.9,fr;q=0.8"); request.AddHeader("X-CSRFToken", Data.jar!["csrftoken"]); request.AddHeader("X-IG-App-ID", Data.appId!); request.AddHeader("X-IG-WWW-Claim", Data.hmac!); request.AddHeader("X-Instagram-AJAX", Data.ajax!); request.AddHeader("Cookie", $"{Data.csrf} {Data.datr} {Data.ds} {Data.did}" + $"{Data.nrcb} {Data.ses} {Data.bid} {Data.bts} {Data.mid!.Replace(";", "")}"); var body = @""; request.AddParameter("text/plain", body, ParameterType.RequestBody); var response = await req.Client().ExecuteAsync(request);
成功的Get请求
request = new RestRequest($"/rupload_igvideo/fb_uploader_{tstamp}", Method.Get); request.AddHeader("Host", "i.instagram.com"); request.AddHeader("Accept", "*/*"); request.AddHeader("sec-ch-ua-mobile", "?0"); request.AddHeader("sec-ch-ua-platform", "\"Windows\""); request.AddHeader("Origin", "https://www.instagram.com"); request.AddHeader("Sec-Fetch-Site", "same-site"); request.AddHeader("Sec-Fetch-Mode", "cors"); request.AddHeader("Sec-Fetch-Dest", "empty"); request.AddHeader("Referer", "https://www.instagram.com/"); request.AddHeader("Accept-Encoding", "gzip, deflate, br"); request.AddHeader("Accept-Language", "en-US,en;q=0.9,fr;q=0.8"); request.AddHeader("Cookie", $"{Data.csrf} {Data.datr} {Data.ds} {Data.did}" + $"{Data.nrcb} {Data.ses} {Data.bid} {Data.bts} {Data.mid!.Replace(";", "")}"); response = await req.Client().ExecuteAsync(request);
报错的Post请求
byte[] vBytes = Encoding.UTF8.GetBytes(@"C:\Users\x\OneDrive\Bureau\nurf.mp4"); body = $@"{vBytes}"; string size = body.Length.ToString(); request = new RestRequest($"/rupload_igvideo/fb_uploader_{tstamp}", Method.Post); request.AddHeader("Host", "i.instagram.com"); request.AddHeader("Connection", "keep-alive"); request.AddHeader("Content-Length", $"{size}"); request.AddHeader("sec-ch-ua", "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Google Chrome\";v=\"114\""); request.AddHeader("X-Entity-Name", $"fb_uploader_{tstamp}"); request.AddHeader("Offset", "0"); request.AddHeader("sec-ch-ua-mobile", "?0"); request.AddHeader("X-Instagram-AJAX", Data.ajax!); request.AddHeader("Accept", "*/*"); request.AddHeader("X-Instagram-Rupload-Params", @$"{{""client-passthrough"":""1"", ""is_clips_video"":""1"", ""is_sidecar"":""0"", ""media_type"":2, ""for_album"":false, ""video_format"":"""", ""upload_id"":""{tstamp}"", ""upload_media_duration_ms"":30700, ""upload_media_height"":427, ""upload_media_width"":240, ""video_transform"":null, ""video_edit_params"":{{""crop_height"":240, ""crop_width"":240,""crop_x1"":0, ""crop_y1"":93, ""mute"":false, ""trim_end"":30.7, ""trim_start"":0}}}}"); ; request.AddHeader("X-Entity-Length", $"{size}"); request.AddHeader("sec-ch-ua-platform", "\"Windows\""); request.AddHeader("Origin", "https://www.instagram.com"); request.AddHeader("Sec-Fetch-Site", "same-site"); request.AddHeader("Sec-Fetch-Mode", "cors"); request.AddHeader("Sec-Fetch-Dest", "empty"); request.AddHeader("Referer", "https://www.instagram.com/"); request.AddHeader("Accept-Encoding", "gzip, deflate, br"); request.AddHeader("Accept-Language", "en-US,en;q=0.9,fr;q=0.8"); request.AddHeader("Cookie", $"{Data.csrf} {Data.datr} {Data.ds} {Data.did}" + $"{Data.nrcb} {Data.ses} {Data.bid} {Data.bts} {Data.mid!.Replace(";", "")}"); request.AddHeader("Content-Type", "text/plain"); request.AddParameter("text/plain", body, ParameterType.RequestBody); response = await req.Client().ExecuteAsync(request);
问题分析与修正方案
当前Post请求存在三个核心错误:
- 视频文件读取错误:
Encoding.UTF8.GetBytes(@"C:\Users\x\OneDrive\Bureau\nurf.mp4")是将文件路径转成字节数组,而非读取视频文件的二进制内容,应替换为File.ReadAllBytes(@"C:\Users\x\OneDrive\Bureau\nurf.mp4")。 - 请求体与长度计算错误:将字节数组转成字符串后计算长度,完全偏离了真实的视频文件大小,应直接使用字节数组的长度作为
Content-Length和X-Entity-Length的值。 - Content-Type错误:上传二进制视频应使用
video/mp4或application/octet-stream,而非text/plain,否则服务器无法识别请求体类型。
修正后的Post请求代码:
// 正确读取视频文件的二进制内容 byte[] vBytes = File.ReadAllBytes(@"C:\Users\x\OneDrive\Bureau\nurf.mp4"); string fileSize = vBytes.Length.ToString(); request = new RestRequest($"/rupload_igvideo/fb_uploader_{tstamp}", Method.Post); request.AddHeader("Host", "i.instagram.com"); request.AddHeader("Connection", "keep-alive"); request.AddHeader("Content-Length", fileSize); request.AddHeader("sec-ch-ua", "\"Not.A/Brand\";v=\"8\", \"Chromium\";v=\"114\", \"Google Chrome\";v=\"114\""); request.AddHeader("X-Entity-Name", $"fb_uploader_{tstamp}"); request.AddHeader("Offset", "0"); request.AddHeader("sec-ch-ua-mobile", "?0"); request.AddHeader("X-Instagram-AJAX", Data.ajax!); request.AddHeader("Accept", "*/*"); request.AddHeader("X-Instagram-Rupload-Params", @$"{{""client-passthrough"":""1"", ""is_clips_video"":""1"", ""is_sidecar"":""0"", ""media_type"":2, ""for_album"":false, ""video_format"":"""", ""upload_id"":""{tstamp}"", ""upload_media_duration_ms"":30700, ""upload_media_height"":427, ""upload_media_width"":240, ""video_transform"":null, ""video_edit_params"":{{""crop_height"":240, ""crop_width"":240,""crop_x1"":0, ""crop_y1"":93, ""mute"":false, ""trim_end"":30.7, ""trim_start"":0}}}}"); request.AddHeader("X-Entity-Length", fileSize); request.AddHeader("sec-ch-ua-platform", "\"Windows\""); request.AddHeader("Origin", "https://www.instagram.com"); request.AddHeader("Sec-Fetch-Site", "same-site"); request.AddHeader("Sec-Fetch-Mode", "cors"); request.AddHeader("Sec-Fetch-Dest", "empty"); request.AddHeader("Referer", "https://www.instagram.com/"); request.AddHeader("Accept-Encoding", "gzip, deflate, br"); request.AddHeader("Accept-Language", "en-US,en;q=0.9,fr;q=0.8"); request.AddHeader("Cookie", $"{Data.csrf} {Data.datr} {Data.ds} {Data.did}" + $"{Data.nrcb} {Data.ses} {Data.bid} {Data.bts} {Data.mid!.Replace(";", "")}"); // 修正Content-Type为视频类型 request.AddHeader("Content-Type", "video/mp4"); // 直接添加二进制字节数组作为请求体 request.AddParameter("video/mp4", vBytes, ParameterType.RequestBody); response = await req.Client().ExecuteAsync(request);
内容的提问来源于stack exchange,提问作者HomerSimpsons
相关产品推荐
相关产品推荐

