Files
Aliexpress-Part-DB-orders-pull/README.md
T
2026-08-16 03:57:24 +02:00

505 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AliExpress → Part-DB Importer
A two-script toolkit for taking an AliExpress `orders.csv` export and turning
it into a Part-DB v2.15.x inventory with **product images automatically
attached to each part**.
```
┌─────────────────┐ ┌──────────────────────────┐ ┌─────────────┐
│ orders.csv │ ─► │ aliexpress_to_partdb.py │ ─► │ partdb_ │
│ (from AliExpr.) │ │ • renames columns │ │ import.csv │
└─────────────────┘ │ • downloads all images │ └──────┬──────┘
│ • writes attachments │ │
│ index │ [import via
└──────────────────────────┘ Part-DB web UI]
┌──────────────────────────┐ ┌─────────────┐
│ attach_images_to_ │ ◄──│ parts now │
│ partdb.py │ │ exist in │
│ • reads index │ │ Part-DB │
│ • finds each part by │ └─────────────┘
│ name via REST API │
│ • uploads image as │
│ attachment │
└──────────────────────────┘
```
---
## What's in this package
| File | Purpose |
|---|---|
| `aliexpress_to_partdb.py` | Reads AliExpress `orders.csv`, downloads item images, writes Part-DB-format CSV |
| `attach_images_to_partdb.py` | Pushes the downloaded images to Part-DB and attaches them via the REST API |
| `README.md` | This file |
Put all three files in the same folder, e.g. `C:\Users\Amir\Downloads\aliexpress-import\`.
---
## Prerequisites
1. **Python 3.8 or newer** — check with `python --version`
2. **The `requests` library** — install with:
```cmd
pip install requests
```
3. **Part-DB v2.15.x** running and accessible (test by opening it in your browser)
4. **A Part-DB API token** (see below)
5. **At least one Attachment type** defined in Part-DB (e.g. "Image")
— see [Step 1.5](#step-15-one-time-create-an-image-attachment-type)
---
## One-time setup
### Step 1: Get an API token in Part-DB
1. Open Part-DB in your browser, log in
2. Click your **username** (top right) → **Settings**
3. In the left sidebar, click **API tokens**
4. Click **+ Create new token** (or "New")
5. Give it any name (e.g. `importer`) and click **Save**
6. **Copy the token** — it looks like `tcp_xxxxxxxxxxxxxxxxxxxxxxxxxx`
- You won't be able to see it again after this dialog closes
- If you lose it, just create a new one
> If the "API tokens" section is missing, your user doesn't have the
> **API** permission. If you installed Part-DB yourself you're an admin
> and already have it; otherwise ask your admin to enable
> "Miscellaneous → API access" + "Create API tokens" for your user.
### Step 1.5 (one-time): Create an "Image" attachment type
Part-DB requires an attachment type to exist before any attachment can be created.
1. In Part-DB, click **Admin** in the left sidebar
2. Click **Attachment types**
3. Click **+ New**
4. Name: `Image` (or whatever you prefer)
5. Filetypes: leave blank, or add `image/jpeg`, `image/png` for stricter validation
6. Click **Save**
Verify it worked:
```cmd
python attach_images_to_partdb.py --list-attachment-types
```
You should see your "Image" type listed.
### Step 2: Configure the script
Open `attach_images_to_partdb.py` in any text editor and update the two
lines near the top:
```python
DEFAULT_PARTDB_URL = "http://YOUR-PART-DB:PORT" # e.g. http://192.168.64.80:8085
DEFAULT_PARTDB_TOKEN = "tcp_YOUR_TOKEN_HERE" # the token you just copied
```
> **Security**: this file now contains a secret. Treat it like a password.
> See the [Security](#security) section at the bottom for the full list
> of dos and don'ts.
---
## The full workflow (for your first import)
### Step A: Export your orders from AliExpress
1. Go to [aliexpress.com](https://www.aliexpress.com) → **My Orders**
2. Click **Export** (top-right of the orders table) → choose **CSV**
3. Save the file as `orders.csv` in the same folder as the scripts
(e.g. `C:\Users\Amir\Downloads\aliexpress-import\orders.csv`)
### Step B: Run the conversion script
```cmd
cd C:\Users\Amir\Downloads\aliexpress-import
python aliexpress_to_partdb.py orders.csv
```
This produces, in the same folder:
- `partdb_import.csv` — the Part-DB-format CSV (one row per item)
- `partdb_images/` — folder of all downloaded product images
- `partdb_images/attachments.json` — index of which image goes with which part
You should see output like:
```
Loaded 553 order line(s).
All done.
CSV written to: C:\...\partdb_import.csv
Images stored in: C:\...\partdb_images
Images downloaded: 553/553 (0 failed)
```
### Step C: Import the CSV into Part-DB
1. Open Part-DB in your browser
2. In the left sidebar, click **Tools** → **Import parts** (or similar)
3. Click **Choose file** → select `partdb_import.csv`
4. **Important settings** in the import wizard:
- ✅ **CSV delimiter**: `,` (comma — the script uses standard CSV)
- ✅ **Create unknown datastructures**: **checked** (so the "New parts" category and any new suppliers are auto-created)
- **Mode**: "Create new entries" (default) — see [FAQ](#faq) for re-import behavior
5. Click through the column mapping. The headers in `partdb_import.csv` are
already named to match Part-DB's import schema, so the auto-map should
fill in everything correctly
6. Click **Import** / **Start import**
7. Wait for the progress bar to finish
> ⚠️ **Watch out for re-imports** (see [FAQ](#faq) below). The default
> "Create" mode will make duplicates if you re-import the same CSV.
### Step D: Attach the images
```cmd
cd C:\Users\Amir\Downloads\aliexpress-import
python attach_images_to_partdb.py
```
You'll see one line per upload, e.g.:
```
[ 1/553] ENS160 ENS160+AHT21 CARBON Dioxide CO2 e OK part 558: attached to part 558
[ 2/553] TPS63020 Micro Power Module Automatic Vo OK part 559: attached to part 559
...
----------------------------------------------------------------------
Done.
Uploaded: 553
Skipped: 0 (already attached)
No match: 0 (part not found in Part-DB)
Failed: 0
```
For ~553 items at 0.15s between calls, expect roughly **12 minutes**.
The script is **idempotent** — running it again will skip parts that
already have an attachment with the same filename. So you can re-run it
anytime without creating duplicates.
### Step E: Verify
Open any of the imported parts in Part-DB — the product image should
appear in the **Attachments** tab (and as a thumbnail in the part list
if Part-DB auto-set it as the preview, which it usually does).
---
## For future use (when you buy more parts)
The next time you want to import a fresh AliExpress order:
1. Export the new `orders.csv` from AliExpress
2. If the new CSV contains only new parts (no overlap with the old import),
you can just re-run **Steps B → D** above with the new file
3. If the new CSV might overlap with the old one, read the
[Re-imports / dedup](#faq) section in the FAQ below
**Optional but recommended**: rotate your Part-DB API token periodically
to keep it from accumulating exposure. Just delete the old one in
Part-DB's API tokens page and paste the new one into the script.
---
## Script 1: `aliexpress_to_partdb.py`
### What it does
1. Reads `orders.csv` from AliExpress
2. Maps each row to a Part-DB part using the v2.15.x CSV import schema
3. Downloads every `Item image url` to `partdb_images/` (upgrades
AliExpress's `_220x220.jpg` thumbnail URLs to full-size, falls back
to the thumbnail on 404)
4. Writes `attachments.json` mapping each part to its image file(s)
5. Writes `partdb_import.csv` ready for the Part-DB import wizard
### Run command
```cmd
cd C:\Users\Amir\Downloads\aliexpress-import
python aliexpress_to_partdb.py orders.csv
```
### Options
```cmd
python aliexpress_to_partdb.py orders.csv -o my_parts.csv -d ./images
python aliexpress_to_partdb.py orders.csv --no-images :: CSV only, skip downloads
```
### Customizing the default category
The default category for all imported parts is `New parts`. To change it
(for example to `Electronics/Sensors` or `Imported/2026-Q3`):
1. Open `aliexpress_to_partdb.py` in a text editor
2. Find the line near the top:
```python
DEFAULT_CATEGORY = "New parts"
```
3. Change the string to whatever you want
4. Save the file
> The category is **auto-created** the first time you import, as long as
> "Create unknown datastructures" is checked in the Part-DB import wizard
> (see Step C above). Sub-categories use `->` as the separator
> (e.g. `Imported -> 2026 -> Q3`).
### Output files
| File | Contents |
|---|---|
| `partdb_import.csv` | The CSV you upload to Part-DB's import wizard |
| `partdb_images/<part-name>_<idx>.jpg` | One image per part, full size when available |
| `partdb_images/attachments.json` | Index: row → part name → image file path. Used by script 2 |
---
## Script 2: `attach_images_to_partdb.py`
### What it does
1. Reads `attachments.json` from script 1
2. For each entry, queries Part-DB for a part with the matching `name`
3. Auto-picks an attachment type whose name looks like "Image" /
"Photo" / etc., or falls back to the first available type
4. Uploads the image as a PartAttachment
5. Skips parts that already have an attachment with the same filename
(idempotent — safe to re-run)
### Run command (just run it)
```cmd
cd C:\Users\Amir\Downloads\aliexpress-import
python attach_images_to_partdb.py
```
The URL and token are read from the `DEFAULT_PARTDB_URL` and
`DEFAULT_PARTDB_TOKEN` constants at the top of the file. Override with
env vars (recommended for shared machines) or CLI flags (see below).
### Options
```cmd
:: Show all flags
python attach_images_to_partdb.py --help
:: Override the URL/token (e.g. for a different Part-DB instance)
python attach_images_to_partdb.py --url http://localhost:8000 --token tcp_xxx
:: Test with the first 3 entries, no changes made
python attach_images_to_partdb.py --limit 3 --dry-run
:: Run for real, only on the first 50
python attach_images_to_partdb.py --limit 50
:: List all attachment types in your Part-DB (useful for picking one)
python attach_images_to_partdb.py --list-attachment-types
:: Force a specific attachment type
python attach_images_to_partdb.py --attachment-type /api/attachment_types/1
:: Skip TLS verification (self-signed certs)
python attach_images_to_partdb.py --insecure
```
### Using env vars instead of editing the file (more secure)
```cmd
set PARTDB_URL=http://192.168.64.80:8085
set PARTDB_TOKEN=tcp_xxxxxxxx
python attach_images_to_partdb.py
```
In PowerShell:
```powershell
$env:PARTDB_URL = "http://192.168.64.80:8085"
$env:PARTDB_TOKEN = "tcp_xxxxxxxx"
python attach_images_to_partdb.py
```
---
## FAQ
### When I re-import the same CSV, does it skip existing parts?
**No, by default Part-DB will create duplicates.** The CSV importer's
default mode is "Create new entries" — it does not check for existing
parts.
For the AliExpress use case (one big import, plus small future imports
of new items), this is rarely a problem because the new orders contain
different parts. But if you ever need to re-import the same file (or a
file that overlaps with an old one), do one of these:
**Option 1 — Use the import wizard's matching mode**
In the Part-DB import wizard, look for a "Mode" or "Match existing
parts" option:
- **Create** (default) — always creates new parts → duplicates
- **Update** — updates matching parts, leaves the rest alone
- **Skip** — skips any part that already matches
If available, pick **Update** or **Skip** and choose the match key
(usually `name` works, but `manufacturer_product_number` is more
reliable for electronics).
**Option 2 — Delete duplicates manually after import**
After the import, in the Part-DB parts list, sort by name, find the
duplicates, select all → **Delete**. Tedious but works.
**Option 3 — Import to a temporary category, then move**
Import into a unique category (e.g. `Incoming/2026-08-15`), then
manually move parts to their final categories. Anything that was
already in the final categories will now appear twice, which is easy
to spot.
### The image script says "no attachment types defined"
You skipped [Step 1.5](#step-15-one-time-create-an-image-attachment-type)
or your Part-DB has no attachment types at all. Fix:
```cmd
python attach_images_to_partdb.py --list-attachment-types
```
If it prints nothing, go to **Admin → Attachment types** in Part-DB's
web UI and create at least one (recommended name: `Image`).
### The image script says "401 Unauthorized"
Token is wrong, expired, or your user lacks API permission.
- Open Part-DB → User menu → Settings → API tokens → create a new one
- Paste it into `DEFAULT_PARTDB_TOKEN` in the script (or set
`PARTDB_TOKEN` env var)
- If the API tokens section is missing, ask your admin to grant
"Miscellaneous → API access" + "Create API tokens" to your user
### The image script says "no match in Part-DB" for some rows
Either:
- You skipped Step C (CSV import) — the parts aren't in Part-DB yet
- The part name in Part-DB differs slightly from what's in the CSV
(e.g. truncated, case-different, or with extra characters)
- You're looking at parts in a different Part-DB instance
The first one is most common. Run Step C, then re-run the image script —
it will skip already-uploaded ones and pick up where it left off.
### The connection fails / "cannot reach Part-DB"
- Make sure `http://YOUR-PART-DB:PORT` opens in your browser first
- If Part-DB is on HTTPS, change `DEFAULT_PARTDB_URL` to start with
`https://` and possibly add `--insecure` if you have a self-signed cert
- If Part-DB is on a different machine, check the firewall / port
forwarding
### Can I import other vendors (LCSC, Mouser, Digi-Key)?
The CSV format from other vendors is different. To support them you'd
need a new conversion script. The `aliexpress_to_partdb.py` script has
the AliExpress header names hard-coded near the top — you'd write a
parallel script with a different `AE = {...}` mapping. Happy to help if
you need this.
### How do I move all my AliExpress parts to a different category later?
In Part-DB, go to the part list, filter by `category = "New parts"`,
select all → **Edit** → change the category. Or use the Part-DB REST
API for bulk moves.
---
## Troubleshooting checklist
| Symptom | Likely cause | Fix |
|---|---|---|
| `File invalid. Please check that you have selected the right format!` in Part-DB import | CSV column names don't match Part-DB's schema | Re-run `aliexpress_to_partdb.py`; the current version uses the verified 2.15.x column names |
| `must be one of Orderdetail[] (string given)` | Old script version used `orderdetails` as a flat column | Use the latest `aliexpress_to_partdb.py` from this package |
| `KeyError: 'ordernumber'` at script startup | Old script version | Use the latest version from this package |
| `DeprecationWarning: 'maxsplit' is passed as positional argument` | Old script version (cosmetic) | Update to the latest version |
| Image script: `no attachment types` | Skipped Step 1.5 | See [this FAQ entry](#the-image-script-says-no-attachment-types-defined) |
| Image script: `no match in Part-DB` | Skipped CSV import step, or names differ | Run Step C first, or check Part-DB web UI |
| Image script: `401 Unauthorized` | Bad/expired token, or no API permission | Recreate token in Part-DB; check user has API permission |
| Image script: `SSL: CERTIFICATE_VERIFY_FAILED` | Self-signed HTTPS cert | Add `--insecure` flag |
| Some images fail to download (`404 Client Error`) | Seller removed the image from AliExpress CDN | Script falls back to the thumbnail; if even that fails, the part is created without an image — you can attach a manual photo later |
---
## Security
This package handles an API token that grants access to your Part-DB
under your user account. Please:
✅ **Do:**
- Keep the script folder on your local machine only
- Use a fresh token dedicated to this purpose
- Treat the file like a password — it should not leak
- Rotate (delete + recreate) the token periodically
- If you ever share your screen / codebase, blank the
`DEFAULT_PARTDB_TOKEN` line first
- For a "cleaner" approach, use the `PARTDB_TOKEN` env var instead of
baking it into the file
❌ **Don't:**
- Commit the folder to git (add a `.gitignore` containing `*.py` if you must)
- Sync the folder to cloud backups (OneDrive, Dropbox, Google Drive,
iCloud) without first removing the token
- Share the folder publicly
- Re-use the same token for other applications
- Leave the file on a USB stick you might lose
### If your token leaks
1. In Part-DB: User menu → Settings → API tokens → delete the leaked one
2. Create a new token and paste it into the script
3. Check Part-DB's audit log for unexpected activity
4. Done — the new token works immediately
---
## Files at a glance
```
aliexpress-import\
├── README.md ← you are here
├── aliexpress_to_partdb.py ← script 1: CSV + image downloader
├── attach_images_to_partdb.py ← script 2: REST API uploader
├── orders.csv ← (your input) AliExpress export
├── partdb_import.csv ← (output) Part-DB-ready CSV
└── partdb_images\ ← (output) downloaded images
├── ENS160_ENS160+AHT21_..._1.jpg
├── TPS63020_Micro_Power_..._2.jpg
├── …
└── attachments.json ← (output) image index for script 2
```
---
## Quick reference card
| Task | Command |
|---|---|
| Convert CSV + download images | `python aliexpress_to_partdb.py orders.csv` |
| Skip image download (CSV only) | `python aliexpress_to_partdb.py orders.csv --no-images` |
| Import to Part-DB | Use web UI: Tools → Import parts → upload `partdb_import.csv` |
| Attach all images | `python attach_images_to_partdb.py` |
| Test 3 images first | `python attach_images_to_partdb.py --limit 3 --dry-run` |
| List attachment types | `python attach_images_to_partdb.py --list-attachment-types` |
| Show all flags | `python attach_images_to_partdb.py --help` |
---
## Version notes
Tested with:
- AliExpress CSV export (as of mid-2026)
- Part-DB v2.15.0
- Python 3.10 / 3.11 on Windows 10/11
If Part-DB changes its CSV schema in a future version, you may need to
update the column names in `PARTDB_COLUMNS` near the top of
`aliexpress_to_partdb.py`. Check the official docs:
<https://docs.part-db.de/usage/import_export.html>