├── .gitignore ├── README.md ├── import_listings.py └── listings.csv /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # openbazaar-etsy-import 2 | 3 | All you need to do is: 4 | 5 | * drop your export csv from etsy into this folder 6 | * rename it to listings.csv 7 | * modify the script to your authentication settings for OpenBazaar-Server (ob.cfg) 8 | * modify the SHIPPING_ORIGIN if you like (default is ALL) 9 | * run the script. 10 | 11 | ``` 12 | python import_listings.py 13 | ``` 14 | 15 | -------------------------------------------------------------------------------- /import_listings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import base64 4 | import csv 5 | import requests 6 | import urllib 7 | 8 | api = 'http://localhost:18469/api/v1' 9 | OB_USERNAME = "username" 10 | OB_PASSWORD = "password" 11 | 12 | 13 | currency_codes = ("AED", "ARS", "AUD", "BRL", "CAD", "CHF", "CNY", "CZK", "DKK", "EUR", "GBP", "HKD", "HUF", "ILS", 14 | "INR", "JPY", "KRW", "MAD", "MXN", "NOK", "NZD", "PHP", "PLN", "RUB", "SEK", "SGD", "THB", "TRY", 15 | "USD", "ZAR") 16 | 17 | SHIPPING_ORIGIN = "ALL" 18 | # For shipping origin please choose a country code string for where you want listings to 19 | # come from. 20 | # 21 | # enum CountryCode { 22 | # NA = 0; // Use this for digital goods or services 23 | # ALL = 1; 24 | # NORTH_AMERICA = 2; 25 | # SOUTH_AMERICA = 3; 26 | # EUROPE = 4; 27 | # AFRICA = 5; 28 | # ASIA = 6; 29 | # ALBANIA = 7; 30 | # ALGERIA = 8; 31 | # AMERICAN_SAMOA = 9; 32 | # ANDORRA = 10; 33 | # ANGOLA = 11; 34 | # ANGUILLA = 12; 35 | # ANTIGUA = 13; 36 | # ARGENTINA = 14; 37 | # ARMENIA = 15; 38 | # ARUBA = 16; 39 | # AUSTRALIA = 17; 40 | # AUSTRIA = 18; 41 | # AZERBAIJAN = 19; 42 | # BAHAMAS = 20; 43 | # BAHRAIN = 21; 44 | # BANGLADESH = 22; 45 | # BARBADOS = 23; 46 | # BELARUS = 24; 47 | # BELGIUM = 25; 48 | # BELIZE = 26; 49 | # BENIN = 27; 50 | # BERMUDA = 28; 51 | # BHUTAN = 29; 52 | # BOLIVIA = 30; 53 | # BONAIRE_SINT_EUSTATIUS_SABA = 31; 54 | # BOSNIA = 32; 55 | # BOTSWANA = 33; 56 | # BOUVET_ISLAND = 34; 57 | # BRAZIL = 35; 58 | # BRITISH_INDIAN_OCEAN_TERRITORY = 36; 59 | # BRUNEI_DARUSSALAM = 37; 60 | # BULGARIA = 38; 61 | # BURKINA_FASO = 39; 62 | # BURUNDI = 40; 63 | # CABO_VERDE = 41; 64 | # CAMBODIA = 42; 65 | # CAMEROON = 43; 66 | # CANADA = 44; 67 | # CAYMAN_ISLANDS = 45; 68 | # CENTRAL_AFRICAN_REPUBLIC = 46; 69 | # CHAD = 47; 70 | # CHILE = 48; 71 | # CHINA = 49; 72 | # CHRISTMAS_ISLAND = 50; 73 | # COCOS_ISLANDS = 51; 74 | # COLOMBIA = 52; 75 | # COMOROS = 53; 76 | # CONGO_REPUBLIC = 54; 77 | # CONGO = 55; 78 | # COOK_ISLANDS = 56; 79 | # COSTA_RICA = 57; 80 | # COTE_DIVOIRE = 58; 81 | # CROATIA = 59; 82 | # CUBA = 60; 83 | # CURACAO = 61; 84 | # CYPRUS = 62; 85 | # CZECH_REPUBLIC = 63; 86 | # DENMARK = 64; 87 | # DJIBOUTI = 65; 88 | # DOMINICA = 66; 89 | # DOMINICAN_REPUBLIC = 67; 90 | # ECUADOR = 68; 91 | # EGYPT = 69; 92 | # EL_SALVADOR = 70; 93 | # EQUATORIAL_GUINEA = 71; 94 | # ERITREA = 72; 95 | # ESTONIA = 73; 96 | # ETHIOPIA = 74; 97 | # FALKLAND_ISLANDS = 75; 98 | # FAROE_ISLANDS = 76; 99 | # FIJI = 77; 100 | # FINLAND = 78; 101 | # FRANCE = 79; 102 | # FRENCH_GUIANA = 80; 103 | # FRENCH_POLYNESIA = 81; 104 | # FRENCH_SOUTHERN_TERRITORIES = 82; 105 | # GABON = 83; 106 | # GAMBIA = 84; 107 | # GEORGIA = 85; 108 | # GERMANY = 86; 109 | # GHANA = 87; 110 | # GIBRALTAR = 88; 111 | # GREECE = 89; 112 | # GREENLAND = 90; 113 | # GRENADA = 91; 114 | # GUADELOUPE = 92; 115 | # GUAM = 93; 116 | # GUATEMALA = 94; 117 | # GUERNSEY = 95; 118 | # GUINEA = 96; 119 | # GUINEA_BISSAU = 97; 120 | # GUYANA = 98; 121 | # HAITI = 99; 122 | # HEARD_ISLAND = 100; 123 | # HOLY_SEE = 101; 124 | # HONDURAS = 102; 125 | # HONG_KONG = 103; 126 | # HUNGARY = 104; 127 | # ICELAND = 105; 128 | # INDIA = 106; 129 | # INDONESIA = 107; 130 | # IRAN = 108; 131 | # IRAQ = 109; 132 | # IRELAND = 110; 133 | # ISLE_OF_MAN = 111; 134 | # ISRAEL = 112; 135 | # ITALY = 113; 136 | # JAMAICA = 114; 137 | # JAPAN = 115; 138 | # JERSEY = 116; 139 | # JORDAN = 117; 140 | # KAZAKHSTAN = 118; 141 | # KENYA = 119; 142 | # KIRIBATI = 120; 143 | # NORTH_KOREA = 121; 144 | # SOUTH_KOREA = 122; 145 | # KUWAIT = 123; 146 | # KYRGYZSTAN = 124; 147 | # LAO = 125; 148 | # LATVIA = 126; 149 | # LEBANON = 127; 150 | # LESOTHO = 128; 151 | # LIBERIA = 129; 152 | # LIBYA = 130; 153 | # LIECHTENSTEIN = 131; 154 | # LITHUANIA = 132; 155 | # LUXEMBOURG = 133; 156 | # MACAO = 134; 157 | # MACEDONIA = 135; 158 | # MADAGASCAR = 136; 159 | # MALAWI = 137; 160 | # MALAYSIA = 138; 161 | # MALDIVES = 139; 162 | # MALI = 140; 163 | # MALTA = 141; 164 | # MARSHALL_ISLANDS = 142; 165 | # MARTINIQUE = 143; 166 | # MAURITANIA = 144; 167 | # MAURITIUS = 145; 168 | # MAYOTTE = 146; 169 | # MEXICO = 147; 170 | # MICRONESIA = 148; 171 | # MOLDOVA = 149; 172 | # MONACO = 150; 173 | # MONGOLIA = 151; 174 | # MONTENEGRO = 152; 175 | # MONTSERRAT = 153; 176 | # MOROCCO = 154; 177 | # MOZAMBIQUE = 155; 178 | # MYANMAR = 156; 179 | # NAMIBIA = 157; 180 | # NAURU = 158; 181 | # NEPAL = 159; 182 | # NETHERLANDS = 160; 183 | # NEW_CALEDONIA = 161; 184 | # NEW_ZEALAND = 162; 185 | # NICARAGUA = 163; 186 | # NIGER = 164; 187 | # NIGERIA = 165; 188 | # NIUE = 166; 189 | # NORFOLK_ISLAND = 167; 190 | # NORTHERN_MARIANA_ISLANDS = 168; 191 | # NORWAY = 169; 192 | # OMAN = 170; 193 | # PAKISTAN = 171; 194 | # PALAU = 172; 195 | # PANAMA = 173; 196 | # PAPUA_NEW_GUINEA = 174; 197 | # PARAGUAY = 175; 198 | # PERU = 176; 199 | # PHILIPPINES = 177; 200 | # PITCAIRN = 178; 201 | # POLAND = 179; 202 | # PORTUGAL = 180; 203 | # PUERTO_RICO = 181; 204 | # QATAR = 182; 205 | # REUNION = 183; 206 | # ROMANIA = 184; 207 | # RUSSIA = 185; 208 | # RWANDA = 186; 209 | # SAINT_BARTHELEMY = 187; 210 | # SAINT_HELENA = 188; 211 | # SAINT_KITTS = 189; 212 | # SAINT_LUCIA = 190; 213 | # SAINT_MARTIN = 191; 214 | # SAINT_PIERRE = 192; 215 | # SAINT_VINCENT = 193; 216 | # SAMOA = 194; 217 | # SAN_MARINO = 195; 218 | # SAO_TOME = 196; 219 | # SAUDI_ARABIA = 197; 220 | # SENEGAL = 198; 221 | # SERBIA = 199; 222 | # SEYCHELLES = 200; 223 | # SIERRA_LEONE = 201; 224 | # SINGAPORE = 202; 225 | # SINT_MAARTEN = 203; 226 | # SUCRE = 204; 227 | # SLOVAKIA = 205; 228 | # SLOVENIA = 206; 229 | # SOLOMON_ISLANDS = 207; 230 | # SOMALIA = 208; 231 | # SOUTH_AFRICA = 209; 232 | # SOUTH_SUDAN = 210; 233 | # SPAIN = 211; 234 | # SRI_LANKA = 212; 235 | # SUDAN = 213; 236 | # SURINAME = 214; 237 | # SVALBARD = 215; 238 | # SWAZILAND = 216; 239 | # SWEDEN = 217; 240 | # SWITZERLAND = 218; 241 | # SYRIAN_ARAB_REPUBLIC = 219; 242 | # TAIWAN = 220; 243 | # TAJIKISTAN = 221; 244 | # TANZANIA = 222; 245 | # THAILAND = 223; 246 | # TIMOR_LESTE = 224; 247 | # TOGO = 225; 248 | # TOKELAU = 226; 249 | # TONGA = 227; 250 | # TRINIDAD = 228; 251 | # TUNISIA = 229; 252 | # TURKEY = 230; 253 | # TURKMENISTAN = 231; 254 | # TURKS_AND_CAICOS_ISLANDS = 232; 255 | # TUVALU = 233; 256 | # UGANDA = 234; 257 | # UKRAINE = 235; 258 | # UNITED_ARAB_EMIRATES = 236; 259 | # UNITED_KINGDOM = 237; 260 | # UNITED_STATES = 238; 261 | # URUGUAY = 239; 262 | # UZBEKISTAN = 240; 263 | # VANUATU = 241; 264 | # VENEZUELA = 242; 265 | # VIETNAM = 243; 266 | # VIRGIN_ISLANDS_BRITISH = 244; 267 | # VIRGIN_ISLANDS_US = 245; 268 | # WALLIS_AND_FUTUNA = 246; 269 | # WESTERN_SAHARA = 247; 270 | # YEMEN = 248; 271 | # ZAMBIA = 249; 272 | # ZIMBABWE = 250; 273 | # AFGHANISTAN = 251; 274 | # ALAND_ISLANDS = 252; 275 | # } 276 | 277 | with open('listings.csv', 'rU') as f: 278 | reader = csv.DictReader(f, delimiter=',') 279 | 280 | s = requests.Session() 281 | payload = {'username': OB_USERNAME, 'password': OB_PASSWORD} 282 | login = s.post('%s/login' % api, data=payload) 283 | print login.json() 284 | 285 | for listing in reader: 286 | print listing 287 | 288 | # Download images from listing 289 | image = urllib.urlopen(listing['IMAGE1']) 290 | image_64 = base64.encodestring(image.read()) 291 | 292 | # Upload to server and get hash 293 | payload = { 294 | 'image': image_64 295 | } 296 | image_hashes = s.post('%s/upload_image' % api, data=payload) 297 | image_hashes = image_hashes.json() 298 | 299 | # Separate comma-separated tags 300 | tags = [x.strip() for x in listing['TAGS'].split(',')] 301 | 302 | # Insert listing into OB 303 | payload = { 304 | 'keywords': tags, 305 | 'title': listing['TITLE'], 306 | 'description': listing['DESCRIPTION'], 307 | 'currency_code': listing['CURRENCY_CODE'], 308 | 'price': listing['PRICE'], 309 | 'process_time': 'TBD', 310 | 'images': image_hashes['image_hashes'], 311 | 'expiration_date': '', 312 | 'metadata_category': 'physical good', 313 | 'nsfw': 'false', 314 | 'terms_conditions': '', 315 | 'returns': '', 316 | 'shipping_currency_code': listing['CURRENCY_CODE'], 317 | 'shipping_domestic': '', 318 | 'shipping_international': '', 319 | 'category': '', 320 | 'condition': '', 321 | 'sku': '', 322 | 'free_shipping': 'false', 323 | 'ships_to': ['all'], 324 | 'shipping_origin': SHIPPING_ORIGIN 325 | } 326 | posted = s.post('%s/contracts' % api, data=payload) 327 | print posted.json() -------------------------------------------------------------------------------- /listings.csv: -------------------------------------------------------------------------------- 1 | TITLE,DESCRIPTION,PRICE,CURRENCY_CODE,QUANTITY,TAGS,MATERIALS,IMAGE1,IMAGE2,IMAGE3,IMAGE4,IMAGE5,VARIATION 1 TYPE,VARIATION 1 NAME,VARIATION 1 VALUES,VARIATION 2 TYPE,VARIATION 2 NAME,VARIATION 2 VALUES Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 2 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 3 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 4 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 5 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 6 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 7 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, 8 | Awesome Item 1,This is a great item,4.34,USD,4,"boogers, cars,peanuts","paper, metal",https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,https://i.stack.imgur.com/tMbLc.png?s=128&g=1&g&s=32,,,,,,, --------------------------------------------------------------------------------