{"id":631,"date":"2010-12-29T02:57:28","date_gmt":"2010-12-28T17:57:28","guid":{"rendered":"http:\/\/helloidea.org\/?p=631"},"modified":"2015-04-27T04:37:31","modified_gmt":"2015-04-26T19:37:31","slug":"amazons3%e3%81%ae%e4%bd%bf%e3%81%84%e6%96%b9-api%e3%81%a8%e3%81%8b","status":"publish","type":"post","link":"https:\/\/helloidea.org\/index.php\/archives\/631.html","title":{"rendered":"AmazonS3\u306e\u4f7f\u3044\u65b9 API\u3068\u304b"},"content":{"rendered":"<p>\u2460\u30d0\u30b1\u30c4\u306e\u4e00\u89a7\u78ba\u8a8d<br \/>\n\u2461\u30d0\u30b1\u30c4\u4f5c\u6210<br \/>\n\u2462\u6700\u5f8c\u306b\u30d0\u30b1\u30c4\u306e\u4e00\u89a7\u3092\u78ba\u8a8d<br \/>\n\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002\u51c4\u304f\u96d1\u3067\u3059\u3002<\/p>\n<p>\u305d\u308c\u306b\u3057\u3066\u3082\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u304c\u5c11\u306a\u3044\u3002\u3002\u30c4\u30fc\u30eb\u3082\u5c11\u306a\u3044\u3002\u3002<br \/>\nLiteLanguage\u306b\u306fAmazonS3\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u6709\u308b\u3093\u3067\u3059\u304c\u3001C\u306b\u306f\u7121\u3044\u306e\u304b\u306a\uff20\uff20<\/p>\n<p>clx\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u3092\u4f7f\u3048\u3070\u7c21\u5358\u306bhttps\u306b\u51fa\u6765\u308b\u306f\u305a\u3067\u3059\u3002\u3067\u3082\u79fb\u690d\u6027\u304c\uff01<\/p>\n<p><strong>\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0<\/strong><\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#include &lt;iostream&gt;\r\n#include &lt;string&gt;\r\n#include &lt;clx\/https.h&gt;\r\n#include &lt;clx\/uri.h&gt;\r\n#include &lt;clx\/base64.h&gt;\r\n#include &lt;clx\/format.h&gt;\r\n#include &lt;clx\/time.h&gt;\r\n#include &lt;boost\/asio.hpp&gt;\r\n#include &lt;openssl\/sha.h&gt;\r\n#include &lt;openssl\/hmac.h&gt;\r\n#include &lt;openssl\/evp.h&gt;\r\n#include &lt;openssl\/bio.h&gt;\r\n#include &lt;openssl\/buffer.h&gt;\r\n\r\n\/\/ \u53c2\u8003\u30b5\u30a4\u30c8\u304b\u3089\r\nchar *base64(const unsigned char *input, int length)\r\n{\r\n  BIO *bmem, *b64;\r\n  BUF_MEM *bptr;\r\n\r\n  b64 = BIO_new(BIO_f_base64());\r\n  bmem = BIO_new(BIO_s_mem());\r\n  b64 = BIO_push(b64, bmem);\r\n  BIO_write(b64, input, length);\r\n  BIO_flush(b64);\r\n  BIO_get_mem_ptr(b64, &amp;bptr);\r\n\r\n  char *buff = (char *)malloc(bptr-&gt;length);\r\n  memcpy(buff, bptr-&gt;data, bptr-&gt;length-1);\r\n  buff&#x5B;bptr-&gt;length-1] = 0;\r\n\r\n  BIO_free_all(b64);\r\n\r\n  return buff;\r\n}\r\n\r\n\/\/ \u30d0\u30b1\u30c3\u30c8\u30ea\u30b9\u30c8\u306e\u4e00\u89a7\u7528\u30b7\u30b0\u30cd\u30c1\u30e3\r\nstd::string cresig_Bucket_list(std::string date, std::string SecretAccessKey)\r\n{\r\n\tstd::string StringToSign = &quot;GET\\n\\n\\n&quot; + date + &quot;\\n\/&quot;;\r\n\tstd::string sigunetya;\r\n\r\n\tunsigned int reslen;\r\n    unsigned char res&#x5B;SHA_DIGEST_LENGTH + 1];\r\n\r\n\tHMAC(EVP_sha1(), SecretAccessKey.c_str(), SecretAccessKey.size(), (unsigned const char*)StringToSign.c_str(), StringToSign.size(), res, &amp;reslen);\r\n\r\n\tchar* output = base64(res, reslen);\r\n\r\n\treturn std::string(output);\r\n}\r\n\r\n\/\/ \u65b0\u3057\u3044\u30d0\u30b1\u30c3\u30c8\u4f5c\u6210\u7528\u30b7\u30b0\u30cd\u30c1\u30e3\r\nstd::string cresig_PUT_Bucket(std::string date, std::string SecretAccessKey)\r\n{\r\n\u3000\u3000\u3000\u3000\/\/ \u203bhelloidea\u57cb\u3081\u8fbc\u307f \uff08\u96d1\uff09\r\n\tstd::string StringToSign = &quot;PUT\\n\\n\\n&quot; + date + &quot;\\n\/helloidea\/&quot;;\r\n\tstd::string sigunetya;\r\n\r\n\tunsigned int reslen;\r\n    unsigned char res&#x5B;SHA_DIGEST_LENGTH + 1];\r\n\r\n\tHMAC(EVP_sha1(), SecretAccessKey.c_str(), SecretAccessKey.size(), (unsigned const char*)StringToSign.c_str(), StringToSign.size(), res, &amp;reslen);\r\n\r\n\tchar* output = base64(res, reslen);\r\n\r\n\treturn std::string(output);\r\n}\r\n\r\nint main() {\r\n    \r\n\tstd::string AWSAccessKeyId = &quot;\u25a0\u25a0\u25a0\u25a0\u3042\u306a\u305f\u306eAWSAccessKeyId \u25a0\u25a0\u25a0\u25a0&quot;;\r\n\tstd::string SecretAccessKey = &quot;\u25a0\u25a0\u25a0\u25a0\u25a0\u25a0\u25a0\u3042\u306a\u305f\u306eSecretAccessKey \u25a0\u25a0\u25a0\u25a0\u25a0\u25a0\u25a0\u25a0&quot;;\r\n\t\r\n\tstd::string fmt = &quot;%a, %d %b %Y %H:%M:%S GMT&quot;;\r\n\tstd::string time;\r\n\tclx::date_time now;\r\n\tstd::cout &lt;&lt; now.to_string&lt;char&gt;(fmt) &lt;&lt; std::endl;\r\n\ttime = (now + clx::hours(-9)).to_string&lt;char&gt;(fmt);\r\n\r\n\tboost::asio::ip::tcp::iostream s(&quot;s3.amazonaws.com&quot;, &quot;http&quot;);\r\n\r\n\tstd::string line;\r\n\r\n    \/********************************************************************************\r\n         \u30d0\u30b1\u30c4\u30ea\u30b9\u30c8\u8868\u793a\r\n    ********************************************************************************\/\r\n\ttime = (now + clx::hours(-9)).to_string&lt;char&gt;(fmt);\r\n\ts &lt;&lt; &quot;GET \/ HTTP\/1.1\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Host: s3.amazonaws.com\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Date: &quot; + time + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Authorization: AWS &quot; +  AWSAccessKeyId + &quot;:&quot; + cresig_Bucket_list(time, SecretAccessKey)  + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; std::flush;\r\n\r\n\t\/\/ \u53d7\u4fe1\r\n\twhile( getline(s, line) )\r\n\t{\r\n\t\tif(line == &quot;0\\r&quot;) break;\r\n\t\tstd::cout &lt;&lt; line &lt;&lt; std::endl;\r\n\t}\r\n\r\n    \/********************************************************************************\r\n        \u65b0\u3057\u3044\u30d0\u30b1\u30c4\u4f5c\u6210\r\n    ********************************************************************************\/\r\n\ttime = (now + clx::hours(-9)).to_string&lt;char&gt;(fmt);\r\n\ts &lt;&lt; &quot;PUT \/ HTTP\/1.1\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Host: helloidea.s3.amazonaws.com\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Content-Length: 0\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Date: &quot; + time + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Authorization: AWS &quot; +  AWSAccessKeyId + &quot;:&quot; + cresig_PUT_Bucket(time, SecretAccessKey)  + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; std::flush;\r\n\r\n\t\/\/ \u53d7\u4fe1\r\n\twhile( getline(s, line) )\r\n\t{\r\n\t\tif(line == &quot;\\r&quot;) break;\r\n\t\tstd::cout &lt;&lt; line &lt;&lt; std::endl;\r\n\t}\r\n\t\r\n\r\n    \/********************************************************************************\r\n         \u30d0\u30b1\u30c4\u30ea\u30b9\u30c8\u8868\u793a\r\n    ********************************************************************************\/\r\n\ttime = (now + clx::hours(-9)).to_string&lt;char&gt;(fmt);\r\n\ts &lt;&lt; &quot;GET \/ HTTP\/1.1\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Host: s3.amazonaws.com\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Date: &quot; + time + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;Authorization: AWS &quot; +  AWSAccessKeyId + &quot;:&quot; + cresig_Bucket_list(time, SecretAccessKey)  + &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; &quot;\\r\\n&quot;;\r\n\ts &lt;&lt; std::flush;\r\n\r\n\t\/\/ \u53d7\u4fe1\r\n\twhile( getline(s, line) )\r\n\t{\r\n\t\tif(line == &quot;0\\r&quot;) break;\r\n\t\tstd::cout &lt;&lt; line &lt;&lt; std::endl;\r\n\t}\r\n    \r\n    return 0;\r\n}\r\n<\/pre>\n<p><strong>\u5b9f\u884c\u7d50\u679c<\/strong><\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\nWed, 29 Dec 2010 02:10:45 GMT\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: aC+IMQJqhaar2Ge7xPExs\/89HxVa3uX0XkHh5UjyJg6r3q1eXE8i8amVJqkn+wEJ\r\nx-amz-request-id: B938635CD29FA243\r\nDate: Tue, 28 Dec 2010 17:10:47 GMT\r\nContent-Type: application\/xml\r\nTransfer-Encoding: chunked\r\nServer: AmazonS3\r\n\r\n171\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;ListAllMyBucketsResult xmlns=&quot;http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/&quot;&gt;&lt;Owner&gt;&lt;ID&gt;48cf8016ac58fbcb1eac1d3494f2aa32a1c962e693e2cdcf07260dd32ad20c1b&lt;\/ID&gt;&lt;DisplayName&gt;monyuonyu&lt;\/DisplayName&gt;&lt;\/Owner&gt;&lt;Buckets&gt;&lt;Bucket&gt;&lt;Name&gt;mk-pino&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-27T13:09:37.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;\/Buckets&gt;&lt;\/ListAllMyBucketsResult&gt;\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: RxRWtFXn+tC87ssZPN0ETtoJ9LRQb8Y+o6O\/h8ROoUTWYejJE0mi7aL0OSc9E40I\r\nx-amz-request-id: 394C83DC35E55C94\r\nDate: Tue, 28 Dec 2010 17:10:47 GMT\r\nLocation: \/helloidea\r\nContent-Length: 0\r\nServer: AmazonS3\r\n\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: ND24MyAfKEysFZadhha3uGgKruXPaOUVqBNezeimYof8CFiTMIunxmtSQYp6Ytol\r\nx-amz-request-id: F062E71478508082\r\nDate: Tue, 28 Dec 2010 17:10:47 GMT\r\nContent-Type: application\/xml\r\nTransfer-Encoding: chunked\r\nServer: AmazonS3\r\n\r\n1cd\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;ListAllMyBucketsResult xmlns=&quot;http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/&quot;&gt;&lt;Owner&gt;&lt;ID&gt;48cf8016ac58fbcb1eac1d3494f2aa32a1c962e693e2cdcf07260dd32ad20c1b&lt;\/ID&gt;&lt;DisplayName&gt;monyuonyu&lt;\/DisplayName&gt;&lt;\/Owner&gt;&lt;Buckets&gt;&lt;Bucket&gt;&lt;Name&gt;helloidea&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-28T17:10:47.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;Bucket&gt;&lt;Name&gt;mk-pino&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-27T13:09:37.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;\/Buckets&gt;&lt;\/ListAllMyBucketsResult&gt;\r\n<\/pre>\n<p><strong>\u30d1\u30b1\u30c3\u30c8\u30ad\u30e3\u30d7\u30c1\u30e3<\/strong><\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\nGET \/ HTTP\/1.1\r\nHost: s3.amazonaws.com\r\nDate: Tue, 28 Dec 2010 17:12:02 GMT\r\nAuthorization: AWS AKIAJEB3RUBMODUOMC2A:9MewU\/ovOLenn16jxpJWDo\/BFDA=\r\n\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: qWXRbV7oveOX7lwgcgZHI1Qr3wGnrRfT5P\/AcFKFLe2wpUCEi4HPqusWBDJDUhiB\r\nx-amz-request-id: 38F96C42725BF3E0\r\nDate: Tue, 28 Dec 2010 17:12:05 GMT\r\nContent-Type: application\/xml\r\nTransfer-Encoding: chunked\r\nServer: AmazonS3\r\n\r\n171\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;ListAllMyBucketsResult xmlns=&quot;http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/&quot;&gt;&lt;Owner&gt;&lt;ID&gt;48cf8016ac58fbcb1eac1d3494f2aa32a1c962e693e2cdcf07260dd32ad20c1b&lt;\/ID&gt;&lt;DisplayName&gt;monyuonyu&lt;\/DisplayName&gt;&lt;\/Owner&gt;&lt;Buckets&gt;&lt;Bucket&gt;&lt;Name&gt;mk-pino&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-27T13:09:37.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;\/Buckets&gt;&lt;\/ListAllMyBucketsResult&gt;\r\n0\r\n\r\nPUT \/ HTTP\/1.1\r\nHost: helloidea.s3.amazonaws.com\r\nContent-Length: 0\r\nDate: Tue, 28 Dec 2010 17:12:02 GMT\r\nAuthorization: AWS AKIAJEB3RUBMODUOMC2A:o\/kGf8J\/7QGDL40p\/J01VhOUMRQ=\r\n\r\nGET \/ HTTP\/1.1\r\nHost: s3.amazonaws.com\r\nDate: Tue, 28 Dec 2010 17:12:02 GMT\r\nAuthorization: AWS AKIAJEB3RUBMODUOMC2A:9MewU\/ovOLenn16jxpJWDo\/BFDA=\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: 19v\/z0GcSOurF1NVtKikSSvQJT5Ohq642c1weziUroWv99NBWmKOos17qwvjBvoF\r\nx-amz-request-id: 5E30C041AB2E8523\r\nDate: Tue, 28 Dec 2010 17:12:06 GMT\r\nLocation: \/helloidea\r\nContent-Length: 0\r\nServer: AmazonS3\r\n\r\nHTTP\/1.1 200 OK\r\nx-amz-id-2: 5sSB\/Dr9tlFFjv8mFQxloozANn0ZEtL9\/ZzMKLQkiR+HIglhiledhCwO\/vMxNBU8\r\nx-amz-request-id: 81FA9B5EB1BFD1A5\r\nDate: Tue, 28 Dec 2010 17:12:06 GMT\r\nContent-Type: application\/xml\r\nTransfer-Encoding: chunked\r\nServer: AmazonS3\r\n\r\n1cd\r\n&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\r\n&lt;ListAllMyBucketsResult xmlns=&quot;http:\/\/s3.amazonaws.com\/doc\/2006-03-01\/&quot;&gt;&lt;Owner&gt;&lt;ID&gt;48cf8016ac58fbcb1eac1d3494f2aa32a1c962e693e2cdcf07260dd32ad20c1b&lt;\/ID&gt;&lt;DisplayName&gt;monyuonyu&lt;\/DisplayName&gt;&lt;\/Owner&gt;&lt;Buckets&gt;&lt;Bucket&gt;&lt;Name&gt;helloidea&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-28T17:12:06.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;Bucket&gt;&lt;Name&gt;mk-pino&lt;\/Name&gt;&lt;CreationDate&gt;2010-12-27T13:09:37.000Z&lt;\/CreationDate&gt;&lt;\/Bucket&gt;&lt;\/Buckets&gt;&lt;\/ListAllMyBucketsResult&gt;\r\n0\r\n<\/pre>\n<p>\u57fa\u672c\u7684\u306b\u30d1\u30b1\u30c3\u30c8\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u3057\u306a\u304c\u3089\u4f5c\u696d\u3059\u308b\u3068\u697d\u3060\u3068\u601d\u3044\u307e\u3059\u3002<br \/>\nFirefix\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306eS3Fox\u3092\u30d1\u30b1\u30c3\u30c8\u30ad\u30e3\u30d7\u30c1\u30e3\u3059\u308b\u3068\u52d5\u4f5c\u304c\u3088\u304f\u308f\u304b\u308a\u307e\u3059\u3002<br \/>\n\u305d\u308c\u3068S3Fox\u306f\u30c7\u30fc\u30bf\u304c\u6697\u53f7\u5316\u3055\u308c\u3066\u306a\u3044\u4e8b\u3082\u308f\u304b\u308a\u307e\u3057\u305f\u30fb\u30fb\u30fb\u6c17\u3092\u3064\u3051\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p>sigunetya\u306e\u4f5c\u6210\u306b\u95a2\u3057\u3066\u306f\u3001Amazon Simple Storage Service Developer Guide\uff08\u4e0b\u53c2\u7167\uff09\u306b\u8a73\u3057\u304f\u66f8\u3044\u3066\u3042\u308a\u307e\u3059\u3002<br \/>\n\u8f09\u3063\u3066\u3044\u306a\u3044API\u306esigunetya\u751f\u6210\u306b\u95a2\u3057\u3066\u306f\u3001\u5468\u308a\u306eAPI\u3092\u898b\u3066\u5224\u65ad\u3057\u307e\u3059\u3002<\/p>\n<p>AWSAccessKeyId \u304c\u4e38\u898b\u3048\u3067\u3059\u304c\u306a\u306b\u304b\uff3e\uff3e\uff1b<br \/>\n\u53c2\u8003\u30b5\u30a4\u30c8<\/p>\n<p><a href=\"http:\/\/docs.amazonwebservices.com\/AmazonS3\/latest\/dev\/index.html?RESTAuthentication.html\">Amazon Simple Storage Service Developer Guide<\/a><br \/>\n<a href=\"http:\/\/docs.amazonwebservices.com\/AmazonS3\/latest\/API\/\">Amazon Simple Storage Service API Reference<\/a><br \/>\n<a href=\"http:\/\/www.ioncannon.net\/programming\/34\/howto-base64-encode-with-cc-and-openssl\/\">Howto base64 encode with C\/C++ and OpenSSL<\/a><br \/>\n<a href=\"http:\/\/kaworu.jpn.org\/kaworu\/2007-03-22-1.php\">openssl HMAC \u3092\u8a66\u3059<\/a><br \/>\n<a href=\"http:\/\/clx.cielquis.net\/\">CLX C++ Libraries<\/a><br \/>\n<a href=\"http:\/\/x68000.q-e-d.net\/~68user\/net\/http-auth-1.html\">HTTP \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3092\u4f5c\u3063\u3066\u307f\u3088\u3046(5) &#8211; Basic \u8a8d\u8a3c\u7de8 &#8211;<\/a><br \/>\n<a href=\"http:\/\/d.hatena.ne.jp\/winebarrel\/20100811\/p1\">REST API\u3067S3\u304b\u3089\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u53d6\u5f97\u3059\u308b<\/a><br \/>\n<a href=\"http:\/\/www.kmonos.net\/alang\/boost\/classes\/asio.html\">boost::asio<\/a><br \/>\n<a href=\"http:\/\/www.xmlconsortium.org\/wg\/web2.0\/teigensho\/4--REST-SOAP.html\">Web 2.0\u6642\u4ee3\u306eWebServices \uff5eSOAP\/REST\u4f7f\u3044\u5206\u3051\u306e\u6307\u91dd<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u2460\u30d0\u30b1\u30c4\u306e\u4e00\u89a7\u78ba\u8a8d \u2461\u30d0\u30b1\u30c4\u4f5c\u6210 \u2462\u6700\u5f8c\u306b\u30d0\u30b1\u30c4\u306e\u4e00\u89a7\u3092\u78ba\u8a8d \u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u3059\u3002\u51c4\u304f\u96d1\u3067\u3059\u3002 \u305d\u308c\u306b\u3057\u3066\u3082\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9\u304c\u5c11\u306a\u3044\u3002\u3002\u30c4\u30fc\u30eb\u3082\u5c11\u306a\u3044\u3002\u3002 LiteLanguage\u306b\u306fAmazonS3\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u304c\u6709\u308b\u3093\u3067 \u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49],"tags":[144,145],"class_list":["post-631","post","type-post","status-publish","format-standard","hentry","category-memo","tag-amazons3","tag-api"],"_links":{"self":[{"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/comments?post=631"}],"version-history":[{"count":18,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/posts\/631\/revisions"}],"predecessor-version":[{"id":1494,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/posts\/631\/revisions\/1494"}],"wp:attachment":[{"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/media?parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/helloidea.org\/index.php\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}