private void UploadThread(object param) { var parms = (object[]) param; var error = (ErrorReturn) parms[3]; error.Code = ErrorCodes.Succeeded; error.Exception = null; error.ReportedError = null; try { CookieAwareWebClient client = new CookieAwareWebClient(); var text = client.DownloadString("http://minecraft.net/login"); Match match = Regex.Match(text, @"<input type=""hidden"" name=""authenticityToken"" value=""(.*?)"">"); string authToken = null; if (match.Success) authToken = match.Groups[1].Value; if (authToken == null) return; var data = new NameValueCollection(); data.Add("authenticityToken", authToken); data.Add("username", (string)parms[0]); data.Add("password", (string)parms[1]); data.Add("redirect", "/profile"); var returnData = Encoding.UTF8.GetString(client.UploadValues("https://minecraft.net/login", data)); match = Regex.Match(returnData, @"<p class=""error"">([\w\W]*?)</p>"); if (match.Success) { error.ReportedError = match.Groups[1].Value.Trim(); error.Code = ErrorCodes.WrongCredentials; } else { var dict = new Dictionary<string, string>(); dict.Add("authenticityToken", authToken); if ((error.Exception = client.UploadFileEx("http://minecraft.net/profile/skin", parms[2].ToString(), "skin", "image/png", dict)) != null) error.Code = ErrorCodes.Unknown; } } catch (Exception ex) { error.Exception = ex; } finally { Invoke(delegate { _pleaseWaitForm.Close(); }); } }