-
-
Save TransparentLC/72b6ea086b9a28964496c2bc1b721aa4 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env pwsh | |
| # https://stackoverflow.com/questions/8761888/capturing-standard-out-and-error-with-start-process | |
| function Start-Command ([String]$Path, [String]$Arguments) { | |
| $pinfo = New-Object System.Diagnostics.ProcessStartInfo | |
| $pinfo.FileName = $Path | |
| $pinfo.RedirectStandardError = $true | |
| $pinfo.RedirectStandardOutput = $true | |
| $pinfo.UseShellExecute = $false | |
| $pinfo.Arguments = $Arguments | |
| $p = New-Object System.Diagnostics.Process | |
| $p.StartInfo = $pinfo | |
| $p.Start() | Out-Null | |
| $p.WaitForExit() | |
| return @{ | |
| stdout = $p.StandardOutput.ReadToEnd() | |
| stderr = $p.StandardError.ReadToEnd() | |
| ExitCode = $p.ExitCode | |
| } | |
| } | |
| # https://stackoverflow.com/questions/1783554/fast-and-simple-binary-concatenate-files-in-powershell | |
| function Join-File ([String[]]$Path, [String]$Destination) { | |
| $OutFile = [IO.File]::Create($Destination) | |
| foreach ($File in $Path) { | |
| $InFile = [IO.File]::OpenRead($File) | |
| $InFile.CopyTo($OutFile) | |
| $InFile.Dispose() | |
| } | |
| $OutFile.Dispose() | |
| } | |
| function Get-RandomBytes ([Int32]$Length) { | |
| $RNG = [Security.Cryptography.RandomNumberGenerator]::Create() | |
| $Bytes = [Byte[]]::new($Length) | |
| $RNG.GetBytes($Bytes) | |
| return $Bytes | |
| } | |
| function Invoke-EncryptFile ([String]$Path, [Byte[]]$Key, [Byte[]]$IV, [String]$OutFile) { | |
| $File = [IO.File]::ReadAllBytes($Path) | |
| $AES = [Security.Cryptography.Aes]::Create() | |
| $AES.Key = $Key | |
| $AES.IV = $IV | |
| $Encryptor = $AES.CreateEncryptor($AES.Key, $AES.IV) | |
| $Encrypted = $Encryptor.TransformFinalBlock($File, 0, $File.Length) | |
| [IO.File]::WriteAllBytes($OutFile, $Encrypted) | |
| } | |
| # $FFmpegExec = 'D:\ffmpeg\bin\ffmpeg.exe' | |
| # $CurlExec = 'D:\curl-7.68.0-win64-mingw\bin\curl.exe' | |
| $FFmpegExec = 'ffmpeg' | |
| $CurlExec = 'curl' | |
| if (Test-Path alias:\curl) { | |
| Remove-Item alias:\curl | |
| } | |
| $Video = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath((Read-Host 'Input H264+AAC video path').Replace('"', '')) | |
| $TempDirectory = [IO.Path]::GetDirectoryName($Video) + '/' + [GUID]::NewGuid().ToString('N') | |
| New-Item $TempDirectory -ItemType Directory | |
| &$FFmpegExec -i $Video -c copy -vbsf h264_mp4toannexb -absf aac_adtstoasc ($TempDirectory + '/video.ts') | |
| &$FFmpegExec -i ($TempDirectory + '/video.ts') -c copy -f segment -segment_list ($TempDirectory + '/video.m3u8') ($TempDirectory + '/%d.ts') | |
| Remove-Item ($TempDirectory + '/video.ts') | |
| $tsCount = (Get-ChildItem $TempDirectory -Filter *.ts).Length | |
| do { | |
| $LimitExceed = $false | |
| foreach ($ts in (Get-ChildItem $TempDirectory -Filter *.ts)) { | |
| if ($ts.Length -gt 5MB) { | |
| $LimitExceed = $true | |
| Write-Host '[ERROR]' -NoNewline -BackgroundColor DarkRed -ForegroundColor White | |
| Write-Host (' File size limit exceeded: {0} ({1} MB)' -f $ts.Name, [Math]::Round($ts.Length / 1MB, 2)) | |
| } | |
| } | |
| if ($LimitExceed) { | |
| Read-Host 'Compress the files and press enter to continue' | |
| } | |
| } while ($LimitExceed) | |
| Write-Host 'Parsing M3U8...' | |
| $m3u8Source = [IO.File]::ReadAllLines($TempDirectory + '/video.m3u8') | |
| $m3u8 = @{ | |
| 'meta' = @(); | |
| 'info' = @(); | |
| } | |
| for ($i = 0; $i -lt $m3u8Source.Count; $i++) { | |
| if (($m3u8Source[$i] -eq '#EXTM3U') -or ($m3u8Source[$i] -eq '#EXT-X-ENDLIST')) { | |
| continue | |
| } | |
| if ($m3u8Source[$i].StartsWith('#EXTINF:')) { | |
| $m3u8.info += @{ | |
| 'duration' = [Double]($m3u8Source[$i].Replace('#EXTINF:', '').Replace(',', '')); | |
| 'file' = $m3u8Source[++$i]; | |
| } | |
| } else { | |
| $m3u8.meta += $m3u8Source[$i] | |
| } | |
| } | |
| Write-Host 'Merging TS files...' | |
| $FastStart = 3 | |
| for ($i = 0; $i -lt $tsCount; $i++) { | |
| $LastPath = ('{0}/{1}.ts' -f $TempDirectory, ($i - 1)) | |
| $CurrentPath = ('{0}/{1}.ts' -f $TempDirectory, $i) | |
| if (-not [IO.File]::Exists($LastPath)) { | |
| continue | |
| } | |
| if ((Get-Item $LastPath).Length + (Get-Item $CurrentPath).Length -le @(2MB, 1MB)[[Bool]$FastStart]) { | |
| Write-Host '[MERGE]' -NoNewline -BackgroundColor DarkGreen -ForegroundColor White | |
| Write-Host (' {0}.ts <- {1}.ts' -f $i, ($i - 1)) | |
| Join-File -Path $LastPath, $CurrentPath -Destination ('{0}/~.ts' -f $TempDirectory) | |
| Remove-Item $LastPath | |
| Remove-Item $CurrentPath | |
| Rename-Item ('{0}/~.ts' -f $TempDirectory) ('{0}.ts' -f $i) | |
| } else { | |
| Write-Host '[SKIP]' -NoNewline -BackgroundColor DarkCyan -ForegroundColor White | |
| if ($FastStart -gt 0) { | |
| $FastStart-- | |
| Write-Host (' {0}.ts ({1} MB FastStart)' -f $i, [Math]::Round((Get-Item $LastPath).Length / 1MB, 2)) | |
| } else { | |
| Write-Host (' {0}.ts ({1} MB)' -f $i, [Math]::Round((Get-Item $LastPath).Length / 1MB, 2)) | |
| } | |
| } | |
| } | |
| Write-Host 'Writing M3U8...' | |
| $MergedInfo = @() | |
| $tsLast = 0 | |
| for ($i = 0; $i -lt $tsCount; $i++) { | |
| if (-not [IO.File]::Exists(('{0}/{1}.ts' -f $TempDirectory, $i))) { | |
| continue | |
| } | |
| $MergedDuration = 0 | |
| for ($j = $tsLast; $j -le $i; $j++) { | |
| $MergedDuration += $m3u8.info[$j].duration | |
| } | |
| $MergedInfo += @{ | |
| 'duration' = $MergedDuration; | |
| 'file' = $m3u8.info[$i].file | |
| } | |
| $tsLast = $i + 1 | |
| } | |
| $m3u8.info = $MergedInfo | |
| $m3u8Content = @('#EXTM3U') | |
| foreach ($meta in $m3u8.meta) { | |
| $m3u8Content += $meta | |
| } | |
| foreach ($info in $m3u8.info) { | |
| $m3u8Content += '#EXTINF:' + $info.duration + ',' | |
| $m3u8Content += $info.file | |
| } | |
| $m3u8Content += '#EXT-X-ENDLIST' | |
| [IO.File]::WriteAllLines($TempDirectory + '/video.m3u8', $m3u8Content) | |
| Read-Host 'Press enter to start uploading' | |
| $EncryptKey = Get-RandomBytes 16 | |
| $EncryptIV = Get-RandomBytes 16 | |
| Write-Host ('Key: ' + ($EncryptKey | ForEach-Object { '{0:X2}' -f $_ })) | |
| Write-Host ('IV: ' + ($EncryptIV | ForEach-Object { '{0:X2}' -f $_ })) | |
| Write-Host 'Uploading Key File...' | |
| [IO.File]::WriteAllBytes($TempDirectory + '/KEY', $EncryptKey) | |
| $Response = (Start-Command $CurlExec (@( | |
| 'https://kfupload.alibaba.com/mupload', | |
| '-H "User-Agent: iAliexpress/8.27.0 (iPhone; iOS 12.1.2; Scale/2.00)"', | |
| '-X POST', | |
| '-F scene=productImageRule', | |
| '-F name=image.jpg', | |
| '-F file=@{0}' -f ($TempDirectory + '/KEY') | |
| ) -join ' ')).stdout | ConvertFrom-Json | |
| $EncryptKeyURL = $Response.url | |
| Remove-Item ($TempDirectory + '/KEY') | |
| $m3u8.meta += ('#EXT-X-KEY:METHOD=AES-128,URI="{0}",IV=0x{1}' -f $EncryptKeyURL,(($EncryptIV | ForEach-Object { '{0:x2}' -f $_ }) -join '')) | |
| $URLMapping = @{} | |
| foreach ($ts in (Get-ChildItem $TempDirectory -Filter *.ts)) { | |
| $FileName = [IO.Path]::GetFileName($ts.FullName) | |
| $FileEncrypted = $ts.FullName + '.encrypt' | |
| Invoke-EncryptFile $ts.FullName $EncryptKey $EncryptIV $FileEncrypted | |
| $Response = (Start-Command $CurlExec (@( | |
| 'https://kfupload.alibaba.com/mupload', | |
| '-H "User-Agent: iAliexpress/8.27.0 (iPhone; iOS 12.1.2; Scale/2.00)"', | |
| '-X POST', | |
| '-F scene=productImageRule', | |
| '-F name=image.jpg', | |
| '-F file=@{0}' -f $FileEncrypted | |
| ) -join ' ')).stdout | ConvertFrom-Json | |
| Remove-Item $FileEncrypted | |
| if ([Bool][Int32]$Response.code) { | |
| Write-Host '[WARNING]' -NoNewline -BackgroundColor DarkYellow -ForegroundColor White | |
| Write-Host (' {0} Failed to upload' -f $FileName) | |
| $URL = $FileName | |
| } else { | |
| Write-Host '[UPLOAD]' -NoNewline -BackgroundColor DarkGreen -ForegroundColor White | |
| Write-Host (' {0} {1}' -f $FileName, $Response.url) | |
| $URL = $Response.url | |
| } | |
| $URLMapping.$FileName = $URL | |
| } | |
| Write-Host 'Writing M3U8 with URL...' | |
| $m3u8Content = @('#EXTM3U') | |
| foreach ($meta in $m3u8.meta) { | |
| $m3u8Content += $meta | |
| } | |
| foreach ($info in $m3u8.info) { | |
| $m3u8Content += '#EXTINF:' + $info.duration + ',' | |
| $m3u8Content += $URLMapping.($info.file) | |
| } | |
| $m3u8Content += '#EXT-X-ENDLIST' | |
| [IO.File]::WriteAllLines($TempDirectory + '/video_online.m3u8', $m3u8Content) | |
| Write-Host 'Complete!' |
使用 Python 的 requests模块上传的食用方法是这样:
response = requests.post( url="https://kfupload.alibaba.com/mupload", headers={ "user-agent": "iAliexpress/8.27.0 (iPhone; iOS 12.1.2; Scale/2.00)", }, # path是pathlib模块里的Path类 files={"file": (path.name, path.open("rb"), "image/jpeg")}, data={"name": "image.jpg", "scene": "productImageRule"}, )实测可行
你好,使用你的代码,返回为{'code': '1'},然后文件路径用的是open(path,'rb')这样子,照片是300kb的png照片...没找到哪里出问题了
response = requests.post(
... url="https://kfupload.alibaba.com/mupload",
... headers={
... "user-agent": "iAliexpress/8.27.0 (iPhone; iOS 12.1.2; Scale/2.00)",
... },
... # path是pathlib模块里的Path类
... files={"file": (open('/Users/xxx/2.png','rb'))},
... data={"name": "image.png", "scene": "productImageRule"},
... )
@zsbai
应该是文件路径填错了,或者没有转义,仔细检查
摊手,我这边没啥问题
完整代码
摊手,我这边没啥问题
完整代码
我的天,找到问题,我没有传入文件名,修改成下面这样成功了:
r = requests.post(url = url, headers = header, data = data , files = {'file':('file',open('/Users/bailu/2.png','rb'),'image/jpeg')})
不好意思,粗心了
是不是上传接口变了?
`ConvertFrom-Json: /home/2.ps1:198
Line |
198 | ) -join ' ')).stdout | ConvertFrom-Json
| ~~~~~~~~~~~~~~~~
| Conversion from JSON failed with error: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
[UPLOAD] 0.ts
ConvertFrom-Json: /home/2.ps1:198
Line |
198 | ) -join ' ')).stdout | ConvertFrom-Json
| ~~~~~~~~~~~~~~~~
| Conversion from JSON failed with error: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
[UPLOAD] 1.ts
ConvertFrom-Json: /home/2.ps1:198
Line |
198 | ) -join ' ')).stdout | ConvertFrom-Json
| ~~~~~~~~~~~~~~~~
| Conversion from JSON failed with error: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
[UPLOAD] 14.ts
`
2022-02-11检测正常
{
"fs_url": "Hf5f5ff99f65041fdb897334abddf63fdP.jpg",
"code": "0",
"size": "19674",
"width": "533",
"url": "https://ae01.alicdn.com/kf/Hf5f5ff99f65041fdb897334abddf63fdP.jpg",
"hash": "aa9de6dcaf63826d3f6b27769883f5e1",
"height": "147"
}
不能用了...显示502 bad gateway
上传接口又改了,求最新接口
上传接口又改了,求最新接口


@TransparentLC
又研究了一下,发现根本没必要进行二次压缩,只需要在ffmpeg参数里添加
ffmpeg就会以每秒一个ts文件的标准来切片,正常视频不可能超过5MB...
我的代码