gikoha’s blog

個人的メモがわり

AffiliateMaker

コマンドライン

github.com

ViewControllerのソース

 

//
//  ViewController.swift
//  AffiliateMaker
//
//  Created by Namikare Gikoha on 2020/01/02.
//  Copyright © 2020 gikoha. All rights reserved.
//

import Cocoa
import Alamofire
import CryptoSwift
import SwiftyXMLParser

let associateTag = "gikohadiary-22"
let amazonAccessKey = "XXXXXX自分で置き換えてねXXXXXXXX"
let amazonSecretKey = "XXXXXX自分で置き換えてねXXXXXXXX"

// http://seiya-orz.hatenablog.com/entry/2018/01/21/154249

extension Date
{
    func jpDate(_ format: String = "yyyy/MM/dd") -> String
    {
        let formatter = DateFormatter()
        formatter.locale = Locale(identifier: "ja_JP")
        formatter.dateFormat = format
        return formatter.string(from: self)
    }
}

extension String
{
    func urlAWSQueryEncoding() -> String
    {
        var allowedCharacters = CharacterSet.alphanumerics
        allowedCharacters.insert(charactersIn: "-")
        if let ret = self.addingPercentEncoding(withAllowedCharacters: allowedCharacters )
        {
            return ret
        }
        return ""
    }
    
    func hmac(key: String) -> String
    {
        guard let keyBytes = key.data(using: .utf8)?.bytes, let mesBytes = self.data(using: .utf8)?.bytes else
        {
            return ""
        }
        let hmac = try! HMAC(key: keyBytes, variant: .sha256).authenticate(mesBytes)
        return Data(hmac).base64EncodedString()
    }
}

class ViewController: NSViewController {

	
	@IBOutlet weak var myTextView: NSTextView!
	@IBOutlet weak var sendButton: NSButton!
	@IBOutlet weak var asinTextField: NSTextField!
	
	override func viewDidLoad()
    {
		super.viewDidLoad()

		// Do any additional setup after loading the view.
	}

	override var representedObject: Any?
    {
		didSet
        {
            // Update the view, if already loaded.
		}
	}
	
	@IBAction func sendAction(_sender: Any)
	{
		// parametersはABC順にソートする必要があります
		
		var parameters = "AWSAccessKeyId=" + amazonAccessKey
		parameters += "&AssociateTag=" + associateTag
        parameters += "&ItemId=" + asinTextField.stringValue // "B08247FT3N"
		parameters += "&Operation=" + "ItemLookup"
		parameters += "&Service=" + "AWSECommerceService"
		parameters += "&Timestamp=" + Date().jpDate("yyyy-MM-dd'T'HH:mm:ssZZZZZ").urlAWSQueryEncoding()
		let target = "GET\nwebservices.amazon.co.jp\n/onca/xml\n\(parameters)"
		let signature = target.hmac(key: amazonSecretKey).urlAWSQueryEncoding()
		let url = "https://webservices.amazon.co.jp/onca/xml?\(parameters)&Signature=\(signature)"

		Alamofire.request(url).response { response in
            if let data = response.data
            {
                let xml = try! XML.parse(String(data: data, encoding: .utf8)!)
                if case .failure(let error) =  xml["ItemLookupResponse","Items","Item","ItemAttributes","Title"]
                {
                    let errmsg = xml.ItemLookupResponse.Items.Request.Errors.Error.Message.text!
                    self.myTextView.string = "Error: \(errmsg)"
                }
                else
                {
                    let title = xml.ItemLookupResponse.Items.Item.ItemAttributes.Title.text!
                    let itemurl = xml.ItemLookupResponse.Items.Item.DetailPageURL.text!
                    self.myTextView.string = "<a href=\"\(itemurl)\">\(title)</a>" + "\nerror = \(request)"
                }
            }
            else
            {
                self.myTextView.string = "Error: no data"
            }
		}

	}

}

<