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" } } } }
<