saualadam / shipment-tracker

通过简单抓取数据,解析多个承运商的跟踪信息,如UPS、USPS、DHL和GLS。无需任何API访问权限。

0.7.0 2020-12-01 17:58 UTC

README

一个简单的工具,用于抓取DHL、DHL Express、GLS、UPS、FedEx、USPS、瑞士邮政服务和奥地利邮政服务包裹跟踪数据

Build Status Total Downloads

一些包裹服务在注册商家或开发者账户时真的很麻烦。您实际上只想简单地跟踪运输并查看其状态。是的,您可以刷新跟踪页面,但有时您还有更重要的事情要做。

所以这里有一个工具可以自动完成这项工作,没有任何开发者账户和API的复杂术语。它只是简单地抓取带有跟踪信息的网站,并将数据转换成人类和计算机都易于消费的格式。让我向您展示它是如何工作的!

安装

只需通过composer拉取此包,或在您的composer.json文件中添加它

$ composer require sauladam/shipment-tracker

别忘了运行

$ composer update

之后。

支持的承运商

以下承运商和语言目前支持此包

  • DHL (德语、英语)
  • DHL Express (德语、英语)(目前仅限于运单号,不包括单个件的运单号)
  • GLS (德语、英语)
  • UPS (德语、英语)
  • Fedex (英语)(感谢 @avrahamappel
  • USPS (英语)
  • PostCH (瑞士邮政服务) (德语、英语)
  • PostAT (奥地利邮政服务) (德语、英语)

基本用法

require_once 'vendor/autoload.php';

use Sauladam\ShipmentTracker\ShipmentTracker;

$dhlTracker = ShipmentTracker::get('DHL');

/* track with the standard settings */
$track = $dhlTracker->track('00340434127681930812');
// scrapes from http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=00340434127681930812

/* override the standard language */
$track = $dhlTracker->track('00340434127681930812', 'en');
// scrapes from http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=en&idc=00340434127681930812

/* pass additional params to the URL (or override the default ones) */
$track = $dhlTracker->track('00340434127681930812', 'en', ['zip' => '12345']);
// scrapes from http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=en&idc=00340434127681930812&zip=12345

就这样。让我们检查这个包裹是否已送达

if($track->delivered())
{
    echo "Delivered to " . $track->getRecipient();
}
else
{
    echo "Not delivered yet, The current status is " . $track->currentStatus();
}

可能的状态有

  • Track::STATUS_IN_TRANSIT
  • Track::STATUS_DELIVERED
  • Track::STATUS_PICKUP
  • Track::STATUS_EXCEPTION
  • Track::STATUS_WARNING
  • Track::STATUS_UNKNOWN

那么它现在在哪里,发生了什么?

$latestEvent = $track->latestEvent();

echo "The parcel was last seen in " . $latestEvent->getLocation() . " on " . $latestEvent->getDate()->format('Y-m-d');
echo "What they did: " . $latestEvent->description();
echo "The status was " . $latestEvent->getStatus();

您可以使用$track->events()获取整个事件历史记录的数组。事件按日期降序排序。日期是一个Carbon对象。

还有其他什么吗?

您只是想构建跟踪网站的URL?没问题

$url = $dhlTracker->trackingUrl('00340434127681930812');
// http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=00340434127681930812

哦,您需要它链接到英文版本?当然可以

$url = $dhlTracker->trackingUrl('00340434127681930812', 'en');
// http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=en&idc=00340434127681930812

“但是等等,如果我需要带有附加参数的URL呢?” - 好吧,只需传递它们即可

$url = $dhlTracker->trackingUrl('00340434127681930812', 'en', ['zip' => '12345']);
// http://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=en&idc=00340434127681930812&zip=12345

其他功能

附加详细信息

跟踪和事件都可以包含附加详细信息,可以通过例如$track->getAdditionalDetails('foo')访问。目前,这仅适用于GLS和UPS

  • GLS

    • $track->getAdditionalDetails('parcelShop') 获取包裹商店的详细信息以及包裹投递到商店的开业时间
  • UPS

    • $track->getAdditionalDetails('accessPoint') 获取包裹投递到取件点时的地址
    • $track->getAdditionalDetails('pickupDueDate') 获取取件截止日期,作为Carbon实例
  • DHL Express (运单)

    • $track->getAdditionalDetails('pieces') 获取属于此运输的个别件的跟踪号码
    • $event->getAdditionalDetails('pieces') 获取此事件适用的个别件的跟踪号码
  • FedEx

    • $track->getAdditionalDetails('totalKgsWgt') 获取运输重量(如果退货),单位为kg
    • $track->getAdditionalDetails('totalLbsWgt') 获取运输重量(如果退货),单位为磅

数据提供者

默认情况下,此包使用Guzzle以及PHP Http客户端(即file_get_contents())来获取数据。如果您需要,可以传递自己的提供者,例如,如果您在缓存中某处有页面内容。只需确保它实现了Sauladam\ShipmentTracker\DataProviders\DataProviderInterface接口,该接口仅需要一个get()方法。

然后,您可以直接将其传递给工厂:$dhlTracker = ShipmentTracker::get('DHL', new CacheDataProvider);

如果您传递了数据提供者,它将默认使用,但您可以在以后随时替换它

$dhlTracker->useDataProvider('guzzle');

目前可用的提供者有

  • guzzle
  • php
  • 自定义(指您传递的提供者)

注意事项

请记住,这只是一个让您生活更轻松的工具。我不建议在关键环境中使用它,因为由于它的工作方式,一旦跟踪网站的数据结构发生变化或更改描述,它就可能崩溃。所以请自行承担风险!

此外,有可能即使是最常见的事件也能正确解决,但该包不认识事件描述,因此可能无法解析状态。

此外,跟踪数据,因此本包提供的数据,是承运人的财产(我想),所以您绝对不能将其用于商业用途(如销售或将其集成到商业服务中)。它仅适用于个人使用。