Ebay Auction Sniping

If you have ever participated in an auction, you may have sometimes lost what seemed like a very good deal at the very last minute. We will describe here how and why that might happen and how you could as well win an auction at the last minute.

auction-sniperSniping refers to entering your auction bid at the very last possible moment, avoiding thus being outbid by other less disciplined bidders or to avoid techniques or situations such as bid chasing, bidding wars, maximum bid fishing, or shill bidding (see the Wikipedia article linked below for explanations). Research by economists seem to qualify sniping as a “rational gain-minimizing strategy”.

Economic analysis of sniping (Roth and Ockenfels, 2000[3]) suggests that sniping is a rational gain-maximizing (i.e., price-minimizing) strategy for bidders in auctions which fulfill two criteria: 1) the end time is rigidly fixed, and 2) it is possible to gain additional information about the "true" value of the item by inspecting previous bids. For example, a novice antiques buyer may prefer to bid in auctions which already have bids placed by more experienced antiques buyers, on the grounds that the items which the experienced buyers are interested in are more likely to be valuable. In this case, more informed buyers may delay bidding until the last minutes of the auction to avoid creating competition for their bids, leading to a lower winning bid. The highest bid 10 minutes before the end of a contested auction is often not at all representative of the eventual selling price.

Analysis of actual winning bids on eBay (Yang and Kahng, 2006[4]) suggests that winning bidders are more likely to have placed a single bid late in the auction, rather than placing multiple incremental bids as the auction progresses.

Auction Sniping is not illegal and according to Wikipedia is permitted by eBay (there is even a guide on their website – hwddlr). However, some commentators (so-ebayapi) have pointed out that the PlaceOffer API license agreement addendum (PDF) prohibits developers from offering this service.

online

Despite the prohibition, a number of websites offer this service online, making it very convenient and easy to snipe (although for the most part you have to pay a fee).

Gixen-comparisonA number of Sniping Services exist, the only completely free one being Gixen, which also provides the above comparison chart on their website. Still, Auction Stealer is “freemium” while Auction Sniper has a free trial with 3 free snipes. All these services require you to enter your eBay username and password, which opens you to identity theft. Some of the websites above may even provide Android and iPhone apps. There is even one such app that is seemingly providing free service – Myibidder – and it seems associated with a website purporting to offer this service for free, although on Android a “pro” version of the app currently costs in excess of $10. YouBidder.com and Goofbid.com are yet other such a supposedly free services, while Hidbid.com allows 5 free snipes per week.

We have no reason to suspect that any of the aforementioned services is a scam, but they all need your eBay username and password to work, and as such, you run a higher risk of identity theft by spreading your credentials around. A script or program that you run yourself offers a greater degree of protection.

JBidWatcher

This is a venerable and yet still actively developed Java-based, multiplatform application. A Windows executable and installer is provided and you can also download the jar file (currently at version 2.5.6).

sourceforge

This used to be the primary repository for free software. Projects hosted there are generally in the format ProjectName.sourceforge.net, while the files can be found at sourceforge.net/projects/ProjectName.

For example, esniper, a famous and quite old project, yet still updated, has generated even a front-end: es-f or “esniper frontend.” Other such projects include AuctionMage (last upd: 2005), Bidwatcher (abandoned), Biet-O-Matic (bom, in German, frequently updated).

github

This repository seems to long ago have replaced sourceforge as the hip place to commit and store your code. A search (github-srch) finds the following: madprogrammer/sniper 4 y.o., anentropic/esniper-manager 2 y.o. (from backsla.sh/sniper).

jcomeau

John Comeau has created this Python script in 2009 and released it under GNU v2 or later. I am reproducing it here for archival purposes (jcb).

This is a Python script.
#!/usr/bin/python
"""snipe bids on eBay

   wait until specified second before auction ends and place bid"""
Copyright = """
    bidsnipe - sneaky way to win eBay auctions
    Copyright (C) 2009  John Comeau <jc.unternet.net>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    """
import sys, os, re, pwd, time
import urllib, urllib2, cookielib
from BeautifulSoup import BeautifulSoup
cookiejar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))

def findLoginForm(soup):
 pattern = re.compile('(?i)login')
 forms = soup.findAll('form')
 loginforms = filter(lambda node: pattern.search(node.get('action')), forms)
 if len(loginforms) != 1:
  raise Exception, 'Document does not contain one and only one login form'
 return loginforms[0]

def getInputs(soup):
 inputs = soup.findAll('input')
 return dict([[input.get('name').encode('utf8'),
  input.get('value').encode('utf8')] for input in inputs])

def bidsnipe(item=11111111, maxbid=1, seconds=10):
 """bid on item number with max price at so many seconds before end

    takes those 3 arguments, gets login info from $HOME/.netrc file
 """
 print >>sys.stderr, 'sleeping %s seconds' % seconds
 time.sleep(float(seconds))
 ebay = 'm.ebay.com'  # mobile eBay site has less garbage to sift through
 page = login(ebay)
 socket = opener.open('https://%s/Pages/ViewItem.aspx?aid=%s' % (ebay, item))
 soup = BeautifulSoup(socket.read())
 socket.close()
 socket = opener.open('https://%s/Member/Bid.aspx?btnOffer=btnOffer' % ebay)
 soup = BeautifulSoup(socket.read())
 socket.close()
 bidform = soup.findAll('form')[-1]
 inputs = getInputs(bidform)
 inputs.pop('btnCancel')
 inputs['bid'] = maxbid
 action = bidform.get('action')
 enctype = bidform.get('enctype')
 loginurl = 'https://%s' % ebay + action
 opener.addheaders = [('content-type', enctype)]
 socket = opener.open(loginurl, urllib.urlencode(inputs))
 soup = BeautifulSoup(socket.read())
 socket.close()
 confirmform = soup.findAll('form')[-1]
 print >>sys.stderr, confirmform
 inputs = getInputs(confirmform)
 print >>sys.stderr, inputs
 inputs.pop('btnCancel')
 inputs.pop('btnBack')
 action = confirmform.get('action')
 enctype = confirmform.get('enctype')
 loginurl = 'https://%s' % ebay + action
 opener.addheaders = [('content-type', enctype)]
 socket = opener.open(loginurl, urllib.urlencode(inputs))
 page = BeautifulSoup(socket.read())
 socket.close()
 return page
def login(ebay):
 pattern = '^machine\s+%s\s+login\s+(\S+)\s+password\s+(.*\S)\s*$' % ebay
 login_data = filter(re.compile(pattern).match, open(os.path.join(
  pwd.getpwuid(os.geteuid())[5], '.netrc')).readlines())
 username, password = re.compile(pattern).match(login_data[-1]).groups()
 socket = opener.open('https://%s/' % ebay)
 soup = BeautifulSoup(socket.read())
 socket.close()
 loginform = findLoginForm(soup)
 enctype = loginform.get('enctype')
 action = loginform.get('action')
 loginurl = 'https://%s' % ebay + action
 opener.addheaders = [('content-type', enctype)]
 socket = opener.open(loginurl, urllib.urlencode(getInputs(loginform)))
 soup = BeautifulSoup(socket.read())
 socket.close()
 loginform = findLoginForm(soup)
 inputs = getInputs(loginform)
 inputs['uid'] = username
 inputs['upw'] = password
 inputs.pop('btnCancel')
 enctype = loginform.get('enctype')
 action = loginform.get('action')
 loginurl = 'https://%s' % ebay + action
 opener.addheaders = [('content-type', enctype)]
 socket = opener.open(loginurl, urllib.urlencode(inputs))
 page = socket.read()
 socket.close()
 if username in page:
  sys.stderr.write('login successful\n')
 return page
if __name__ == '__main__':
 item, maxbid, seconds = (sys.argv[1:] + ['', '', ''])[0:3]
 print bidsnipe(item, maxbid, seconds)
else:
 # if you want something to be done on import, do it here; otherwise pass
 pass

 

paulschou

Paul Schou has also released an earlier, similar tool, although this one has no scheduling and was written in 2007 (pss).

This is a bash script.

#!/bin/bash
#
# Written by Paul Schou for ebay last minute bidding. 1 Dec 2007
#
ver='0.1c'

# Set these parameters to your account details:
user=''
pass='thepassword'


# Do not modify below:
item=$1
max=$2
tmp=/tmp/
if [ `date +%s` -gt 1199174400 ]; then
    echo "Please run $0 -v to check for updates"
fi

if [ "$item" == "-v" ]; then
    echo "Snipe version $ver (EBay Auction Sniper)";
    curl -s -A "Snipe Version $ver" --data "uname=`uname -a`" http://paulschou.com/tools/sniper/update.php
    exit
fi
if [ "$user" == "" ]; then
    echo "ERROR: ebay username / password is not set.";
    exit
fi
if [ "$item" == "" ]; then
    echo "Usage: $0 [auction number] [amount to bid]"
    exit
fi

encpass=`echo "<?php echo urlencode('$pass'); ?>" | php`
cookies=/tmp/$user.cookies
rm $cookies
post="MfcISAPICommand=SignInWelcome&lse=false&lsv=&mid=&hmid=&siteid=0&co_partnerId=2&UsingSSL=1&ru=&pp=&pa1=&pa2=&pa3=&i1=-1&pageType=-1&rtmData=&userid=$user&pass=$encpass&keepMeSignInOption=1"

sw="-s -L -A Mozilla -b $cookies -c $cookies"
echo "item:    $item"
echo "max bid: $max"

echo Loading sign in page...
curl $sw -o $tmp/mytest1.html "https://signin.ebay.com/ws/eBayISAPI.dll?SignIn"
echo Signing in...
curl $sw -o $tmp/mytest2.html --data "$post" "https://signin.ebay.com/ws/eBayISAPI.dll?UsingSSL=1"
echo Making bid...
curl $sw -o $tmp/mytest4.html "http://offer.ebay.com/ws/eBayISAPI.dll?maxbidTop=$max&MfcISAPICommand=MakeBid&fb=2&co_partnerid=&item=$item&input_bid=$max"
key=`grep =.key mytest4.html | sed -e 's/.*key"[^"]*"\([^"]*\).*/\1/g'`
if [ "$key" == "" ]; then
    echo "ERROR: Bid not accepted."
else
    echo "bid key: $key"
    keystr=`grep =.key mytest4.html | sed -e 's/<.t.>//g' -e 's/<input type="[^"]*" name="\([^"]*\)" value="\([^"]*\)"[^>]*>/\&\1=\2/g' | tr -d '\r\n'`
    uiid=`grep uiid mytest4.html | sed -e 's/<t.>//g' -e 's/.*<input type="[^"]*" name="\([^"]*\)" VALUE="\([^"]*\)".*>/\1=\2/g'| tr -d '\r\n'`

    printf "===== Notice =====\nYou are agreeing to a contract -- \n\nYou will enter into a legally binding contract to purchase the item from the seller if you're the winning bidder. You are responsible for reading the full item listing, including the seller's instructions and accepted payment methods.  Seller assumes all responsibility for listing this item.\n\n"
echo Confirming bid...
    curl $sw -o $tmp/mytest5.html --data "BIN_button=Confirm Bid&$uiid$keystr" http://offer.ebay.com/ws/eBayISAPI.dll
fi
echo Checking status...
curl $sw -o $tmp/mytest6.html "http://offer.ebay.com/ws/eBayISAPI.dll?ViewBids&item=$item"
status=`grep -A 1 status mytest6.html | tail -1`
echo "status: " $status;
grep titleValueFont mytest6.html | sed -e "s/<\/span>/  /g" -e 's/<[^>]*>//g'
grep -A 3 findresulttitle mytest6.html | grep '</td' | sed -e "s/^[ \t]*//" -e 's/<[^>]*>//g' | sed '/\n$/b'

 

alternatives

If, by now, you are sick and tired of eBay, you might want to consider other services.

Auction sites (also fixed price)

  • eBid.net – auction and fixed price, this is perhaps the oldest alternative, with varying fees starting at 3% on the sale price.
  • BidStart – complicated fee structure, 8% or less
  • Onlineauction – $8/month, started by a disgruntled eBay PowerSeller
  • ealtbay – only 1.6% of sale price in fees, but low traffic
  • tophatter – entertaining, with avatars and chat
  • uBid – sliding scale of 5% and less
  • cqout – from UK; no listing fees but $3 for registering + sliding scale of 7% and less
  • liquidation –  bulk and large quantities; 10-15% or $30, whichever is greater + no bid fee if no bids; NASDAQ

Fixed price (classifieds)

  • Craigslist.org – high traffic, absolutely free (no fees); eBay is trying to get their traffic with a similar site, Kijiji, and they have even bought part of it
  • Freecycle.org – everything is free, but craigslist has a free section as well
  • Facebook Marketplace – run by oodle, used mostly for real estate and cars
  • amazon – high traffic, fees 8%-25%, optional $39.00 monthly subscription for a pro seller account
  • etsy – focused on handmade and vintage items, $0.20/listing + 3.5% of sale price, free store
  • newegg – 8-15% depending on category but free cred card processing
  • ecrater – free, with optional 2.9% marketplace advertising
  • bonanza – a lot of fashion an handmade items, 3.5% of sale price, no listing fees
  • artfire – similar to etsy but $12.95/month
  • tias – antiques, it can submit to over 2000 classified ad networks, $39.95/month or 10% of sale price
  • storenvy – completely free
  • epier – free and very similar to craigslist, but many paid upgrades
  • delcampe.net – for collectibles, 5.5% or less of monthly sales volume

Haggle (“make an offer” or fixed price)

  • ioffer – free store & listings, 5-10% on sale+shipping
  • rubylane – niche, high-end, $15 setup, $54 monthly minimum

Payment (PayPal alternatives)

  • Square – 2.75% all swiped transactions, 3.5% + $0.15 for manual
  • Skrill (formerly Moneybookers) – their fees may be higher than PayPal
  • ProPay $49.95/year, but they have subscription billing service
  • Google Wallet – strictly buyer/seller, can’t send money to other GW users
  • Amazon Payments – currently only in US, Germany and UK – almost free!
  • Dwolla – both buyer & seller must have an account, flat $0.25 per transaction
  • Payza – both buyer & seller must have an account, 190 countries + 21 currencies
  • Payoneer – they give a virtual + physical prepaid Mastercard; loading fee %1-3.75%, 2-7 days delay
  • WePay – website integrator, 2.9% + $0.30 for credit cards and 1% + $0.30 for debit.

PayPal will soon offer Bitcoin processing, but this should not stop you from using it as an alternative.

If you are wondering why we are considering alternatives to PayPal, note that when launched, this was an innovative and agile company, but after having been acquired by eBay, it turned into a dud – see PayPal Mafia.

Sources / More info: Wikipedia, 3, 4, so-ebayapi, ebay-incr, ebay-hwddlr, github-srch, JBidwatcher, jcb, pss, pp-rate, fb-oodle

Comments

Popular posts from this blog