vagabond719 Posted May 7, 2013 Share Posted May 7, 2013 I am hoping someone can help me translate this code into AutoIt. We are using a web based ticketing system at work. Currently I have the queue manager pull the files via the website to plug into my current script. However I found on the Wiki this information to pull reports directly. From what I have been able to find out so far is the provided URL will open a data stream and then the data stream needs to be captured and saved to a file. Let me know if I can provide more detail than what is listed.From WIKI___________________________________________________________1. Add the following Imports:using System.Net; using System.IO;2. Call the Download method:static void Main(string[] args) { // Call to DownloadFile method supplying the URL and location to save CSV file locally int read = DownloadFile("https://myticketsystem.com/incident_list.do?CSV&sysparm_query=priority=1&sysparm_orderby=assigned_to", "c:\\test\\incident.csv"); }3. Create a Download method as follows:expandcollapse popuppublic static int DownloadFile(String url, String localFilename) { // Function will return the number of bytes processed // to the caller. Initialize to 0 here. int bytesProcessed = 0; // Assign values to these objects here so that they can // be referenced in the finally block Stream remoteStream = null; Stream localStream = null; WebResponse response = null; // Use a try/catch/finally block as both the WebRequest and Stream // classes throw exceptions upon error try { // Create a request for the specified remote file name WebRequest request = WebRequest.Create(url); // Create the credentials required for Basic Authentication System.Net.ICredentials cred = new System.Net.NetworkCredential("user_name", "password"); // Add the credentials to the request request.Credentials = cred; if (request != null) { // Send the request to the server and retrieve the // WebResponse object response = request.GetResponse(); if (response != null) { // Once the WebResponse object has been retrieved, // get the stream object associated with the response's data remoteStream = response.GetResponseStream(); // Create the local file localStream = File.Create(localFilename); // Allocate a 1k buffer byte[] buffer = new byte[1024]; int bytesRead; // Simple do/while loop to read from stream until // no bytes are returned do { // Read data (up to 1k) from the stream bytesRead = remoteStream.Read(buffer, 0, buffer.Length); // Write the data to the local file localStream.Write(buffer, 0, bytesRead); // Increment total bytes processed bytesProcessed += bytesRead; } while (bytesRead > 0); } } } catch (Exception e) { Console.WriteLine(e.Message); } finally { // Close the response and streams objects here // to make sure they're closed even if an exception // is thrown at some point if (response != null) response.Close(); if (remoteStream != null) remoteStream.Close(); if (localStream != null) localStream.Close(); } // Return total bytes processed to caller. return bytesProcessed; } Link to comment Share on other sites More sharing options...
FireFox Posted May 7, 2013 Share Posted May 7, 2013 Hi, Here you go (not tested) : expandcollapse popup;~ using System.Net; ;~ using System.IO; #include <WinHTTP.au3> #include <FileConstants.au3> Main() ;~ static void Main(string[] args) ;~ { Func Main() ; Call to DownloadFile method supplying the URL and location to save CSV file locally Local $hRead = InetGet("https://myticketsystem.com/incident_list.do?CSV&sysparm_query=priority=1&sysparm_orderby=assigned_to", _ "c:\test\incident.csv") InetClose($hRead) ;~ } EndFunc ;~ public static int DownloadFile(String url, ;~ String localFilename) ;~ { Func DownloadFile($sURL, $sLocalFilename) ; Function will return the number of bytes processed ; to the caller. Initialize to 0 here. ;~ int bytesProcessed = 0; Local $iBytesProcessed = 0 ; Assign values to these objects here so that they can ; be referenced in the finally block ;~ Stream remoteStream = null; ;~ Stream localStream = null; ;~ WebResponse response = null Local $bRemoteStream = Binary(""), $hLocalStream = 0, $bResptmp = $bRemoteStream ; Use a try/catch/finally block as both the WebRequest and Stream ; classes throw exceptions upon error ;~ try ;~ { ; Create a request for the specified remote file name ;~ WebRequest request = WebRequest.Create(url); Local $hWinHttpOpen = 0, $hWinHttpConnect = 0, $hWinHttpRequest = 0 $hWinHttpOpen = _WinHttpOpen() If @error Then Return 0 Local $aHost = StringRegExp($sURL, "https?://(.*?)/", 3) $hWinHttpConnect = _WinHttpConnect($hWinHttpOpen, $aHost[0]) If @error Then Return 0 ; Create the credentials required for Basic Authentication ;~ System.Net.ICredentials cred = new System.Net.NetworkCredential("user_name", "password"); ; Add the credentials to the request ;~ request.Credentials = cred; _WinHttpSetCredentials($hWinHttpConnect, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, "user_name", "password") If @error Then Return 0 ; Send the request to the server and retrieve the ; WebResponse object ;~ response = request.GetResponse(); $hWinHttpRequest = _WinHttpOpenRequest($hWinHttpConnect, "GET", _ StringTrimLeft($sURL, StringInStr($sURL, "/", 2, 3) -1)) ;~ if (request != null) ;~ { If @error Then Return 0 _WinHttpSendRequest($hWinHttpRequest) If @error Then Return 0 _WinHttpReceiveResponse($hWinHttpRequest) ;~ if (response != null) ;~ { If @error Then Return 0 ; Once the WebResponse object has been retrieved, ; get the stream object associated with the response's data ;~ remoteStream = response.GetResponseStream(); ; Create the local file ;~ localStream = File.Create(localFilename); $hLocalStream = FileOpen($sLocalFilename, BitOR($FO_BINARY, $FO_OVERWRITE)) ; Allocate a 1k buffer ;~ byte[] buffer = new byte[1024]; ;~ int bytesRead; Local $iBytesRead = 0 ; Simple do/while loop to read from stream until ; no bytes are returned ;~ do ;~ { While 1 ; Read data (up to 1k) from the stream ;~ bytesRead = remoteStream.Read(buffer, 0, buffer.Length); $bResptmp = _WinHttpReadData($hWinHttpRequest, 2) ;binary If @error Then ExitLoop ; Increment total bytes processed ;~ bytesProcessed += bytesRead; $iBytesProcessed += @extended ; Write the data to the local file ;~ localStream.Write(buffer, 0, bytesRead); FileWrite($hLocalStream, $bResptmp) WEnd ;~ } while (bytesRead > 0); ;~ } ;~ } ;~ } ;~ catch (Exception e) ;~ { ;~ Console.WriteLine(e.Message); ;~ } ;~ finally ;~ { ; Close the response and streams objects here ; to make sure they're closed even if an exception ; is thrown at some point ;~ if (response != null) response.Close(); ;~ if (remoteStream != null) remoteStream.Close(); _WinHttpCloseHandle($hWinHttpRequest) _WinHttpCloseHandle($hWinHttpConnect) _WinHttpCloseHandle($hWinHttpOpen) ;~ if (localStream != null) localStream.Close(); FileClose($hLocalStream) ;~ } ; Return total bytes processed to caller. ;~ return bytesProcessed; Return $iBytesProcessed ;~ } EndFunc Note: I doubt that the InetGet function will work with your url, you will have to use the WinHTTP UDF like I did for the DownloadFile function. Br, FireFox. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now