Updated 2017 PHP code to automatically bid/buy an eBay auction item

Updated code to automatically bid on an eBay item, I’m currently using it myself if a loop of searched items.

Most of the changes are the query strings which is a lot more involved now. For testing use one cent items with free shipping.

	// MAIN BIDDING FUNCTION MAIN BIDDING FUNCTION
	// this function performs no checking on the input variables
	// $username  -  the eBay user name
	// $password  -  the eBay user password
	// $item      -  the eBay item number to bid on
	// $bid       -  the bid amount in local currency i.e. 5.67
	// $link      -  itemlink with referral, can leave empty i.e. ''
	function place_bid($username, $password, $item, $bid, $link) {

		$cookies = dirname(__FILE__).'/cookies.txt';
		
		//set success as default false
		$success = false;
		$bid_success = false;

		$curl = curl_init();
		curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)');
		curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($curl, CURLOPT_REFERER, $link);
		curl_setopt($curl, CURLOPT_COOKIEFILE, $cookies);
		curl_setopt($curl, CURLOPT_COOKIEJAR, $cookies);
		
		//query the sign-out page
		//curl_setopt($curl, CURLOPT_URL, "https://signin.ebay.com/ws/eBayISAPI.dll?SignIn&lgout=1");
		//$ret = curl_exec ($curl);
		
		//query the referal link page
		if ($link) {
			curl_setopt($curl, CURLOPT_URL, $link);
			$ret = curl_exec ($curl);
		}
		
		//IMPORTANT		
		//query the sign-in page to set the cookies
		curl_setopt($curl, CURLOPT_URL, 'https://signin.ebay.com/aw-cgi/eBayISAPI.dll?SignIn&campid=5337161990&customid=7');
		$ret = curl_exec ($curl);
		
		$data = [];
		$numbers = [];
		if (preg_match('%(<form name="SignInForm".*?<\/form>)%im', $ret, $regs)) {

			$dom = new DOMDocument;
			$dom->loadHTML($regs[0]);
			$nodes = $dom->getElementsByTagName('input');
			
			foreach($nodes as $node) {
				$name  = $node->getAttribute('name');
				$value = $node->getAttribute('value');
				//$size  = $node->getAttribute('size');
				$type  = $node->getAttribute('type');
				
				$data[$name] = $value;
				
				if (is_numeric($name)) {
					if ($type == 'text') {
						$data[$name] = $username;
					}
					if ($type == 'password') {
						$data[$name] = $password;
					}
				}
			}
		}
		
		unset($data['']);
		$data_str = http_build_query($data);
		
		//sign-in
		curl_setopt($curl, CURLOPT_URL, "https://signin.ebay.com/ws/eBayISAPI.dll?co_partnerId=2&siteid=0&UsingSSL=1");
		curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
		curl_setopt($curl, CURLOPT_POSTFIELDS, $data_str);
		$ret = curl_exec ($curl);
		
		if(curl_errno($curl)){
			ebaylog('Curl error: ' . curl_error($curl));
		}
		if (!$ret) {
			$ret = curl_exec ($curl);
			if(curl_errno($curl)){
				ebaylog('Curl error: ' . curl_error($curl));
			}
			if (!$ret) {
				$ret = curl_exec ($curl);
				if(curl_errno($curl)){
					ebaylog('Curl error: ' . curl_error($curl));
				}
			}
		}
		
		curl_setopt($curl, CURLOPT_URL, 'https://www.ebay.com/myb/WatchList');
		$ret = curl_exec ($curl);
		
		//test_write($ret);
		
		if(curl_errno($curl)){
			ebaylog('Curl error: ' . curl_error($curl));
		}
		if (!$ret) {
			$ret = curl_exec ($curl);
			if(curl_errno($curl)){
				ebaylog('Curl error: ' . curl_error($curl));
			}
			if (!$ret) {
				$ret = curl_exec ($curl);
				if(curl_errno($curl)){
					ebaylog('Curl error: ' . curl_error($curl));
				}
			}
		}

		
		
		//if (strpos($ret, '"loggedIn":true') === FALSE) {
		if ((strpos($ret, "userid={$username}") === FALSE) && (strpos($ret, "usr/{$username}") === FALSE)) {
			if (preg_match('%<b class="altTitle">(.*)</b>%', $ret, $regs)) {
				$err = $regs[1];
				ebaylog("\"{$err}\"");
				if (strpos($err, 'The alerts below') === 0) {
					ebaylog("{$item}: 'The alerts below' found, successful");
					//set it to succes
				}
			} else {
				ebaylog("{$item}: Failed signing in");
				if (preg_match('%<font face=".*?" size="3"><b>(.*?)</b></font>%', $ret, $regs)) {
					$err = $regs[1];
					ebaylog("\"{$err}\"");
				}
				
				//test_write($ret);
				goto end;
			}
			
			
		} else {
			ebaylog("{$item}: Success signing in");
		}
		
		
		//place the inital bid
		curl_setopt($curl, CURLOPT_URL, "https://offer.ebay.com/ws/eBayISAPI.dll?MakeBid&item={$item}&maxbid={$bid}&campid=5337161990&customid=7");
		$ret = curl_exec ($curl);
		if(curl_errno($curl)){
			ebaylog('Curl error: ' . curl_error($curl));
		}
		if (!$ret) {
			$ret = curl_exec ($curl);
		}

		if (preg_match_all('/(?:value="([-0-9a-zA-Z]*)" *)?name="stok"(?: *value="([-0-9a-zA-Z]*)")?/', $ret, $regs)) {
			$stok = $regs[1][0];
		} else {
			//Failed to get 'stok' value
			//try and determine why
			if (preg_match('%<div class="statusDiv">(.*?)</div>%', $ret, $regs)) {
				$err = $regs[1];
				ebaylog("'{$err}'");
				//if string starts with "Enter US $0.41 or more"
				if (stripos($err, 'Enter') === 0) {
					ebaylog("{$item}: 'Enter' found, aborting");
					//set it to success
					$success = true;
				} else if (stripos($err, 'To enter a') === 0) {
					ebaylog("{$item}: 'To enter a' found, aborting");
					//set it to success
					$success = true;
				} else if (stripos($err, 'Transaction Blocked') === 0) {
					ebaylog("{$item}: 'Transaction Blocked' found, aborting");
					//set it to success
					$success = true;
				}
				
			} else if (preg_match('%"\d*" - Invalid Item</div>%', $subject)) {
				ebaylog("{$item}: 'Invalid Item' found, aborting");
				test_write($ret);
				//set it to success
				$success = true;
			} else if (preg_match('%<div class="subTlt"><ul class="errList"><li>(.*?)</li></ul></div>%', $subject)) {
				ebaylog("{$item}: 'no longer available' found, aborting");
				test_write($ret);
				//set it to success
				$success = true;
			} else if (preg_match('%id="w\d-\d-_msg".*?>(.*?)</span>%', $ret, $regs)) {
				ebaylog("'{$regs[1]}'");
			} else if (preg_match('%<div\s+class\s*=\s*"(?:errRed|errBlk|errTitle|statusDiv)"\s*>(.*?)</div>%i', $ret, $regs)) {
				ebaylog("'{$regs[1]}'");
			} else {
				//don't know why so log the page
				ebaylog("{$item}: Failed to get 'stok' value");
				test_write($ret);
			}
			goto end;
		}
		
		if (preg_match_all('/(?:value="([-0-9a-zA-Z]*)" *)?name="uiid"(?: *value="([-0-9a-zA-Z]*)")?/', $ret, $regs)) {
			$uiid = $regs[1][0];
		} else {
			ebaylog("{$item}: Failed to get 'uiid' value");
			goto end;
		}
		

		if ($stok && $uiid) {
			ebaylog("{$item}: Success placing initial bid");
		} else {
			ebaylog("{$item}: Failed placing initial bid");
			goto end;
			
		}
		
		//confirm the bid
		curl_setopt($curl, CURLOPT_URL, "https://offer.ebay.com/ws/eBayISAPI.dll?MfcISAPICommand=MakeBid&maxbid={$bid}&quant=1&mode=1&stok={$stok}&uiid={$uiid}&co_partnerid=2&user={$username}&fb=0&item={$item}&campid=5337161990&customid=7");
		$ret = curl_exec ($curl);
		if(curl_errno($curl)){
			ebaylog('Curl error: ' . curl_error($curl));
		}
		if (!$ret) {
			$ret = curl_exec ($curl);
		}
		
		//perform a number of tests to determine if the bid was a success
		$bid_success = true;
		if (stripos($ret, "you're the first bidder") === FALSE) {
			if (stripos($ret, "you're the high bidder and currently in the lead") === FALSE) {
				if (stripos($ret, "you're currently the highest bidder") === FALSE) {
					$bid_success  = false;
					ebaylog("{$item}: Failed placing final bid");
					//try and determine why
					if (preg_match('%<div\s+class\s*=\s*"(?:errRed|errBlk|errTitle|statusDiv|title)"\s*>(.*?)</div>%i', $ret, $regs)) {
						$err = $regs[1];
						ebaylog("'{$err}'");
						if (stripos($err, 'Enter') === 0) {
							ebaylog("{$item}: 'Enter' found, aborting");
							//set it to success
							$bid_success = true;
						} else if (stripos($err, "You've just been outbid") === 0) {
							ebaylog("{$item}: 'You've just been outbid' found, aborting");
							//set it to success
							$bid_success  = true;
						} else if (stripos($err, "You're currently the high bidder,") === 0) {
							ebaylog("{$item}: 'You're currently the high bidder, but the reserve hasn't been met.' found, aborting");
							//set it to success
							$bid_success  = true;
						}
					} else {
						//we don't know why it failed so write the data
						test_write($ret);
					}
				}
			}
		}
		
		if ($bid_success) {
			ebaylog("{$item}: Success placing final bid");
			$success = true;
		}
		
		end:
		
		//close the curl session
		curl_close ($curl);
		
		if ($success) {
			ebaylog("{$item}: Success: {$username}");
		} else {
			ebaylog("{$item}: Failure: {$username}");
		}
		
		return $success;
	}
	
	//for testing
	function test_write($out) {
		$fh = fopen(dirname(__FILE__).'/'.date('Y-m-d H-i-s').'.html', 'w');
		fwrite($fh, $out);
		fclose($fh);
	}

	//simple logging function
	function ebaylog($msg) {
		$msg = "{$msg}\r\n";
		echo $msg;
		$fh = fopen(dirname(__FILE__).'/ebay-log.txt', 'a');
		fwrite($fh, date('Y-m-d H-i-s')." {$msg}");
		fclose($fh);
	}

Posted

in

, ,

by

Tags:

Comments

One response to “Updated 2017 PHP code to automatically bid/buy an eBay auction item”

  1. Ian Noverta Hutajulu Avatar
    Ian Noverta Hutajulu

    how to start?

Leave a Reply

Your email address will not be published. Required fields are marked *