Here is a USAB I coded in C# that I was going to release, but there is already plenty out there. Credits to cx323 for the Wrapper, GetBetween, and GetAllBetween functions. Note: I used vbnet highlighting because there wasn't one for C# Form1.cs Code (Text): using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using goodwrap; namespace WindowsFormsApplication1 { public partial class Form1 : Form { wrapper http = new wrapper(); bool logged = false; string shopurl; string buyurl; string buyparam = "containing"; string[] stock; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { loginstatus.Text = "Logging in..."; if (http.NeoLogin(username.Text, password.Text, ref logged) == "Logged In") { loginstatus.Text = "Logged in."; log.Items.Add(CurrentTime() + ": Logged In."); log.SelectedIndex = log.Items.Count - 1; } else { loginstatus.Text = "Error."; } } private void Form1_Load(object sender, EventArgs e) { log.Items.Add(CurrentTime() + ": Loaded"); log.SelectedIndex = log.Items.Count - 1; } public string CurrentTime() { string TimeInString = null; int hour = DateTime.Now.Hour; int min = DateTime.Now.Minute; int sec = DateTime.Now.Second; TimeInString = (hour < 10) ? "0" + hour.ToString() : hour.ToString(); TimeInString += ":" + ((min < 10) ? "0" + min.ToString() : min.ToString()); TimeInString += ":" + ((sec < 10) ? "0" + sec.ToString() : sec.ToString()); return TimeInString; } private static void Pause(double seconds) { double num = seconds * 1000; DateTime t1 = DateTime.Now, t2 = DateTime.Now; TimeSpan tmDiff = t2 - t1; while (Convert.ToDouble(tmDiff.TotalMilliseconds.ToString()) < num) { t2 = DateTime.Now; tmDiff = t2 - t1; Application.DoEvents(); } } private void button2_Click(object sender, EventArgs e) { if (logged && item.Text != "" && System.Convert.ToInt32(maxprice.Text) > 0 && System.Convert.ToInt32(textBox5.Text) > 0) { timer1.Interval = System.Convert.ToInt32(textBox5.Text) * 1000; timer1.Enabled = true; log.Items.Add(CurrentTime() + ": Started Searching"); log.SelectedIndex = log.Items.Count - 1; button2.Enabled = false; button3.Enabled = true; if (radioButton1.Checked) { buyparam = "containing"; } else if (radioButton2.Checked) { buyparam = "exact"; } } else { MessageBox.Show("Please properly fill all fields."); } } public string[] GrabAllBetween(string strSource, string strStart, string strEnd) { List<string> Matches = new List<string>(); for (int pos = strSource.IndexOf(strStart, 0), end = pos >= 0 ? strSource.IndexOf(strEnd, pos) : -1; pos >= 0 && end >= 0; pos = strSource.IndexOf(strStart, end), end = pos >= 0 ? strSource.IndexOf(strEnd, pos) : -1) { Matches.Add(strSource.Substring(pos + strStart.Length, end - (pos + strStart.Length))); } return Matches.ToArray(); } public string GetBetween(string Source, string Starting, string Ending) { int Start, End; if (Source.Contains(Starting) && Source.Contains(Ending)) { Start = Source.IndexOf(Starting, 0) + Starting.Length; End = Source.IndexOf(Ending, Start); return Source.Substring(Start, End - Start); } else { return ""; } } public bool checkstock(string price) { if (System.Convert.ToInt32(price) <= System.Convert.ToInt32(maxprice.Text)) { log.Items.Add(CurrentTime() + ": Found item for " + price); log.SelectedIndex = log.Items.Count - 1; shopurl = "http://www.neopets.com/browseshop.phtml?" + GetBetween(textBox1.Text, "/browseshop.phtml?", price) + price; textBox1.Text = http.Request("GET", shopurl.ToString(), "http://www.neopets.com/market.phtml"); buyurl = "http://www.neopets.com/" + GetBetween(textBox1.Text, "<TD width=\"120\" align=\"center\" valign=\"top\"><A href=\"", "\"").ToString(); textBox1.Text = http.Request("GET", buyurl, shopurl); if (textBox1.Text.Contains("HTTP/1.1 302 Found")) { log.Items.Add(CurrentTime() + ": Bought item for " + price + "NP!"); log.SelectedIndex = log.Items.Count - 1; } else { log.Items.Add(CurrentTime() + ": Missed item :("); log.SelectedIndex = log.Items.Count - 1; } return true; } else { return false; } } public string[] searchstock() { textBox1.Text = http.Request("GET", "http://www.neopets.com/market.phtml?type=wizard", "http://www.neopets.com/index.phtml"); textBox1.Text = http.Request("POST", "http://www.neopets.com/market.phtml?type=process_wizard&feedset=0&shopwizard=" + item.Text.Replace(" ", "+") + "&table=" + buyparam + "&criteria=containing&min_price=0&max_price=" + maxprice.Text, "http://www.neopets.com/market.phtml?type=wizard"); return GrabAllBetween(textBox1.Text, "buy_cost_neopoints=", "\"").ToArray(); } private void timer1_Tick(object sender, EventArgs e) { stock = searchstock(); for (int x = 0; x < stock.Length; x++) { if (checkstock(stock[x])) { Pause(3); stock = searchstock(); } else { Pause(3); stock = searchstock(); } }[code][code] [/code] } private void button3_Click(object sender, EventArgs e) { button3.Enabled = false; button2.Enabled = true; timer1.Enabled = false; log.Items.Add(CurrentTime() + ": Stopped."); log.SelectedIndex = log.Items.Count - 1; } } } [/code] Wrapper.cs (Credits to cx323) Code (Text): using System; using System.Collections.Generic; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Text.RegularExpressions; using System.IO; using System.IO.Compression; using System.Net.Sockets; namespace goodwrap { class wrapper { private TcpClient client; IDictionary<string, string> colCookies = new Dictionary<string, string>(); public string strCookies; public string LastPage; public string Request(string Method, string URL, string Referer) { string Host = null; string strFile = null; string strPost = null; int pos = 0; if (Referer == null) { Referer = LastPage; } if (URL.Contains("http://")) { Host = URL.Substring(7); } else { Host = URL; } if (Host.Contains("/")) { pos = Host.IndexOf("/", 0); strFile = Host.Substring(pos); Host = Host.Substring(0, pos); } else { strFile = "/"; } if (Method == "POST") { pos = strFile.IndexOf("?"); if (pos != -1) { strPost = strFile.Substring(pos + 1); strFile = strFile.Substring(0, pos); } else { strPost = null; } } LastPage = URL; string ReqHeaders = null; if (Method == "GET" || Method == "PIC") { ReqHeaders = "GET" + " " + strFile + " HTTP/1.1" + "\r\n" + "Host: " + Host + "\r\n" + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (.NET CLR 3.5.30729)" + "\r\n" + "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + "\r\n" + "Accept-Language: en-us,en;q=0.5" + "\r\n" + "Accept-Encoding: gzip, deflate" + "\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" + "\r\n" + "Keep-Alive: 300" + "\r\n" + "Connection: keep-alive" + "\r\n" + "Referer: " + Referer + "\r\n" + "Cookie: " + strCookies + "\r\n" + "\r\n"; } else { ReqHeaders = "POST " + strFile + " HTTP/1.1" + "\r\n" + "Host: " + Host + "\r\n" + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 (.NET CLR 3.5.30729)" + "\r\n" + "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" + "\r\n" + "Accept-Language: en-us,en;q=0.5" + "\r\n" + "Accept-Encoding: gzip, deflate" + "\r\n" + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" + "\r\n" + "Keep-Alive: 300" + "\r\n" + "Connection: keep-alive" + "\r\n" + "Referer: " + Referer + "\r\n" + "Cookie: " + strCookies + "\r\n" + "Content-Type: application/x-www-form-urlencoded" + "\r\n" + "Content-Length: " + strPost.Length.ToString() + "\r\n" + "Connection: close" + "\r\n" + "\r\n" + strPost; } if (Method == "PIC") ReqHeaders.Replace("Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", "Accept: image/png,*/*;q=0.5"); client = new TcpClient(Host, 80); Byte[] headers = System.Text.Encoding.ASCII.GetBytes(ReqHeaders); NetworkStream ns = client.GetStream(); ns.Write(headers, 0, headers.Length); StreamReader sr = new StreamReader(ns, Encoding.Default); String strHTML = sr.ReadToEnd(); string[] strParts = Regex.Split(strHTML, Environment.NewLine + Environment.NewLine); strCookies = ParseCookies(strParts[0]); if (strParts[0].Contains("Content-Encoding")) { strParts[1] = DecompressGzip(strParts[1]); } return strParts[0] + Environment.NewLine + Environment.NewLine + strParts[1]; } public string DecompressGzip(string compressed) { MemoryStream memStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(compressed)); GZipStream decompressStream = new GZipStream(memStream, CompressionMode.Decompress); byte[] endBytes = new byte[4]; int position = (int)memStream.Length - 4; memStream.Position = position; memStream.Read(endBytes, 0, 4); memStream.Position = 0; byte[] buffer = new byte[BitConverter.ToInt32(endBytes, 0) + 100]; int offset = 0; int total = 0; while (true) { int o = decompressStream.Read(buffer, offset, 100); if (o == 0) break; offset += o; total += o; } return Encoding.ASCII.GetString(buffer); } public string NeoLogin(string user, string pass, ref bool loggedIn) { string strHTML = null; Request("GET", "http://neopets.com/loginpage.phtml", "http://google.com"); Pause(1); Request("POST", "http://www.neopets.com/hi.phtml?destination=%2Fpetcentral.phtml&username=" + user, "http://neopets.com/loginpage.phtml"); Pause(1); strHTML = Request("POST", "http://www.neopets.com/login.phtml?username=" + user + "&password=" + pass + "&destination=%2Fpetcentral.phtml", "http://neopets.com/hi.phtml"); if (strHTML.Contains("Set-Cookie: neologin=")) { loggedIn = true; return "Logged In"; } else if (strHTML.Contains("too many times")) { loggedIn = false; return "To Many Login Attempts"; } else if (strHTML.Contains("badpassword")) { loggedIn = false; return "Wrong Password"; } else if (strHTML.Contains("frozen")) { loggedIn = false; return "Account Frozen"; } else if (strHTML.Contains("just a technical problem")) { loggedIn = false; return "Neopets is down for maintenance."; } else { loggedIn = false; return strHTML; } } private static void Pause(double seconds) { double num = seconds * 1000; DateTime t1 = DateTime.Now, t2 = DateTime.Now; TimeSpan tmDiff = t2 - t1; while (Convert.ToDouble(tmDiff.TotalMilliseconds.ToString()) < num) { t2 = DateTime.Now; tmDiff = t2 - t1; Application.DoEvents(); } } public string StripHeaders(string strSource) { string[] strParts = Regex.Split(strSource, Environment.NewLine + Environment.NewLine); return strParts[1]; } public Bitmap GrabPic(string strURL) { MemoryStream memStream = new MemoryStream(System.Text.Encoding.Default.GetBytes(StripHeaders(Request("GET", strURL, LastPage)))); Bitmap bitmap = new Bitmap(memStream); return bitmap; } public void ClearCookies() { colCookies.Clear(); strCookies = null; } public string ParseCookies(string Headers) {//Credit's to Mystical for RegEx string ParseCookies = null; MatchCollection matches; Regex reg = new Regex("set-cookie:\\s*([^=]+)=([^;]+);", RegexOptions.IgnoreCase); if (reg.IsMatch(Headers)) { matches = reg.Matches(Headers); foreach (Match m in matches) { if (colCookies.ContainsKey(m.Groups[1].ToString())) { colCookies.Remove(m.Groups[1].ToString()); colCookies.Add(m.Groups[1].ToString(), m.Groups[1].ToString() + "=" + m.Groups[2].ToString()); } else { colCookies.Add(m.Groups[1].ToString(), m.Groups[1].ToString() + "=" + m.Groups[2].ToString()); } } } foreach (KeyValuePair<string, string> item in colCookies) { ParseCookies = ParseCookies + item.Value.ToString() + "; "; } return ParseCookies; } } }