【问题标题】:Is there an easy way to update CSV with an API data?有没有一种简单的方法可以使用 API 数据更新 CSV?
【发布时间】:2019-03-10 17:08:00
【问题描述】:

我有一个代码可以得到亚马逊产品的价格,如果你给它“ASIN”(它是亚马逊产品识别号)...下面你可以找到代码(我认为没有必要阅读反正代码)。

<?php

class AmazonAPI {

    var $amazon_aff_id;
    var $amazon_access_key;
    var $amazon_secret_key;

    var $url_params;
    var $itemID;
    var $xml;

    var $operation;
    var $signature;
    var $response_groups = "Small,Images,OfferSummary";

    var $error_message;
    var $error=0;


    public function __construct($affid, $access, $secret)
    {
        $this->amazon_aff_id = $affid;
        $this->amazon_access_key = $access;
        $this->amazon_secret_key = $secret;
    }

    public function build_url()
    {
        $url = "http://webservices.amazon.com/onca/xml?";

        $this->response_groups = str_replace(",", "%2C", $this->response_groups);

        $url_params = "AWSAccessKeyId=" . $this->amazon_access_key;
        $url_params .= "&AssociateTag=" . $this->amazon_aff_id;

        if(!empty($this->itemID)) {
            $url_params .= "&ItemId=" . $this->itemID;
        }

        $url_params .= "&Operation=" . $this->operation;
        $url_params .= "&ResponseGroup=" . $this->response_groups;
        $url_params .= "&Service=AWSECommerceService";
        $url_params .= "&Timestamp=" . rawurlencode(gmdate("Y-m-d\TH:i:s\Z"));
        $url_params .= "&Version=2013-08-01";

        $this->url_params = $url_params;

        $url .= $url_params;
        $url .= "&Signature=" . $this->generate_signature();

        return $url;
    }

    public function generate_signature()
    {
        $this->signature = base64_encode(hash_hmac("sha256",
            "GET\nwebservices.amazon.com\n/onca/xml\n" . $this->url_params,
            $this->amazon_secret_key, True));
        $this->signature = str_replace("+", "%2B", $this->signature);
        $this->signature = str_replace("=", "%3D", $this->signature);
        return $this->signature;
    }

    public function item_lookup($id)
    {
        $this->operation = "ItemLookup";
        $this->itemID = $id;

        $url = $this->build_url();

        $ch = curl_init();  

        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

        $output = curl_exec($ch);

        curl_close($ch);

        $this->xml = simplexml_load_string($output);
        return $this;
    }

    public function check_for_errors()
    {
        if(isset($this->xml->Error)) {
            $this->error_message = $this->xml->Error->Message;
            $this->error = 1;
        }
        if(isset($this->xml->Items->Request->Errors)) {
            $this->error_message = $this->xml->Items->Request->Errors->Error->Message;
            $this->error = 1;
        }
        return $this->error;
    }

    public function get_item_price($product)
    {
        $price = 0;
        if(isset($product->LowestNewPrice)) {
            $price = $product->LowestNewPrice->Amount;
        } elseif(isset($product->LowestUsedPrice)) {
            $price = $product->LowestUsedPrice->Amount;
        } elseif(isset($product->LowestCollectiblePrice)) {
            $price = $product->LowestCollectiblePrice->Amount;
        } elseif(isset($product->LowestRefurbishedPrice)) {
            $price = $product->LowestRefurbishedPrice->Amount;
        }
        return $price;
    }

    public function get_item_data()
    {
        if($this->check_for_errors()) return null;

        $product = $this->xml->Items->Item;
        $item = new STDclass;
        $item->detailedPageURL = $product->DetailPageURL;
        $item->link = "https://www.amazon.com/gp/product/".$this->itemID."/?tag=" . $this->amazon_aff_id;
        $item->title = $product->ItemAttributes->Title;
        $item->smallImage = $product->SmallImage->URL;
        $item->mediumImage = $product->MediumImage->URL;
        $item->largeImage = $product->LargeImage->URL;

        $item->price = $this->get_item_price($product->OfferSummary);

        return $item;
    }

}

?>

然后我用这个代码回应价格

$amazon = new AmazonAPI("associate-id", "access-key", "secret-key");
$item = $amazon->item_lookup("ASIN")->get_item_data();

echo $item->price;

现在,如果我有这样的 csv 表 https://ibb.co/dHS4EK

我可以根据 B 列和 C 列的 asin 更新 D 列和 E 列的价格吗?

例如,单元格 D2 的值将使用以下代码获取它

$amazon = new AmazonAPI("associate-id", "access-key", "secret-key");
$item = $amazon->item_lookup(Value on cell D2)->get_item_data();

echo $item->price;

然后在更新价格后保存 csv 文件,有没有一种简单的方法可以在 php 中做到这一点,尤其是我对编码很陌生?

编辑 1:我需要 csv 文件使用仅接受 csv 文件的 WooCommerce 导入工具导入它

提前致谢

【问题讨论】:

  • 这种东西不是更适合数据库而不是 CSV 文件吗?
  • @NigelRen 实际上我需要使用 woocommerce 导入工具导入 csv 文件,该工具只接受 csv 格式

标签: javascript php jquery ajax csv


【解决方案1】:

你要做的是:

  1. 将 CSV 文件解析为数组。您可以使用 PHP 函数,例如 str-getcsv
  2. 使用 array_filter 或简单的 foreach 循环在数组中查找正确的行。
  3. 用新价格更新相应的值
  4. 使用 fputcsv 从数组创建 CSV 文件

【讨论】:

  • 感谢您的回答,但我只是想知道如何更新每个单元格的价格,我的意思是我上面的 api 代码只能查找单个 asin 而不能查找 asin 数组所以每个价格单元格需要 1 个 api 请求
  • 那么您要么必须查看 Amazon 是否提供 API 端点来检索多个 asins 的价格,要么您必须一次使用 1 个 api 请求进行查找...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多