Тема: AHK: Заливка файлов на filemail.com
filemail.com - быстрый файлообменник позволяющий заливать до 50 гб за одну сессию.
В бесплатном режиме можно заливать не чаще 2 раз в сутки, поэтому скрипт сильно не тестировал.
from := "from@gmail.com"
to := "to@gmail.com"
subject := "test"
message := "test message"
file := "D:\SHOGUN_S001_S001_T002.rar"
ComObjError(false)
setbatchlines -1
Gui, -border -caption +hwndhGui
Gui, Show, w0 h0
percents := 0
SetTimer, uploadPercent, 300
SplitPath, file, FileName
FileName := URIEncode(FileName), from := URIEncode(from), to := URIEncode(to), subject := URIEncode(subject), message := URIEncode(message)
data := "sourcedetails=plupload(html5)+`%40+https`%3A`%2F`%2Fwww.filemail.com`%2F&to`%5B`%5D=" to "&from=" from "&subject=" subject "&message=" message "&days=7&confirmation=true"
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
loop
{
HTTP.Open("POST", "https://www.filemail.com/api/transfer/initialize", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Source", "Web")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(data)
HTTP.WaitForResponse()
if (HTTP.Status = 200) or (HTTP.Status = 500)
break
sleep 50
}
ResponseText := HTTP.ResponseText
If InStr(ResponseText, "FreeLimitReached")
{
msgbox free limit reached
ExitApp
}
RegexMatch(ResponseText, "s)""transferid"": ""(.+?)"".+?""transferkey"": ""(.+?)"".+?""transferurl"": ""(.+?)""", match)
transferid := match1, transferkey := match2, transferurl := match3
f := FileOpen(file, "r")
FileSize := f.length
chunksize := size := 5242880
chunks := Ceil(FileSize/chunksize)
LastChunkSize := Mod(FileSize, chunksize)
loop % chunks
{
chunk := A_Index -1
If (A_Index = chunks) and (LastChunkSize != 0)
size := LastChunkSize
safeArr := ComObjArray(0x11, size) ; Create SAFEARRAY = VT_ARRAY|VT_UI1
pvData := NumGet(ComObjValue(safeArr) + 12 + (A_PtrSize==8 ? 4 : 0)) ; get pvData memeber
f.RawRead(pvData + 0, size)
loop
{
link := transferurl "?transferid=" transferid "&transferkey=" transferkey "&runtime=html5&chunksize=" chunksize "&thefilename=" FileName "&totalsize=" FileSize "&chunks=" chunks "&chunk=" chunk "&retry=" A_Index-1
HTTP.Open("POST", link, true)
HTTP.SetRequestHeader("Content-Type", "application/octet-stream")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(safeArr)
HTTP.WaitForResponse()
if (HTTP.Status = 200)
break
sleep 50
}
count+=100/chunks
percents := Format("{1:0.2f}", count)
}
safeArr := ""
f.Close()
data := "transferid=" transferid "&transferkey=" transferkey "&failed=false"
loop
{
HTTP.Open("POST", "https://www.filemail.com/api/transfer/complete", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Source", "Web")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(data)
HTTP.WaitForResponse()
if (HTTP.Status = 200)
break
sleep 50
}
ResponseText := HTTP.ResponseText
SetTimer, uploadPercent, off
if RegexMatch(ResponseText, "s)""downloadurl"": ""(.+?)""", match)
msgbox % clipboard := match1
else
msgbox % ResponseText
ExitApp
uploadPercent:
if StrLen(title) > 5
title := ""
else
title .= "."
WinSetTitle, ahk_id %hGui%,, % percents "%" title
return
UriEncode(Uri)
{
VarSetCapacity(Var, StrPut(Uri, "UTF-8"), 0)
StrPut(Uri, &Var, "UTF-8")
f := A_FormatInteger
SetFormat, IntegerFast, H
While Code := NumGet(Var, A_Index - 1, "UChar")
If (Code >= 0x30 && Code <= 0x39 ; 0-9
|| Code >= 0x41 && Code <= 0x5A ; A-Z
|| Code >= 0x61 && Code <= 0x7A) ; a-z
Res .= Chr(Code)
Else
Res .= "%" . SubStr(Code + 0x100, -1)
SetFormat, IntegerFast, %f%
Return, Res
}
Вариант с несколькими потоками - менее надежный:
from := "from@gmail.com"
to := "to@gmail.com"
subject := "test"
message := "test message"
file := "C:\koski.mts"
MaxThreads := 4 ; количество потоков такое же как в IE
setbatchlines -1
Gui, -border -caption +hwndhGui2
Gui, Show, w0 h0
percents := 0
SetTimer, uploadPercent, 300
SplitPath, file, FileName
FileName := URIEncode(FileName), from := URIEncode(from), to := URIEncode(to), subject := URIEncode(subject), message := URIEncode(message)
data := "sourcedetails=plupload(html5)+`%40+https`%3A`%2F`%2Fwww.filemail.com`%2F&to`%5B`%5D=" to "&from=" from "&subject=" subject "&message=" message "&days=7&confirmation=true"
HTTP := ComObjCreate("Msxml2.XMLHTTP")
HTTP.Open("POST", "https://www.filemail.com/api/transfer/initialize", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Source", "Web")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(data)
While HTTP.ReadyState != 4
sleep 100
ResponseText := HTTP.ResponseText
If InStr(ResponseText, "FreeLimitReached")
{
msgbox free limit reached
ExitApp
}
RegexMatch(ResponseText, "s)""transferid"": ""(.+?)"".+?""transferkey"": ""(.+?)"".+?""transferurl"": ""(.+?)""", match)
transferid := match1, transferkey := match2, transferurl := match3
f := FileOpen(file, "r")
FileSize := f.length
chunksize := size := 5242880
chunks := Ceil(FileSize/chunksize)
LastChunkSize := Mod(FileSize, chunksize)
loop % chunks
{
n++
while (n > MaxThreads)
sleep 100
If (A_Index = chunks) and (LastChunkSize != 0)
size := LastChunkSize
safeArr := ComObjArray(0x11, size) ; Create SAFEARRAY = VT_ARRAY|VT_UI1
pvData := NumGet(ComObjValue(safeArr) + 12 + (A_PtrSize==8 ? 4 : 0)) ; get pvData memeber
f.RawRead(pvData + 0, size)
body%A_Index% := safeArr
link := transferurl "?transferid=" transferid "&transferkey=" transferkey "&runtime=html5&chunksize=" chunksize "&thefilename=" FileName "&totalsize=" FileSize "&chunks=" chunks "&chunk=" A_Index-1 "&retry=0"
HTTP%A_Index% := ComObjCreate("Msxml2.XMLHTTP")
HTTP%A_Index%.Open("POST", link, true)
HTTP%A_Index%.OnReadyStateChange := Func("Ready").Bind(A_Index)
HTTP%A_Index%.SetRequestHeader("Content-Type", "application/octet-stream")
HTTP%A_Index%.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP%A_Index%.SetRequestHeader("Pragma", "no-cache")
HTTP%A_Index%.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP%A_Index%.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP%A_Index%.Send(body%A_Index%)
sleep 100
}
f.Close()
while (n != 0)
sleep 100
data := "transferid=" transferid "&transferkey=" transferkey "&failed=false"
HTTP.Open("POST", "https://www.filemail.com/api/transfer/complete", true)
HTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Source", "Web")
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(data)
While HTTP.ReadyState != 4
sleep 100
ResponseText := HTTP.ResponseText
SetTimer, uploadPercent, off
if RegexMatch(ResponseText, "s)""downloadurl"": ""(.+?)""", match)
msgbox % clipboard := match1
else
msgbox % ResponseText
ExitApp
uploadPercent:
if StrLen(title) > 5
title := ""
else
title .= "."
WinSetTitle, ahk_id %hGui2%,, % percents "%" title
return
Ready(Index)
{
Global
if (HTTP%Index%.ReadyState != 4)
return
else
{
n--
count+=100/chunks
percents := Format("{1:0.2f}", count)
HTTP%Index% := body%Index% := ""
return
}
}
UriEncode(Uri)
{
VarSetCapacity(Var, StrPut(Uri, "UTF-8"), 0)
StrPut(Uri, &Var, "UTF-8")
f := A_FormatInteger
SetFormat, IntegerFast, H
While Code := NumGet(Var, A_Index - 1, "UChar")
If (Code >= 0x30 && Code <= 0x39 ; 0-9
|| Code >= 0x41 && Code <= 0x5A ; A-Z
|| Code >= 0x61 && Code <= 0x7A) ; a-z
Res .= Chr(Code)
Else
Res .= "%" . SubStr(Code + 0x100, -1)
SetFormat, IntegerFast, %f%
Return, Res
}