magdv/dadata

通过 Dadata API 进行数据清洗、丰富和推荐

1.0.4 2023-07-13 02:22 UTC

This package is auto-updated.

Last update: 2024-09-13 04:50:22 UTC


README

通过 Dadata API 进行数据清洗、丰富和推荐

Dadata API 的分支包。

安装

composer require magdv/dadata

需求

  • PHP 7.4
  • PSR 客户端 7

使用方法

创建 API 客户端实例

// Create your class implemented interface DadataClientConfigInterface
 
class DadataConfig implements DadataClientConfigInterface
{

    private string $token;
    private string $secret;

    public function __construct(string $token, string $secret)
    {
        $this->token = $token;
        $this->secret = $secret;
    }

    public function getClient(string $baseUrl): ClientInterface
    {
         $headers = [
            "Content-Type" => "application/json",
            "Accept" => "application/json",
            "Authorization" => "Token " . $this->token,
        ];

        $headers["X-Secret"] = $this->secret;

        return new Client([
            "base_uri" => $baseUrl,
            "headers" => $headers,
            "timeout" => Settings::TIMEOUT_SEC
        ]);
    }
}


> $token = "Replace with Dadata API key";
> $secret = "Replace with Dadata secret key";
> $config = new DadataConfig($token $secret);
> $dadata = new \Magdv\DadataClient($token, $config);

然后按照以下指定调用 API 方法。

邮政地址

验证和清洗地址

> $response = $dadata->clean("address", "мск сухонская 11 89");
> var_dump($response);
array(80) {
  ["source"]=>
  string(31) "мск сухонская 11 89"
  ["result"]=>
  string(56) "г Москва, ул Сухонская, д 11, кв 89"
  ["postal_code"]=>
  string(6) "127642"
  ["country"]=>
  string(12) "Россия"
  ["federal_district"]=>
  string(22) "Центральный"
  ["region"]=>
  string(12) "Москва"
  ["city_area"]=>
  string(31) "Северо-восточный"
  ["city_district"]=>
  string(37) "Северное Медведково"
  ["street"]=>
  string(18) "Сухонская"
  ["house"]=>
  string(2) "11"
  ["flat"]=>
  string(2) "89"
  ["flat_area"]=>
  string(4) "34.6"
  ["flat_price"]=>
  string(7) "6854710"
  ["fias_id"]=>
  string(36) "5ee84ac0-eb9a-4b42-b814-2f5f7c27c255"
  ["timezone"]=>
  string(5) "UTC+3"
  ["geo_lat"]=>
  string(10) "55.8782557"
  ["geo_lon"]=>
  string(8) "37.65372"
  ["qc_geo"]=>
  int(0)
  ["metro"]=>
  array(3) {...}
}

地址地理编码

与“验证和清洗”相同的 API 方法

> $response = $dadata->clean("address", "мск сухонская 11 89");
> var_dump($response);
array(80) {
  ["source"]=>
  string(31) "мск сухонская 11 89"
  ["result"]=>
  string(56) "г Москва, ул Сухонская, д 11, кв 89"
  ...
  ["geo_lat"]=>
  string(10) "55.8782557"
  ["geo_lon"]=>
  string(8) "37.65372"
  ["beltway_hit"]=>
  string(7) "IN_MKAD"
  ["beltway_distance"]=>
  NULL
  ["qc_geo"]=>
  int(0)
  ...
}

反向地理编码地址

> $response = $dadata->geolocate("address", 55.878, 37.653);
> var_dump($response);
array(4) {
  [0]=>
  array(3) {
    ["value"]=>
    string(47) "г Москва, ул Сухонская, д 11"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(49) "г Москва, ул Сухонская, д 11А"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(47) "г Москва, ул Сухонская, д 13"
    ...
  }
  ...
}

城市 GeoIP

> $response = $dadata->iplocate("46.226.227.20");
> var_dump($response);
array(3) {
  ["value"]=>
  string(21) "г Краснодар"
  ["unrestricted_value"]=>
  string(66) "350000, Краснодарский край, г Краснодар"
  ["data"]=>
  array(81) {
      ...
  }
}

自动完成(建议)地址

> $response = $dadata->suggest("address", "самара метал");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(49) "г Самара, пр-кт Металлургов"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(44) "г Самара, ул Металлистов"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(95) "г Самара, поселок Зубчаниновка, ул Металлургическая"
    ...
  }
  ...
}

以英语显示建议

> $response = $dadata->suggest("address", "samara metal", 5, ["language" => "en"]);
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(42) "Russia, gorod Samara, prospekt Metallurgov"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(39) "Russia, gorod Samara, ulitsa Metallistov"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(69) "Russia, gorod Samara, poselok Zubchaninovka, ulitsa Metallurgicheskaya"
    ...
  }
  ...
}

按城市限制(南萨哈林斯克)

> $locations = [[ "kladr_id" => "6500000100000" ]];
> $response = $dadata->suggest("address", "Ватутина", 5, ["locations" => $locations]);
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(53) "г Южно-Сахалинск, ул Ватутина"
    ...
  }
}

按特定地理点和半径限制(在沃洛格达市)

> $geo = [[ "lat" => 59.244634,  "lon" => 39.913355, "radius_meters" => 200 ]];
> $response = $dadata->suggest("address", "сухонская", 5, ["locations_geo" => $geo]);
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(42) "г Вологда, ул Сухонская"
    ...
  }
}

提升城市至顶部(图拉蒂)

> $boost = [[ "kladr_id" => "6300000700000" ]];
> $response = $dadata->suggest("address", "авто", 5, ["locations_boost" => $boost]);
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(85) "Самарская обл, г Тольятти, Автозаводское шоссе"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(81) "Самарская обл, г Тольятти, ул Автомобилистов"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(81) "Самарская обл, г Тольятти, ул Автостроителей"
    ...
  }
  ...
}

通过 FIAS ID 查找地址

> $response = $dadata->findById("address", "9120b43f-2fae-4838-a144-85e43c2bfb29");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(36) "г Москва, ул Снежная"
    ...
  }
}

通过 KLADR ID 查找

> $response = $dadata->findById("address", "77000000000268400");

查找邮政局

通过地址或代码建议邮政局

> $response = $dadata->suggest("postal_unit", "дежнева 2а");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(6) "127642"
    ["unrestricted_value"]=>
    string(52) "г Москва, проезд Дежнёва, д 2А"
    ["data"]=>
    array(15) {
        ...
    }
  }
}

通过代码查找邮政局

> $response = $dadata->findById("postal_unit", "127642");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(6) "127642"
    ["unrestricted_value"]=>
    string(52) "г Москва, проезд Дежнёва, д 2А"
    ["data"]=>
    array(15) {
        ...
    }
  }
}

查找最近的邮政局

> $response = $dadata->geolocate("postal_unit", 55.878, 37.653, 1000);
> var_dump($response);
array(2) {
  [0]=>
  array(3) {
    ["value"]=>
    string(6) "127642"
    ["unrestricted_value"]=>
    string(52) "г Москва, проезд Дежнёва, д 2А"
    ["data"]=>
    array(15) {
        ...
    }
  },
  ...
}

获取配送服务的城市 ID

> $response = $dadata->findById("delivery", "3100400100000");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(13) "3100400100000"
    ["unrestricted_value"]=>
    string(36) "fe7eea4a-875a-4235-aa61-81c2a37a0440"
    ["data"]=>
    array(5) {
      ...
      ["boxberry_id"]=>
      string(5) "01929"
      ["cdek_id"]=>
      string(3) "344"
      ["dpd_id"]=>
      string(9) "196006461"
    }
  }
}

根据 FIAS 严格获取地址

> $response = $dadata->findById("fias", "9120b43f-2fae-4838-a144-85e43c2bfb29");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(36) "г Москва, ул Снежная"
    ...
  }
}

建议国家

> $response = $dadata->suggest("country", "та");
> var_dump($response);
array(4) {
  [0]=>
  array(3) {
    ["value"]=>
    string(22) "Таджикистан"
    ...
  },
  [1]=>
  array(3) {
    ["value"]=>
    string(14) "Таиланд"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(14) "Тайвань"
    ...
  }
  ...
}

公司或个体工商户

通过 INN 查找公司

> $response = $dadata->findById("party", "7707083893");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(23) "ПАО СБЕРБАНК"
    ["unrestricted_value"]=>
    string(23) "ПАО СБЕРБАНК"
    ["data"]=>
    array(29) {
      ["kpp"]=>
      string(9) "773601001"
      ["inn"]=>
      string(10) "7707083893"
      ...
    }
  },
  ...
}

通过 INN 和 KPP 查找

> $response = $dadata->findById("party", "7707083893", 1, ["kpp" => "540602001"]);
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(51) "СИБИРСКИЙ БАНК ПАО СБЕРБАНК"
    ["unrestricted_value"]=>
    string(51) "СИБИРСКИЙ БАНК ПАО СБЕРБАНК"
    ["data"]=>
    array(29) {
      ["kpp"]=>
      string(9) "540602001"
      ["inn"]=>
      string(10) "7707083893"
      ...
    }
  }
}

建议公司

> $response = $dadata->suggest("party", "сбер");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(23) "ПАО СБЕРБАНК"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(48) "АО "СБЕРЭНЕРГОСЕРВИС-ЮГРА""
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(27) "АО "СБЕРБРОКЕР""
    ...
  }
  ...
}

按特定地区限制(圣彼得堡和列宁格勒州)

> $locations = [[ "kladr_id" => "7800000000000" ], [ "kladr_id" => "4700000000000"]];
> $response = $dadata->suggest("party", "сбер", 5, ["locations" => $locations]);

按活跃公司限制

> $status = [ "ACTIVE" ];
> $response = $dadata->suggest("party", "сбер", 5, ["status" => $status]);

按个体工商户限制

> $response = $dadata->suggest("party", "сбер", 5, ["type" => "INDIVIDUAL"]);

按总机构限制,无分支机构

> $branch_type = [ "MAIN" ];
> $response = $dadata->suggest("party", "сбер", 5, ["branch_type" => $branch_type]);

查找关联公司

> $response = $dadata->findAffiliated("7736207543");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(36) "ООО "ДЗЕН.ПЛАТФОРМА""
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(21) "ООО "ЕДАДИЛ""
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(21) "ООО "ЗНАНИЕ""
    ...
  }
  ...
}

仅按经理 INN 搜索

> $response = $dadata->findAffiliated("773006366201", 5, ["scope" => "MANAGERS"]);
> var_dump($response);
array(3) {
  [0]=>
  array(3) {
    ["value"]=>
    string(21) "ООО "ЯНДЕКС""
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(13) "МФ "ФОИ""
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(22) "АНО ДПО "ШАД""
    ...
  }
}

银行

通过 BIC、SWIFT 或 INN 查找银行

> $response = $dadata->findById("bank", "044525225");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(23) "ПАО Сбербанк"
    ["unrestricted_value"]=>
    string(23) "ПАО Сбербанк"
    ["data"]=>
    array(14) {
       ["bic"]=>
      string(9) "044525225"
      ["swift"]=>
      string(8) "SABRRUMM"
      ["inn"]=>
      string(10) "7707083893"
      ...
    }
  }
}

通过 SWIFT 代码查找

> $response = $dadata->findById("bank", "SABRRUMM");

通过 INN 查找

> $response = $dadata->findById("bank", "7728168971");

通过 INN 和 KPP 查找

> $response = $dadata->findById("bank", "7728168971", 1, ["kpp" => "667102002"]);

通过注册号查找

> $response = $dadata->findById("bank", "1481");

建议银行

> $response = $dadata->suggest("bank", "ти");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(28) "АО «Тимер Банк»"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(34) "АО «Тинькофф Банк»"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(65) "«Азиатско-Тихоокеанский Банк» (ПАО)"
    ...
  }
  ...
}

个人姓名

验证和清洗姓名

> $response = $dadata->clean("name", "Срегей владимерович иванов");
> var_dump($response);
array(10) {
  ["source"]=>
  string(50) "Срегей владимерович иванов"
  ["result"]=>
  ...
  ["surname"]=>
  string(12) "Иванов"
  ["name"]=>
  string(12) "Сергей"
  ["patronymic"]=>
  string(24) "Владимирович"
  ["gender"]=>
  string(2) "М"
  ["qc"]=>
  int(1)
}

建议姓名

> $response = $dadata->suggest("fio", "викт");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(12) "Виктор"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(16) "Виктория"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(18) "Викторова"
    ...
  }
  ...
}

建议女性名字

> $filter = ["parts" => ["NAME"], gender => "FEMALE"];
> $response = $dadata->suggest("fio", "викт", 5, $filter);
> var_dump($response);
array(2) {
  [0]=>
  array(3) {
    ["value"]=>
    string(16) "Виктория"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(18) "Викторина"
    ...
  }
}

电话

验证和清洗电话

> $response = $dadata->clean("phone", "9168-233-454");
> var_dump($response);
array(14) {
  ["source"]=>
  string(12) "9168-233-454"
  ["type"]=>
  string(18) "Мобильный"
  ["phone"]=>
  string(16) "+7 916 823-34-54"
  ...
  ["provider"]=>
  string(50) "ПАО "Мобильные ТелеСистемы""
  ["country"]=>
  string(12) "Россия"
  ["region"]=>
  string(51) "Москва и Московская область"
  ["timezone"]=>
  string(5) "UTC+3"
  ["qc"]=>
  int(0)
}

护照

验证护照

> $response = $dadata->clean("passport", "4509 235857");
> var_dump($response);
array(4) {
  ["source"]=>
  string(11) "4509 235857"
  ["series"]=>
  string(5) "45 09"
  ["number"]=>
  string(6) "235857"
  ["qc"]=>
  int(0)
}

建议发行机构

> $response = $dadata->suggest("fms_unit", "772 053");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(36) "ОВД ЗЮЗИНО Г. МОСКВЫ"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(68) "ОВД ЗЮЗИНО Г. МОСКВЫ ПАСПОРТНЫЙ СТОЛ 1"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(57) "ОВД ЗЮЗИНО ПС УВД ЮЗАО Г. МОСКВЫ"
    ...
  }
  ...
}

电子邮件

验证电子邮件

> $response = $dadata->clean("email", "serega@yandex/ru");
> var_dump($response);
array(6) {
  ["source"]=>
  string(16) "serega@yandex/ru"
  ["email"]=>
  string(16) "serega@yandex.ru"
  ["local"]=>
  string(6) "serega"
  ["domain"]=>
  string(9) "yandex.ru"
  ["type"]=>
  string(8) "PERSONAL"
  ["qc"]=>
  int(4)
}

建议电子邮件

> $response = $dadata->suggest("email", "maria@");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(13) "maria@mail.ru"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(15) "maria@gmail.com"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(15) "maria@yandex.ru"
    ...
  }
  ...
}

其他数据集

税务局

> $response = $dadata->findById("fns_unit", "5257");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(118) "Инспекция ФНС России по Канавинскому району г.Нижнего Новгорода"
    ["unrestricted_value"]=>
    string(118) "Инспекция ФНС России по Канавинскому району г.Нижнего Новгорода"
    ["data"]=>
    array(18) {
      ["code"]=>
      string(4) "5257"
      ["oktmo"]=>
      string(8) "22701000"
      ["inn"]=>
      string(10) "5257046101"
      ["kpp"]=>
      string(9) "525701001"
      ...
    }
  }
}

地区法院

> $response = $dadata->suggest("region_court", "таганско");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(109) "Судебный участок № 371 Таганского судебного района г. Москвы"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(109) "Судебный участок № 372 Таганского судебного района г. Москвы"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(109) "Судебный участок № 373 Таганского судебного района г. Москвы"
    ...
  }
  ...
}

地铁站

> $response = $dadata->suggest("metro", "алекс");
> var_dump($response);
array(4) {
  [0]=>
  array(3) {
    ["value"]=>
    string(37) "Александровский сад"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(24) "Алексеевская"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(54) "Площадь Александра Невского 1"
    ...
  }
  ...
}

按城市限制(圣彼得堡)

> $filters = [[ "city" => "Санкт-Петербург" ]];
> $response = $dadata->suggest("metro", "алекс", 5, ["filters" => $filters]);
> var_dump($response);
array(2) {
  [0]=>
  array(3) {
    ["value"]=>
    string(54) "Площадь Александра Невского 1"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(54) "Площадь Александра Невского 2"
    ...
  }
}

汽车品牌

> $response = $dadata->suggest("car_brand", "фо");
> var_dump($response);
array(3) {
  [0]=>
  array(3) {
    ["value"]=>
    string(10) "Volkswagen"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(4) "Ford"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(5) "Foton"
    ...
  }
}

货币

> $response = $dadata->suggest("currency", "руб");
> var_dump($response);
array(2) {
  [0]=>
  array(3) {
    ["value"]=>
    string(33) "Белорусский рубль"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(31) "Российский рубль"
    ...
  }
}

OKVED 2

> $response = $dadata->suggest("okved2", "космических");
> var_dump($response);
array(5) {
  [0]=>
  array(3) {
    ["value"]=>
    string(139) "Производство космических аппаратов (в том числе спутников), ракет-носителей"
    ...
  }
  [1]=>
  array(3) {
    ["value"]=>
    string(139) "Производство частей и принадлежностей летательных и космических аппаратов"
    ...
  }
  [2]=>
  array(3) {
    ["value"]=>
    string(95) "Производство автоматических космических аппаратов"
    ...
  }
  ...
}

OKPD 2

> $response = $dadata->suggest("okpd2", "калоши");
> var_dump($response);
array(1) {
  [0]=>
  array(3) {
    ["value"]=>
    string(91) "Услуги по обрезинованию валенок (рыбацкие калоши)"
    ...
  }
}

配置文件 API

余额

> $response = $dadata->getBalance();
> var_dump($response);
float(8238.20)

使用统计

> $response = $dadata->getDailyStats();
> var_dump($response);
array(2) {
  ["date"]=>
  string(10) "2020-07-27"
  ["services"]=>
  array(3) {
    ["merging"]=>
    int(0)
    ["suggestions"]=>
    int(45521)
    ["clean"]=>
    int(1200)
  }
}

数据集版本

> $response = $dadata->getVersions();
> var_dump($response);
array(3) {
  ["dadata"]=>
  array(1) {
    ["version"]=>
    string(26) "stable (9048:bf33b2acc8ba)"
  }
  ["suggestions"]=>
  array(2) {
    ["version"]=>
    string(15) "20.5 (b55eb7c4)"
    ["resources"]=>
    array(4) {
      ...
    }
  }
  ["factor"]=>
  array(2) {
    ["version"]=>
    string(16) "20.06 (eb70078e)"
    ["resources"]=>
    array(8) {
      ...
    }
  }
}

开发环境

$ # you need make and docker
$ make init # init package
$ make up # run installed package
$ make test # run tests
$ make # list all commands

贡献

欢迎拉取请求。对于重大更改,请首先打开一个问题来讨论您想进行哪些更改。

确保根据需要添加或更新测试。

使用 Conventional Commits 为提交消息。

变更日志

此库使用 CalVer 并采用 YY.MM.MICRO 架构。有关每个版本的详细信息,请参阅变更日志。

许可证

MIT