ebay4r 2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,240 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_and_store_ebay_categories.rb,v 1.2 2006/01/18 09:42:02 garrydolley Exp $
3
+ #
4
+ # == Copyright
5
+ #
6
+ # Copyright (c) 2005,2006 Garry C. Dolley
7
+ #
8
+ # This file is part of eBay4R.
9
+ #
10
+ # eBay4R is free software; you can redistribute it and/or modify it under the
11
+ # terms of the GNU General Public License as published by the Free Software
12
+ # Foundation; either version 2 of the License, or (at your option) any later
13
+ # version.
14
+ #
15
+ # eBay4R is distributed in the hope that it will be useful, but WITHOUT ANY
16
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
+ # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
18
+ # details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License along with
21
+ # eBay4R; if not, write to the Free Software Foundation, Inc., 51 Franklin
22
+ # Street, Fifth Floor, Boston, MA 02110-1301, USA
23
+ #
24
+ # Created : 01/16/2006
25
+ #
26
+ # == Synopsis
27
+ #
28
+ # This script will retrieve the entire eBay Category tree for a specified eBay
29
+ # site (site_id) and store it in a MySQL database.
30
+ #
31
+ # == Database
32
+ #
33
+ # The schema used is as follows:
34
+ #
35
+ # CREATE TABLE ebay_categories (
36
+ # id int(11) NOT NULL auto_increment,
37
+ # site_id smallint(6) default NULL,
38
+ # category_id varchar(10) NOT NULL default '',
39
+ # category_parent_id varchar(10) default NULL,
40
+ # category_name varchar(128) NOT NULL default '',
41
+ # category_level int(11) default NULL,
42
+ # leaf_category tinyint(1) NOT NULL default '0',
43
+ # expired tinyint(1) NOT NULL default '0',
44
+ # virtual tinyint(1) NOT NULL default '0',
45
+ # auto_pay_enabled tinyint(1) NOT NULL default '0',
46
+ # b2b_vat_enabled tinyint(1) NOT NULL default '0',
47
+ # best_offer_enabled tinyint(1) NOT NULL default '0',
48
+ # intl_autos_fixed_cat tinyint(1) NOT NULL default '0',
49
+ # lsd tinyint(1) NOT NULL default '0',
50
+ # orpa tinyint(1) NOT NULL default '0',
51
+ # orra tinyint(1) NOT NULL default '0',
52
+ # PRIMARY KEY (id),
53
+ # UNIQUE KEY site_id (site_id,category_id),
54
+ # KEY category_id (category_id),
55
+ # KEY category_parent_id (category_parent_id),
56
+ # CONSTRAINT ebay_categories_ibfk_1 FOREIGN KEY (category_parent_id)
57
+ # REFERENCES ebay_categories (category_id)
58
+ # ) ENGINE=InnoDB DEFAULT CHARSET=latin1
59
+ #
60
+ # and
61
+ #
62
+ # CREATE TABLE ebay_categories_info (
63
+ # id int(11) NOT NULL auto_increment,
64
+ # site_id smallint(6) default NULL,
65
+ # category_version varchar(16) NOT NULL default '',
66
+ # minimum_reserve_price double default NULL,
67
+ # reduce_reserve_allowed tinyint(1) NOT NULL default '0',
68
+ # reserve_price_allowed tinyint(1) NOT NULL default '0',
69
+ # update_time datetime default NULL,
70
+ # PRIMARY KEY (id)
71
+ # UNIQUE KEY site_id (site_id)
72
+ # ) ENGINE=MyISAM DEFAULT CHARSET=latin1
73
+ #
74
+ # == Usage
75
+ #
76
+ # ./get_and_store_ebay_categories.rb -s site_id [ -t | --table TABLE_BASE_NAME ] [ -h | --host HOST ] [ -d | --database DB ] [ -u | --user USER ] [ -p | --password PW ] [ --debug ] [ -c concurrency ]
77
+ #
78
+ # Example site IDs: 0 = eBay USA, 2 = eBay Canada, 100 = eBay Motors
79
+ #
80
+ # Just like the examples/ directory, you need a file named
81
+ # "myCredentials.rb" in the current directory or Ruby load path.
82
+ #
83
+ # The "-c concurrency" command line option says how many category nodes we
84
+ # retrieve at a time. Default is 20. All direct children are also
85
+ # downloaded (grouped BFS).
86
+ #
87
+ # If you are getting out of memory errors, reduce this number.
88
+ # If you have lots of memory, you can increase this number and the import
89
+ # will be faster.
90
+ #
91
+ # Note: The eBay Category tree is very large. This script can run for 20
92
+ # minutes or longer.
93
+
94
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
95
+
96
+ require 'eBayAPI'
97
+
98
+ require 'optparse'
99
+ require 'rdoc/usage'
100
+
101
+ begin
102
+ require 'rubygems'
103
+ require_gem 'mysql'
104
+ rescue LoadError
105
+ require 'mysql'
106
+ end
107
+
108
+ #
109
+ # Set defaults and parse command line args
110
+ #
111
+
112
+ mysql_hostname = 'localhost'
113
+ mysql_database = 'test'
114
+ mysql_username = 'test'
115
+ mysql_password = ''
116
+
117
+ site_id = 0
118
+ table_name = "ebay_categories"
119
+ concurrency = 20
120
+
121
+ debug = false
122
+
123
+ opts = OptionParser.new
124
+ opts.on("-h", "--help") { RDoc::usage('usage') }
125
+ opts.on("-s SITE_ID") { |sid| site_id = sid }
126
+ opts.on("-c concurrency") { |c| concurrency = c.to_i }
127
+
128
+ opts.on("-h", "--host HOST") { |h| mysql_hostname = h }
129
+ opts.on("-d", "--database DB") { |d| mysql_database = d }
130
+ opts.on("-u", "--user USER") { |u| mysql_username = u }
131
+ opts.on("-p", "--password PW") { |p| mysql_password = p }
132
+ opts.on("--debug") { debug = true }
133
+
134
+ opts.on("-t", "--table TABLE_NAME") { |t| table_name = t }
135
+
136
+ opts.parse(ARGV) rescue RDoc::usage('usage')
137
+
138
+ if ARGV.size < 1
139
+ RDoc::usage('usage')
140
+ exit
141
+ end
142
+
143
+ #
144
+ # Open MySQL database
145
+ #
146
+
147
+ mysql = Mysql.new(mysql_hostname, mysql_username, mysql_password)
148
+ mysql.select_db(mysql_database)
149
+
150
+ # Put your credentials in this file
151
+ load('myCredentials.rb')
152
+
153
+ # Create new eBay caller object. Omit last argument to use live platform.
154
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
155
+ eBay.debug = true if debug
156
+
157
+ parents_to_process = [ :id => '', :depth => 0 ]
158
+
159
+ #
160
+ # Traverse entire category tree and import into our database
161
+ #
162
+
163
+ puts "Starting import... Go get some coffee, this is going to take a while..."
164
+
165
+ imported_site_wide_info = false
166
+ i = 0
167
+ while (some_parents = parents_to_process.first(concurrency)).length > 0
168
+ seek_depth = some_parents.max { |a,b| a[:depth] <=> b[:depth] }
169
+ seek_depth = seek_depth[:depth] + 1
170
+
171
+ if debug
172
+ puts "Current process queue:"
173
+ p parents_to_process
174
+ puts "Up next:"
175
+ p some_parents
176
+ end
177
+
178
+ resp = eBay.GetCategories(:DetailLevel => 'ReturnAll', # Return all available info
179
+ :CategorySideID => site_id,
180
+ :CategoryParent => (some_parents[0][:id] == '' && some_parents.length == 1) ? '' : some_parents.collect { |a| a[:id] },
181
+ :ViewAllNotes => true,
182
+ :LevelLimit => seek_depth)
183
+
184
+ parents_to_process -= some_parents
185
+
186
+ if !imported_site_wide_info
187
+ mysql.query("DELETE FROM #{table_name}_info WHERE site_id = #{site_id}")
188
+
189
+ mysql.query("INSERT INTO #{table_name}_info VALUES (null, '#{site_id}', '#{resp.categoryVersion}', '#{resp.minimumReservePrice}', #{resp.reduceReserveAllowed},
190
+ #{resp.reservePriceAllowed}, '#{resp.updateTime}')")
191
+
192
+ imported_site_wide_info = true
193
+ end
194
+
195
+ if resp.categoryCount.to_i > 0
196
+ resp.categoryArray.each do |cat|
197
+ if cat.categoryLevel.to_i == seek_depth
198
+ if cat.leafCategory == "false"
199
+ parents_to_process << { :id => cat.categoryID, :depth => cat.categoryLevel.to_i }
200
+ puts "Added Category ##{cat.categoryID} to process queue..." if debug
201
+ end
202
+ end
203
+
204
+ # Make sure we don't try to INSERT a category we already have
205
+ r = mysql.query("SELECT category_id FROM #{table_name} WHERE category_id = #{cat.categoryID} AND site_id = #{site_id}")
206
+
207
+ if r.num_rows < 1
208
+ if cat.categoryID == cat.categoryParentID
209
+ cat.categoryParentID = "null"
210
+ else
211
+ cat.categoryParentID = "'#{cat.categoryParentID}'"
212
+ end
213
+
214
+ cat.categoryName = mysql.escape_string(cat.categoryName)
215
+
216
+ # Determine values of conditional fields
217
+ auto_pay = cat.respond_to?(:autoPayEnabled) ? cat.autoPayEnabled : false
218
+ b2b_vat = cat.respond_to?(:b2BVATEnabled) ? cat.b2BVATEnabled : false
219
+ best_offer = cat.respond_to?(:bestOfferEnabled) ? cat.bestOfferEnabled : false
220
+ orra = cat.respond_to?(:oRRA) ? cat.oRRA : false
221
+ sge = cat.respond_to?(:sellerGuaranteeEligible) ? cat.sellerGuaranteeEligible : false
222
+
223
+ puts "Inserting Category ##{cat.categoryID}: #{cat.categoryName}..." if debug
224
+
225
+ #
226
+ # Do the actual writing to the database
227
+ #
228
+ mysql.query("INSERT INTO #{table_name}
229
+ VALUES (null, '#{site_id}', '#{cat.categoryID}', #{cat.categoryParentID}, '#{cat.categoryName}', '#{cat.categoryLevel}', #{cat.leafCategory},
230
+ #{cat.expired}, #{cat.virtual}, #{auto_pay}, #{b2b_vat}, #{best_offer}, #{cat.intlAutosFixedCat}, #{cat.lSD}, #{cat.oRPA}, #{orra},
231
+ #{sge})")
232
+
233
+ i += 1
234
+ puts "Imported #{i} categories so far..." if i % 100 == 0
235
+ end
236
+ end
237
+ end
238
+ end
239
+
240
+ mysql.close
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: add_item.rb,v 1.11 2006/01/13 09:56:29 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of AddItem call
9
+ #
10
+
11
+ load('myCredentials.rb')
12
+
13
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
+
15
+ # Shorter way of passing complex types (implied by hashing) than when we did in v0.5.2 and prior
16
+ resp = eBay.AddItem(:Item => EBay.Item({ :PrimaryCategory => EBay.Category({ :CategoryID => 57882 }),
17
+ :Title => 'Mouse Pad',
18
+ :Description => 'A really cool mouse pad, you know you want it...',
19
+ :Location => 'On Earth',
20
+ :StartPrice => '12.0',
21
+ :Quantity => 1,
22
+ :ListingDuration => "Days_7",
23
+ :Country => "US",
24
+ :Currency => "USD",
25
+ :PaymentMethods => ["VisaMC", "PersonalCheck"] }))
26
+
27
+ puts "New Item #" + resp.itemID + " added."
28
+ puts "You spent:\n"
29
+
30
+
31
+ # The fees part of the response looks like this:
32
+ #
33
+ # <Fees>
34
+ # <Fee>
35
+ # <Name>AuctionLengthFee</Name>
36
+ # <Fee currencyID="USD">0.0</Fee>
37
+ # </Fee>
38
+ # <Fee>
39
+ # <Name>BoldFee</Name>
40
+ # <Fee currencyID="USD">0.0</Fee>
41
+ # </Fee>
42
+ # ...
43
+ # <Fee>
44
+ # <Name>InsertionFee</Name>
45
+ # <Fee currencyID="USD">0.6</Fee>
46
+ # </Fee>
47
+ # ...
48
+ # </Fees>
49
+ #
50
+ # So this is now we traverse it:
51
+ resp.fees.each do |fee|
52
+ puts fee.name + ": " + fee.fee + " " + fee.fee.xmlattr_currencyID
53
+ end
54
+
55
+ # Notice how the object names reflect the XML element names, and any element
56
+ # that is repeated automatically becomes an array, so you can run "each" on
57
+ # it.
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: add_item.rb,v 1.11 2006/01/13 09:56:29 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of AddItem call
9
+ #
10
+
11
+ load('myCredentials.rb')
12
+
13
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
+
15
+ # Added some shipping options
16
+
17
+ resp = eBay.AddItem(:Item => EBay.Item({ :PrimaryCategory => EBay.Category(:CategoryID => 57882),
18
+ :Title => 'Mouse Pad',
19
+ :Description => 'A really cool mouse pad, you know you want it...',
20
+ :Location => 'USA',
21
+ :StartPrice => '0.50',
22
+ :BuyItNowPrice => '9.50',
23
+ :Quantity => 1,
24
+ :ShippingDetails => EBay.ShippingDetails(
25
+ :ShippingServiceOptions => [
26
+ EBay.ShippingServiceOptions(
27
+ :ShippingService => ShippingServiceCodeType::USPSPriority,
28
+ :ShippingServiceCost => '0.0',
29
+ :ShippingServiceAdditionalCost => '0.0'),
30
+ EBay.ShippingServiceOptions(
31
+ :ShippingService => ShippingServiceCodeType::USPSPriorityFlatRateBox,
32
+ :ShippingServiceCost => '7.0',
33
+ :ShippingServiceAdditionalCost => '0.0')]),
34
+ :ShippingTermsInDescription => false,
35
+ :ShipToLocations => "US",
36
+ :ShipToLocations => "CA",
37
+ :ListingDuration => "Days_7",
38
+ :Country => "US",
39
+ :Currency => "USD",
40
+ :PayPalEmailAddress => "foobar@example.com",
41
+ :PaymentMethods => ["VisaMC", "PayPal"] }))
42
+
43
+
44
+ puts "New Item #" + resp.itemID + " added."
45
+ puts "You spent:\n"
46
+
47
+
48
+ # The fees part of the response looks like this:
49
+ #
50
+ # <Fees>
51
+ # <Fee>
52
+ # <Name>AuctionLengthFee</Name>
53
+ # <Fee currencyID="USD">0.0</Fee>
54
+ # </Fee>
55
+ # <Fee>
56
+ # <Name>BoldFee</Name>
57
+ # <Fee currencyID="USD">0.0</Fee>
58
+ # </Fee>
59
+ # ...
60
+ # <Fee>
61
+ # <Name>InsertionFee</Name>
62
+ # <Fee currencyID="USD">0.6</Fee>
63
+ # </Fee>
64
+ # ...
65
+ # </Fees>
66
+ #
67
+ # So this is now we traverse it:
68
+ resp.fees.each do |fee|
69
+ puts fee.name + ": " + fee.fee + " " + fee.fee.xmlattr_currencyID
70
+ end
71
+
72
+ # Notice how the object names reflect the XML element names, and any element
73
+ # that is repeated automatically becomes an array, so you can run "each" on
74
+ # it.
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_account.rb,v 1.7 2005/12/27 01:17:01 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of GetAccount call requesting the last monthly statement
9
+ #
10
+
11
+ load('myCredentials.rb')
12
+
13
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
+
15
+ resp = eBay.GetAccount(:AccountHistorySelection => 'LastInvoice')
16
+
17
+ puts "AccountID: " + resp.accountID
18
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState
19
+
20
+ # Not all statements will have an <AccountState>, so we only print it if present
21
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState if resp.accountSummary.respond_to?(:accountState)
22
+
23
+ # Some statements may not have any entries in them (no sales that month?), so
24
+ # we must test to make sure "accountEntries" exists before we traverse it.
25
+ if resp.respond_to?(:accountEntries)
26
+ resp.accountEntries.each do |entry|
27
+ puts "Account Entries -- Description: " + entry.description
28
+ end
29
+ end
30
+
31
+ # Many more fields may be present, see eBay's SOAP API Guide or GetAccountResponseType class in "../lib/eBay.rb"
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_account2.rb,v 1.5 2005/12/27 01:17:01 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of GetAccount call requesting a specific monthly statement
9
+ #
10
+
11
+ load('myCredentials.rb')
12
+
13
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
+
15
+ resp = eBay.GetAccount(:AccountHistorySelection => 'SpecifiedInvoice', :InvoiceDate => '2008-03-01')
16
+
17
+ puts "AccountID: " + resp.accountID
18
+ puts "Account Summary -- Invoice Balance: " + resp.accountSummary.invoiceBalance
19
+
20
+ # Not all statements will have an <AccountState>, so we only print it if present
21
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState if resp.accountSummary.respond_to?(:accountState)
22
+
23
+ # Some statements may not have any entries in them (no sales that month?), so
24
+ # we must test to make sure "accountEntries" exists before we traverse it.
25
+ if resp.respond_to?(:accountEntries)
26
+ resp.accountEntries.each do |entry|
27
+ puts "Account Entries -- Description: " + entry.description
28
+ end
29
+ end
30
+
31
+ # Many more fields may be present, see eBay's SOAP API Guide or GetAccountResponseType class in "../lib/eBay.rb"
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+ # $Id: get_account3.rb,v 1.5 2005/12/27 01:17:01 garrydolley Exp $
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+ require 'eBayAPI'
6
+
7
+ #
8
+ # Example of GetAccount call requesting all statements in a date range
9
+ #
10
+
11
+ load('myCredentials.rb')
12
+
13
+ eBay = EBay::API.new($authToken, $devId, $appId, $certId, :sandbox => true)
14
+
15
+ resp = eBay.GetAccount(:AccountHistorySelection => 'BetweenSpecifiedDates', :BeginDate => '2005-10-01', :EndDate => '2005-11-01')
16
+
17
+ puts "AccountID: " + resp.accountID
18
+ puts "Account Summary -- Invoice Balance: " + resp.accountSummary.invoiceBalance if resp.accountSummary.respond_to?(:invoiceBalance)
19
+
20
+ # Not all statements will have an <AccountState>, so we only print it if present
21
+ puts "Account Summary -- Account State: " + resp.accountSummary.accountState if resp.accountSummary.respond_to?(:accountState)
22
+
23
+ # Some statements may not have any entries in them (no sales that month?), so
24
+ # we must test to make sure "accountEntries" exists before we traverse it.
25
+ if resp.respond_to?(:accountEntries)
26
+ resp.accountEntries.each do |entry|
27
+ puts "Account Entries -- Description: " + entry.description
28
+ end
29
+ end
30
+
31
+ # Many more fields may be present, see eBay's SOAP API Guide or GetAccountResponseType class in "../lib/eBay.rb"