' On Error Resume Next if WScript.Arguments.Count < 4 then WScript.StdOut.WriteLine "Missing parameters" WScript.StdOut.WriteLine "[password] [file to upload] [BuildUrl] [Posttitle]" WScript.Quit end if Set IE = CreateIeWindow() WScript.StdOut.WriteLine IE.HWND IE.Visible = True Login IE PostThread IE IE.Quit function CreateIeWindow () on error resume next Set CreateIeWindow = nothing For count = 0 to 100 WScript.StdOut.WriteLine count & ": Trying to create Internet Explorer" Set IE = WScript.CreateObject("InternetExplorer.Application", "IE_") if not IE is nothing then WScript.StdOut.WriteLine count & ": Created Internet Explorer" WScript.StdOut.WriteLine IE.HWND IE.Visible = True WScript.StdOut.WriteLine IE.HWND Set CreateIeWindow = IE exit for end if WScript.StdOut.WriteLine count & ": Not created" WScript.Sleep 100 WScript.StdOut.WriteLine count & ": Should loop" Next if CreateIeWindow is nothing then WScript.StdOut.WriteLine "Failed to create InternetExplorer.Application" WScript.Quit end if End Function Sub Wait(IE) Dim complete complete = False WScript.StdOut.WriteLine "Waiting for IE" For count = 0 to 1000 WScript.StdOut.WriteLine "before sleep" WScript.Sleep 100 WScript.StdOut.WriteLine "after sleep" if IE is nothing then WScript.StdOut.WriteLine "after sleep" end if WScript.StdOut.WriteLine count & ": IE.readyState: " & IE.readyState if IE.readyState >= 4 then WScript.StdOut.WriteLine count & ": IE.Busy: " & IE.Busy if not IE.Busy then WScript.StdOut.WriteLine count & ": IE.document.readyState: " & IE.document.readyState if StrComp(IE.document.readyState, "complete", vbTextCompare) = 0 then complete = true exit for end if end if end if Next if not complete then WScript.StdOut.WriteLine "Failed to wait for IE" WScript.Quit end if WScript.StdOut.WriteLine "IE Done" End Sub Function FindIeWindow(ieID) on error resume next set IE = nothing Set Shell = CreateObject("Shell.Application") For i = 0 to Shell.Windows.Count -1 set Win = Shell.Windows.Item(i) WScript.StdOut.WriteLine i & ": " & TypeName(win.Document) If TypeName(win.Document) = "HTMLDocument" Then WScript.StdOut.WriteLine "uniqueID: @" & win.HWND & "@" & ieID & "@" if win.HWND = ieID then WScript.StdOut.WriteLine "matched" set IE = win end if End If if not IE is nothing then exit for end if Next set FindIeWindow = IE if IE is nothing then WScript.StdOut.WriteLine "Failed to find navigating window" else WScript.StdOut.WriteLine "HWND : " & IE.HWND end if End Function Sub Navigate(IE, url) dim ieId ieID = IE.HWND WScript.StdOut.WriteLine "Navigating (" & IE.HWND & ") to: " & url IE.Navigate url WScript.Sleep 100 ' set IE = FindIeWindow(ieID) Wait IE End Sub Sub ValidateLoggedIn(IE) WScript.StdOut.WriteLine "ValidateLoggedIn - 1" WScript.StdOut.WriteLine "ValidateLoggedIn start" WScript.StdOut.WriteLine "ValidateLoggedIn - 2" Navigate IE, "http://forum.pj64-emu.com/" WScript.StdOut.WriteLine "ValidateLoggedIn - 3" Wait IE WScript.StdOut.WriteLine "ValidateLoggedIn - 4" Dim LoggedIn LoggedIn = False WScript.StdOut.WriteLine "ValidateLoggedIn - 5" Set NodeList = IE.document.getElementsByTagName("a") WScript.StdOut.WriteLine "ValidateLoggedIn - 6" WScript.StdOut.WriteLine "Got Node list" For Each Elem In NodeList WScript.StdOut.WriteLine Elem.href if lcase(Mid(Elem.href,1,39)) = "http://forum.pj64-emu.com/member.php?u=" then if lcase(Mid(Elem.parentElement.innerHTML,1,11)) = "welcome, 200) then WScript.StdOut.WriteLine "failed to get job details (" & BuildUrl & "api/xml?wrapper=changes)" WScript.Quit end if Dim xmlDoc Set xmlDoc = oReq.responseXML Set objLst = xmlDoc.getElementsByTagName("freeStyleBuild") Dim PostContent For each elem in objLst set childNodes = elem.childNodes for each node in childNodes if lcase(node.nodeName)="changeset" then for each item in node.childNodes dim commitId, comment commitId = "" comment = "" for each itemDetail in item.childNodes if lcase(itemDetail.nodeName)="commitid" then commitId = itemDetail.text end if if lcase(itemDetail.nodeName)="comment" then comment = Replace(Replace(itemDetail.text, vbLf, " "), vbCr, " ") end if next if (Len(comment) > 0 and Len(commitId) > 0) then PostContent = PostContent & "[*]" & comment & " (commit: [URL=""https://github.com/project64/project64/commit/" & commitId & """]"& commitId & "[/URL])" & vbCr end if next end if next Next if (Len(PostContent) > 0) then PostContent = "Changes:"&vbCr&"[LIST=1]" & vbCr & PostContent & "[/LIST]" else PostContent = "No code changes" end if WScript.StdOut.WriteLine "PostTitle = """ & PostTitle & """" WScript.StdOut.WriteLine "PostContent = """ & PostContent & """" Dim SetTitle SetTitle = False Set NodeList = IE.document.getElementsByTagName("input") For Each Elem In NodeList if lcase(Elem.name) = "subject" then Elem.value = PostTitle SetTitle = true exit for end if Next if not SetTitle then WScript.StdOut.WriteLine "failed to set post title" WScript.Quit end if Dim SetMessage SetMessage = False Set NodeList = IE.document.getElementsByTagName("textarea") For Each Elem In NodeList WScript.StdOut.WriteLine Elem.name if lcase(Elem.name) = "message" then Elem.value = PostContent SetMessage = true exit for end if Next if not SetMessage then WScript.StdOut.WriteLine "failed to set post message" WScript.Quit end if end sub sub UploadFile(FileToUpload) WScript.StdOut.WriteLine "UploadFile start" dim filePos filePos = InStrRev(FileToUpload, "\") if filePos = 0 then WScript.StdOut.WriteLine "failed to find directory seperator in " & FileToUpload WScript.Quit end if dim fileName fileName = Mid(FileToUpload, filePos + 1, len(FileToUpload)) WScript.StdOut.WriteLine fileName extPos = InStrRev(fileName, ".") if extPos = 0 then WScript.StdOut.WriteLine "failed to find file extension in " & fileName WScript.Quit end if extension = Mid(fileName, extPos, len(fileName)) if lcase(extension) <> ".zip" then WScript.StdOut.WriteLine "not a zip file: " & fileName WScript.Quit end if set manage_attachments_button = ie.document.getelementbyid("manage_attachments_button") if manage_attachments_button is nothing then WScript.StdOut.WriteLine "failed to find manage_attachments_button" WScript.Quit end if WScript.StdOut.WriteLine "InStr(1, lcase(manage_attachments_button.onclick), ""vb_attachments"") = " & InStr(1, lcase(manage_attachments_button.onclick), "vb_attachments") dim startPos, endPos startPos = InStr(1, lcase(manage_attachments_button.onclick), "vb_attachments") if startPos = 0 then WScript.StdOut.WriteLine "failed to find vb_attachments in " & manage_attachments_button.onclick WScript.Quit end if startPos = InStr(startPos, lcase(manage_attachments_button.onclick), "'") if startPos = 0 then WScript.StdOut.WriteLine "failed to find first quote in " & manage_attachments_button.onclick WScript.Quit end if startPos = startPos + 1 endPos = InStr(startPos,manage_attachments_button.onclick, "'") if endPos = 0 then WScript.StdOut.WriteLine "failed to find second quote in " & manage_attachments_button.onclick WScript.Quit end if Set IE2 = WScript.CreateObject("InternetExplorer.Application", "IE_") IE2.Visible = True Navigate IE2, "http://forum.pj64-emu.com/" & Mid(manage_attachments_button.onclick, startPos, endPos - startPos) Wait IE2 Set FormList = IE2.document.getElementsByTagName("form") if FormList.length <> 1 or FormList(0).name <> "newattachment" then WScript.StdOut.WriteLine "failed to find attachement form" WScript.Quit end if Set InputList = FormList(0).getElementsByTagName("input") WScript.StdOut.WriteLine "InputList.length = " & InputList.length dim PreFormData, PostFormData For Each Input In InputList if lcase(Input.type) = "hidden" then PreFormData = PreFormData & "--AaB03x" & vbCrLf & "Content-Disposition: form-data; name=""" & Input.name & """" & vbCrLf & vbCrLf & Input.value& vbCrLf end if WScript.StdOut.WriteLine "Input.type: " & Input.type & " Input.name: " & Input.name & " Input.value: " & Input.value next PreFormData = PreFormData & "--AaB03x" & vbCrLf & "Content-Disposition: form-data; name=""attachment[]""; filename=""" & fileName & """" & vbCrLf PreFormData = PreFormData & "Content-Type: application/zip" & vbCrLf & vbCrLf PostFormData = vbCrLf & "--AaB03x" & vbCrLf & "Content-Disposition: form-data; name=""upload""" & vbCrLf & vbCrLf & "Upload" & vbCrLf PostFormData = PostFormData & vbCrLf & vbCrLf & "--AaB03x--"& vbCrLf WScript.StdOut.WriteLine PreFormData & PostFormData dim fileContents fileContents = ReadBinaryFile(FileToUpload) dim UploadUrl UploadUrl = "http://forum.pj64-emu.com/" & FormList(0).action IE2.Quit Header = "Content-Type: multipart/form-data; boundary=AaB03x" & vbCrLf Const adTypeBinary = 1 Dim DataToPOSTStream Set DataToPOSTStream = CreateObject("ADODB.Stream") DataToPOSTStream.type=adTypeBinary DataToPOSTStream.Open DataToPOSTStream.Write = Stream_StringToBinary(PreFormData,"us-ascii") DataToPOSTStream.Write = fileContents DataToPOSTStream.Write = Stream_StringToBinary(PostFormData,"us-ascii") DataToPOSTStream.Position = 0 DataToPOSTStream.Type = adTypeBinary Dim DataToPOST DataToPOST = DataToPOSTStream.Read Set IE3 = CreateIeWindow() IE3.Visible = 1 dim ieId ieID = IE3.HWND WScript.StdOut.WriteLine "Uploading form to: " & UploadUrl IE3.Navigate UploadUrl, Nothing, Nothing, DataToPOST, Header WScript.Sleep 100 'set IE3 = FindIeWindow(ieID) Wait IE3 Dim UploadDone UploadDone = False For count = 0 to 1000 WScript.StdOut.WriteLine count & ": Waiting for upload done" Set NodeList = IE3.document.getElementsByTagName("legend") For Each Elem In NodeList if (len(Elem.innerHTML) > 19) and lcase(Mid(Elem.innerHTML, 1, 19)) = "current attachments" then UploadDone = true WScript.StdOut.WriteLine "Upload done" exit for end if Next if UploadDone then exit for end if Next if not UploadDone then WScript.StdOut.WriteLine "Failed to upload file" WScript.Quit end if IE3.Quit WScript.StdOut.WriteLine "UploadFile Finished" end sub Function Stream_StringToBinary(Text, CharSet) Const adTypeText = 2 Const adTypeBinary = 1 Dim BinaryStream Set BinaryStream = CreateObject("ADODB.Stream") BinaryStream.Type = adTypeText BinaryStream.CharSet = CharSet BinaryStream.Open BinaryStream.WriteText Text BinaryStream.Position = 0 BinaryStream.Type = adTypeBinary Stream_StringToBinary = BinaryStream.Read Set BinaryStream = Nothing End Function Function ReadBinaryFile(path) Const adTypeText = 2 Const adTypeBinary = 1 dim inStream dim myByte,myByteValue,myCharacter set inStream=WScript.CreateObject("ADODB.Stream") inStream.Open inStream.type=1 inStream.LoadFromFile path ReadBinaryFile=inStream.Read() inStream.Close End Function