【WMS-渠道对接】德国 DPD渠道是否支持通过接口批量下载 POD(Proof of Delivery)——预研

背景

dpd 目前官方没有对外的dpd下载接口,目前主要是两个途径
1:通过de的同事去问商业客户是否有特权api
2:通过一些聚合平台去下载,目前17trtack没有提供,可以之后找找
3:通过爬虫,在签收的时候像uniuni那样,把pod下载到我们系统

注意:两种方案都只能针对我们自有的账号,第三方账号(例如xp和锡国际是无法处理)

方案一

jdk17的场景下实现爬虫,jdk8或者jdk11,请自行处理依赖问题
爬虫实现会有个问题,就是pod存放的时间期限问题,堆放太久会造成系统的资源浪费
该代码紧紧是demo,能够实现,具体上手请自行优化

<!-- Selenium Java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.15.0</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>4.15.0</version>
        </dependency>


        <!-- ChromeDriver -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>4.15.0</version>
        </dependency>

        <!-- 降级到兼容 Selenium 3.x 的版本 -->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.6.2</version>
        </dependency>
        <!-- 确保使用兼容的 Commons IO 版本 -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version> <!-- 或更高版本 -->
        </dependency>
package com.wpglb.logistics.service.impl.tracking;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Base64;

public class tes111 {

    public static void main(String[] args) throws InterruptedException, IOException {
        // -----------------------------
        // 1. 设置下载目录
        // -----------------------------
        String downloadFilepath = System.getProperty("user.dir") + "/downloads";
        File downloadDir = new File(downloadFilepath);
        if (!downloadDir.exists()) downloadDir.mkdirs();

        // -----------------------------
        // 2. 配置 Chrome 自动下载 PDF
        // -----------------------------
        ChromeOptions options = new ChromeOptions();
//        Map<String, Object> prefs = new HashMap<>();
//        prefs.put("download.default_directory", downloadFilepath);
//        prefs.put("download.prompt_for_download", false);
//        prefs.put("plugins.always_open_pdf_externally", true); // 确保 PDF 不在浏览器内预览
//        prefs.put("download.extensions_to_open", "applications/pdf"); // 指定 PDF 扩展名
//        options.setExperimentalOption("prefs", prefs);

        // -----------------------------
        // 3. 自动管理 ChromeDriver
        // -----------------------------
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver(options);

        try {
            // -----------------------------
            // 4. 打开登录页面
            // -----------------------------
            driver.get("https://www.dpd.com/de/en/mydpd-anmelden-und-registrieren/");
            Thread.sleep(2000);

            // -----------------------------
            // 5. 处理 Cookie 弹窗
            // -----------------------------
            try {
                WebElement acceptCookies = driver.findElement(
                        By.xpath("//button[contains(text(),'Accept all')]")
                );
                acceptCookies.click();
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println("Cookie 弹窗未出现,继续登录");
            }

            // -----------------------------
            // 6. 输入用户名和密码
            // -----------------------------
            WebElement username = driver.findElement(By.cssSelector("input[name='dpg_username']"));
            WebElement password = driver.findElement(By.cssSelector("input[name='dpg_password']"));
            username.sendKeys("2406044417");
            password.sendKeys("Westernfulfill21m#");
            WebElement loginBtn = driver.findElement(By.cssSelector("input[value='Login']"));
            loginBtn.click();

            // -----------------------------
            // 7. 等待登录完成
            // -----------------------------
            Thread.sleep(5000);
              //popin_tc_privacy_button  Alle akzeptieren
            try {
                WebElement acceptCookies = driver.findElement(By.id("popin_tc_privacy_button"));
                acceptCookies.click();
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println("Cookie 弹窗未出现,继续登录");
            }

            try {
                WebElement acceptCookies = driver.findElement(
                        By.xpath("//button[contains(text(),'Alle akzeptieren')]")
                );
                acceptCookies.click();
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println("Cookie 弹窗未出现,继续登录");
            }


            // -----------------------------
            // 8. 打开 POD 页面
            // -----------------------------
            //https://business.dpd.de/meinepakete/tracking-tabelle.aspx?parcelno=01475193664214
            String parcelNo = "01475193664214"; // 要下载的包裹号
            //输入跟踪号 cphBody_modTracking_txtParcelNo
            WebElement parcelNoInput = driver.findElement(By.id("cphBody_modTracking_txtParcelNo"));
            parcelNoInput.sendKeys(parcelNo);
            //点击按钮 <a id="cphBody_modTracking_btnSearchForParcelNo" class="DPDShortGlassBtn" href="javascript:__doPostBack('ctl00$cphBody$modTracking$btnSearchForParcelNo','')"></a>
            WebElement searchBtn = driver.findElement(By.id("cphBody_modTracking_btnSearchForParcelNo"));
            searchBtn.click();


            // -----------------------------
            // 9. 点击下载按钮
            // -----------------------------
           // 点击 <a id="CPLContentLarge_repOrderTable_lnkDownloadPOD_0" class="div_status_options div_status_download lnk_download_pod font_big_status" draggable="false" href="javascript:__doPostBack('ctl00$CPLContentLarge$repOrderTable$ctl00$lnkDownloadPOD','')" style="margin-top: 15px;">Ablieferbeleg drucken</a>
            WebElement downloadBtn = driver.findElement(By.id("CPLContentLarge_repOrderTable_lnkDownloadPOD_0"));
            downloadBtn.click();

            //CPLContentLarge_modDownloadPOD_ifrPOD  下载
//            WebElement podIframe = driver.findElement(By.id("CPLContentLarge_modDownloadPOD_ifrPOD"));
//            podIframe.click();


            // -----------------------------
            // 10. 等待文件下载完成
            // -----------------------------
            File podFile = new File(downloadFilepath + "/DPD_POD_" + parcelNo + ".pdf");
            int waitTime = 0;
            while (!podFile.exists() && waitTime < 30) { // 最多等 30 秒
                Thread.sleep(1000);
                waitTime++;
            }

            if (!podFile.exists()) {
                System.out.println("POD 文件未下载成功!");
            } else {
                System.out.println("POD 文件已下载:" + podFile.getAbsolutePath());

                // -----------------------------
                // 11. 读取文件并转 Base64
                // -----------------------------
                FileInputStream fis = new FileInputStream(podFile);
                byte[] bytes = fis.readAllBytes();
                fis.close();

                String base64Pod = Base64.getEncoder().encodeToString(bytes);
                System.out.println("Base64 POD:\n" + base64Pod);
            }

        } finally {
            // -----------------------------
            // 12. 退出浏览器
            // -----------------------------
//            driver.quit();
        }
    }
}

方案二

DPD 像轨迹那样主动推送给我们接收pod

作者:伍儒普  创建时间:2026-01-05 09:30
最后编辑:伍儒普  更新时间:2026-03-03 10:08