【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
最后编辑:伍儒普 更新时间:2026-03-03 10:08