// +---------------------------------------------------------------------- namespace crmeb\services\copyproduct\storage; use crmeb\services\copyproduct\BaseCopyProduct; use crmeb\services\CacheService; use crmeb\services\HttpService; /** * Class Copy99api * @package crmeb\services\copyproduct\storage */ class Copy99api extends BaseCopyProduct { /** * @var string[] */ protected $host = ['taobao', 'tmall', 'jd', 'pinduoduo', 'suning', 'yangkeduo', '1688']; //接口地址 protected static $api = [ 'taobao' => 'https://api03.6bqb.com/taobao/detail', //https://api03.6bqb.com/app/taobao/detail 'tmall' => 'https://api03.6bqb.com/tmall/detail', 'jd' => 'https://api03.6bqb.com/jd/detail', 'pdd' => 'https://api03.6bqb.com/pdd/detail', 'suning' => 'https://api03.6bqb.com/suning/detail', '1688' => 'https://api03.6bqb.com/alibaba/detail' ]; protected static $apiKey = '';//996EF05B079F8706345938A0CD7339BB //商品默认字段 protected static $productInfo = [ 'cate_id' => '', 'store_name' => '', 'store_info' => '', 'unit_name' => '件', 'price' => 0, 'keyword' => '', 'ficti' => 0, 'ot_price' => 0, 'give_integral' => 0, 'postage' => 0, 'cost' => 0, 'image' => '', 'slider_image' => '', 'video_link' => '', 'add_time' => 0, 'stock' => 0, 'description' => '', 'description_images' => [], 'soure_link' => '', 'temp_id' => '', 'items' => [], 'attrs' => [], 'info' => [], 'sku' => [] ]; /** * 整合 * @param $url * @param $method * @param $data * @return string */ public static function makeUrl(string $url, string $method, array $data) { $param = ''; if (strtolower($method) == 'get' && $data) { foreach ($data as $key => $value) { $param .= '&' . $key . '=' . $value; } } return $url . '?apikey=' . self::$apiKey . $param; } /** * @param bool $status * @param string $msg * @param array $data */ public static function setReturn(bool $status = true, string $msg = 'SUCCESS', array $data = []) { return ['status' => $status, 'msg' => $msg, 'data' => $data]; } public function open() { return true; } public function getType(string $link) { $shopid = 0; $url_arr = parse_url($link); if (isset($url_arr['host'])) { foreach ($this->host as $name) { if (strpos($url_arr['host'], $name) !== false) { $type = $name; } } } $type = ($type == 'pinduoduo' || $type == 'yangkeduo') ? 'pdd' : $type; switch ($type) { case 'taobao': case 'tmall': $params = []; if (isset($url_arr['query']) && $url_arr['query']) { $queryParts = explode('&', $url_arr['query']); foreach ($queryParts as $param) { $item = explode('=', $param); if (isset($item[0]) && $item[1]) $params[$item[0]] = $item[1]; } } $id = $params['id'] ?? ''; break; case 'jd': $params = []; if (isset($url_arr['path']) && $url_arr['path']) { $path = str_replace('.html', '', $url_arr['path']); $params = explode('/', $path); } $id = $params[1] ?? ''; break; case 'pdd': $params = []; if (isset($url_arr['query']) && $url_arr['query']) { $queryParts = explode('&', $url_arr['query']); foreach ($queryParts as $param) { $item = explode('=', $param); if (isset($item[0]) && $item[1]) $params[$item[0]] = $item[1]; } } $id = $params['goods_id'] ?? $params['goodsId'] ?? ''; break; case 'suning': $params = []; if (isset($url_arr['path']) && $url_arr['path']) { $path = str_replace('.html', '', $url_arr['path']); $params = explode('/', $path); } $id = $params[2] ?? ''; $shopid = $params[1] ?? ''; break; case '1688': $params = []; if (isset($url_arr['query']) && $url_arr['query']) { $path = str_replace('.html', '', $url_arr['path']); $params = explode('/', $path); } $id = $params[2] ?? ''; $shopid = $params[1] ?? ''; break; } return [$type, $id, $shopid]; } /** * * @param string $link * @param array $options * @return array */ public function goods(string $link, array $options = []) { [$type, $id, $shopid] = $this->getType($link); $apikey = $options['apikey'] ?? null; $data = [ 'itemid' => $id, 'shopid' => $shopid, ]; if (!$apikey) { return self::setReturn(false, '请先去设置复制商品apiKey'); } $url = self::$api[$type] ?? ''; $type = $type == '1688' ? 'alibaba' : $type; $action = $type . 'Info'; $deal_action = $type . 'Deal'; $method = 'get'; self::$apiKey = $apikey; if (!$data || !$url || !is_callable(self::class, $action) || !is_callable(self::class, $deal_action)) { return self::setReturn(false, '暂不支持该平台商品复制'); } switch ($type) { case 'taobao': case 'tmall': case 'jd': case 'pdd': case 'alibaba': $method = 'get'; if (!isset($data['itemid']) || !$data['itemid']) return self::setReturn(false, '缺少商品ID'); break; case 'suning': $method = 'get'; if (!isset($data['itemid']) || !$data['itemid']) return self::setReturn(false, '缺少商品ID'); if (!isset($data['shopid']) || !$data['shopid']) return self::setReturn(false, '缺少商户ID'); break; } $url = self::makeUrl($url, $method, $data); if ($cache_info = CacheService::get(md5($url))) { return self::setReturn(true, 'SUCCESS', $cache_info); } $info = self::$action($url, $data); if (!$info) return self::setReturn(false, '获取商品失败'); $info = json_decode($info, true); if (!$info || (!in_array($info['retcode'], ['0000']))) { return self::setReturn(false, $info['message'] ?? '获取商品失败', $info); } $result = $info['data']; //可能存在下一页 但是api中没有分页参数 暂留 // if (isset($info['hasNext']) && $info['hasNext']) { // $data['page'] = $info['page'] + 1; // } $result = self::$deal_action($result); //过滤采集到的规格 删除其中的空值 if ($result['items']) { foreach ($result['items'] as $k => $item) { if (isset($item['value'])) { if ($item['value'] == '') unset($result['items'][$k]); if (!$item['detail'] || !isset($item['detail'][0]) || $item['detail'][0] == '') unset($result['items'][$k]); } else { unset($result['items'][$k]); } } } if (!$result['items']) { $result['items'] = [ [ 'value' => '默认', 'detail' => [ '默认' ] ] ]; } $result['info'] = self::formatAttr($result['items'], $result['sku']); if (!$result['image'] && $result['slider_image']) $result['image'] = $result['slider_image'][0] ?? ''; if ($result['description']) { $result['description'] = str_replace('data-lazyload', 'src', $result['description']); } CacheService::set(md5($url), $result, 3600 * 24); return self::setReturn(true, 'SUCCESS', $result); } /** * 获取淘宝商品 * @param $url * @param $data * @param string $method * @return bool|string */ public static function taobaoInfo(string $url, array $data, string $method = 'get') { $info = HttpService::request($url, $method, $data); $result = false; if ($info) { $result = $info; } return $result; } /** * 处理获取淘宝的商品 * @param $data * @return mixed */ public static function taobaoDeal(array $data) { $info = $data['item'] ?? []; $result = self::$productInfo; if ($info) { $result['store_name'] = $info['title'] ?? ''; $result['store_info'] = $info['subTitle'] ?? ''; $result['slider_image'] = $info['images'] ?? ''; $result['description'] = $info['desc'] ?? ''; $result['description_images'] = $info['descImgs'] ?? []; $items = []; if (isset($info['props']) && $info['props']) { foreach ($info['props'] as $key => $prop) { $item['value'] = $prop['name']; $item['detail'] = []; foreach ($prop['values'] as $name) { $item['detail'][] = $name['name']; } $items[] = $item; } } $sku = []; if (isset($info['sku']) && $info['sku']) { foreach ($info['sku'] as $item) { if ($item['skuId']) { $skuName = explode(';', $item['skuName']); $skuNameData = []; foreach ($skuName as $v) { [$kp, $vv] = explode('--', $v); $skuNameData[] = $vv; } $sku[implode(',', $skuNameData)] = [ 'price' => $item['price'] ]; } } } $result['sku'] = $sku; $result['items'] = array_merge($items); } return $result; } /** * 获取天猫商品 * @param $url * @param $data * @param string $method * @return bool|string */ public static function tmallInfo(string $url, array $data, string $method = 'get') { $info = HttpService::request($url, $method, $data); $result = false; if ($info) { $result = $info; } return $result; } /** * 处理天猫商品 * @param $data * @return mixed */ public static function tmallDeal(array $data) { $info = $data['item'] ?? []; $result = self::$productInfo; if ($info) { $result['store_name'] = $info['title'] ?? ''; $result['store_info'] = $info['subTitle'] ?? ''; $result['slider_image'] = self::lingByHttp($info['images'] ?? ''); $result['description_images'] = self::lingByHttp($info['descImgs'] ?? []); $description = ''; foreach ($result['description_images'] as $item) { $description .= ''; } unset($item); $result['description'] = $description; $items = []; if (isset($info['props']) && $info['props']) { foreach ($info['props'] as $key => $prop) { $item['value'] = $prop['name']; $item['detail'] = []; foreach ($prop['values'] as $name) { $item['detail'][] = $name['name']; } $items[] = $item; } } $sku = []; if (isset($info['sku']) && $info['sku']) { foreach ($info['sku'] as $item) { if ($item['skuId']) { $skuName = explode(';', $item['skuName']); $skuNameData = []; foreach ($skuName as $v) { [$kp, $vv] = explode('--', $v); $skuNameData[] = $vv; } $sku[implode(',', $skuNameData)] = [ 'price' => $item['price'] ]; } } } $result['sku'] = $sku; $result['items'] = array_merge($items); } return $result; } /** * 获取京东商品 * @param $url * @param $data * @param string $method * @return bool|string */ public static function jdInfo(string $url, array $data, string $method = 'get') { $info = HttpService::request($url, $method, $data); $result = false; if ($info) { $result = $info; } return $result; } /** * 处理京东商品 * @param $data * @return mixed */ public static function jdDeal(array $data) { $info = $data['item'] ?? []; $result = self::$productInfo; if ($info) { $result['store_name'] = $info['name'] ?? ''; $result['store_info'] = $result['store_name']; $result['price'] = $info['price'] ?? 0; $result['ot_price'] = $info['originalPrice'] ?? 0; $result['slider_image'] = $info['images'] ?? []; $result['description'] = $info['desc'] ?? ''; $result['description_images'] = $info['descImgs'] ?? []; $result['description_images'] = array_map(function ($item) { if (strstr($item, 'http') === false) { $item = 'http:' . $item; } return $item; }, $result['description_images']); if (strstr($result['description'], '