{"id":311,"date":"2015-08-06T01:21:58","date_gmt":"2015-08-05T16:21:58","guid":{"rendered":"http:\/\/blog.tkouen.mydns.jp\/wordpress\/?p=311"},"modified":"2017-08-21T00:28:29","modified_gmt":"2017-08-20T15:28:29","slug":"%e3%83%a1%e3%83%a2twitter-rest-api-%e3%81%ab%e3%82%88%e3%82%8b%e5%8b%95%e7%94%bb%e4%bb%98%e3%81%8d%e3%83%84%e3%82%a4%e3%83%bc%e3%83%88%e3%81%ae%e4%bb%95%e6%96%b9%e5%8b%95%e7%94%bb","status":"publish","type":"post","link":"https:\/\/devlog.nb3.jp\/wordpress\/311","title":{"rendered":"[\u30e1\u30e2]twitter REST API \u306b\u3088\u308b\u52d5\u753b\u4ed8\u304d\u30c4\u30a4\u30fc\u30c8\u306e\u4ed5\u65b9[\u52d5\u753b]"},"content":{"rendered":"<p>\u304a\u306f\u3053\u3093\u3070\u3093\u3061\u306f<br \/>\n\u3054\u7121\u6c99\u6c70\u3057\u3066\u304a\u308a\u307e\u3059\u3002<\/p>\n<p>twitter\u3067\u52d5\u753b\u306e\u30c4\u30a4\u30fc\u30c8\u3092\u898b\u304b\u3051\u3066\u306f\u3084\u6570\u304b\u6708\u30fb\u30fb\u30fb<br \/>\nAPI\u3067\u6295\u7a3f\u306f\u3067\u304d\u306a\u3044\u306e\u304b\u306a\u3041\uff5e\u3068\u4e45\u3057\u3076\u308a\u306bAPI\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u773a\u3081\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001\u9805\u76ee\u3068\u3057\u3066video\u306e\u6295\u7a3f\u304c\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u305f\u3068\u3044\u3046\u306e\u3092\u898b\u3064\u3051\u3066\u5b9f\u969b\u306b\u52d5\u753b\u6295\u7a3f\u3092\u884c\u3063\u3066\u307f\u307e\u3057\u305f\u3002<br \/>\n\u4ee5\u4e0b\u306e\u30a2\u30c9\u30ec\u30b9\u3067\u6295\u7a3f\u306e\u4ed5\u65b9\u3068\u304b\u3001\u52d5\u753b\u306e\u5f62\u5f0f\u3068\u304b\u30b5\u30a4\u30ba\u3068\u304b\u66f8\u304b\u308c\u3066\u3044\u308b\u306e\u3067\u898b\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p><a href=\"https:\/\/dev.twitter.com\/rest\/reference\/post\/media\/upload-chunked\" target=\"_blank\" rel=\"noopener\">https:\/\/dev.twitter.com\/rest\/reference\/post\/media\/upload-chunked<\/a><br \/>\n<a href=\"https:\/\/dev.twitter.com\/rest\/public\/uploading-media\" target=\"_blank\" rel=\"noopener\">https:\/\/dev.twitter.com\/rest\/public\/uploading-media<\/a><\/p>\n<p><!--more-->\u898b\u308b\u306e\u9762\u5012\u306a\u4eba\u7528\u306b\u4ee5\u4e0b<\/p>\n<table style=\"height: 312px;\" width=\"493\">\n<tbody>\n<tr>\n<td>\u52d5\u753b\u5f62\u5f0f<\/td>\n<td>mp4<\/td>\n<\/tr>\n<tr>\n<td>\u52d5\u753b\u306e\u5bb9\u91cf<\/td>\n<td>\u6700\u592715MB<\/td>\n<\/tr>\n<tr>\n<td>\u30a2\u30b9\u30da\u30af\u30c8\u6bd4<\/td>\n<td>1:3\uff5e3:1<br \/>\n\u203btwitter\u306e\u516c\u5f0f\u30a2\u30d7\u30ea\u3067\u306f\u305f\u3076\u3093640&#215;640<\/td>\n<\/tr>\n<tr>\n<td>\u52d5\u753b\u306e\u6642\u9593<\/td>\n<td>0.5\uff5e30\u79d2<\/td>\n<\/tr>\n<tr>\n<td>Video Bitrate<\/td>\n<td>2048K 1280&#215;780\u306e\u5834\u5408<\/td>\n<\/tr>\n<tr>\n<td>Audio Bitrate<\/td>\n<td>128K 1280&#215;780\u306e\u5834\u5408<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<pre>\/\/\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\r\n$url = &#039;https:\/\/upload.twitter.com\/1.1\/media\/upload.json&#039;;\r\n<\/pre>\n<p>\uff11\uff0eINIT post\u3059\u308b\u30c7\u30fc\u30bf\u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u3092\u9001\u308a\u305d\u306eid\u3092\u53d6\u5f97<\/p>\n<pre>\/\/\u52d5\u753b\u30d5\u30a1\u30a4\u30eb\r\n$video_file = &quot;\/tmp\/test.mp4&quot;;\r\n\/\/\u6295\u7a3f\u30c7\u30fc\u30bf command\u3001media_type\u3001total_bytes\r\n$post_data = array(\r\n  &#039;command&#039;=&gt;&#039;INIT&#039;,\r\n  &#039;media_type&#039; =&gt; &#039;video\/mp4&#039;,\/\/\u52d5\u753b\u306e\u5834\u5408video\/mp4\u56fa\u5b9a\uff08mp4\u306e\u307f\u5bfe\u5fdc\u306e\u70ba\uff09\r\n  &#039;total_bytes&#039; =&gt; filesize($video_file),\/\/\u52d5\u753b\u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\r\n);\r\n\/\/\u30c7\u30fc\u30bf\u3092POST\r\n$res = [twiter\u3078\u30c7\u30fc\u30bf\u3092POST];\r\n\/* \u8fd4\u308a\u5024\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306ajson\u5f62\u5f0f\u3067\u8fd4\u3055\u308c\u307e\u3059\u3002\r\n{\r\n  &quot;media_id&quot;: 601413451156586496,\r\n  &quot;media_id_string&quot;: &quot;601413451156586496&quot;,\r\n  &quot;expires_after_secs&quot;: 3599\r\n}\r\n*\/\r\n<\/pre>\n<p>\uff12\uff0eAPPEND post\u3059\u308b\u5b9f\u969b\u306e\u30c7\u30fc\u30bf\u3092\u9001\u308b<br \/>\n5MB\u4ee5\u4e0a15MB\u4ee5\u4e0b\u306e\u5834\u5408\u3001\u30c7\u30fc\u30bf\u30925MB\u305a\u3064\u9001\u4fe1\u3059\u308b<\/p>\n<pre>\/\/ \uff11\u3067\u53d6\u5f97\u3057\u305fmedia_id_string\u3092\u4f7f\u7528\r\n$res = json_decode($res, true);\r\n$media_id_string = $res[&#039;media_id_string&#039;];\r\n\/\/ \u52d5\u753b\u30d5\u30a1\u30a4\u30eb\u306e\u30c7\u30fc\u30bf\u3092\u8aad\u307f\u8fbc\u3080\r\n$file_data = file_get_contents($video_file);\r\n\/\/ 5MB\u4ee5\u4e0a\u306e\u5834\u5408\u3053\u306e\u5024\u304cPOST\u3059\u308b\u5ea6\u5897\u52a0\r\n$segment_index = 0;\r\n\/\/ \u8aad\u307f\u8fbc\u3093\u3060\u30c7\u30fc\u30bf\u306e\u9577\u3055\r\n$len = strlen($file_data);\r\n\/\/ \u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u3092\u5206\u5272\u3059\u308b\u30b5\u30a4\u30ba\r\n$chank = 5 * 1024 * 1024;\r\n\r\n\/\/ $file_data\u304c\u306a\u304f\u306a\u308b\u307e\u3067\u56de\u3059\r\nwhile(strlen($file_data) &gt; 0){\r\n  if($len\/$chank&gt;0){\r\n    $buf = substr($file_data, 0,$chank);\r\n    $file_data = substr($file_data, $chank);\r\n    $len = $len - $chank;\r\n  } else {\r\n    $buf = $file_data;\r\n    $file_data = &quot;&quot;;\r\n    $len = 0;\r\n  }\r\n  \/\/POST\u30c7\u30fc\u30bf\u4f5c\u6210\r\n  $post_data = array(\r\n      &#039;command&#039;=&gt;&#039;APPEND&#039;,\r\n      &#039;media_data&#039; =&gt; base64_encode($buf),\r\n      &#039;media_id&#039; =&gt; $media_id_string,\r\n      &#039;segment_index&#039; =&gt; $segment_index,\r\n  );\r\n  $res =  [twiter\u3078\u30c7\u30fc\u30bf\u3092POST];\r\n  $res = json_decode($res, true);\r\n  \/\/ \u30a8\u30e9\u30fc\u306e\u5834\u5408\u51e6\u7406\u7d42\u4e86\uff08\u6210\u529f\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u306a\u306b\u3082\u8fd4\u308a\u5024\u304c\u306a\u3044\uff09\r\n  if (isset($res[&#039;errors&#039;])) {\r\n    exit;\r\n  }\r\n  $segment_index++;\r\n}\r\n<\/pre>\n<p>\uff13\uff0eFINALIZE post\u3057\u305f\u5b9f\u969b\u306e\u30c7\u30fc\u30bf\u304c\u7d42\u308f\u3063\u305f\u3053\u3068\u3092\u4f1d\u3048\u308b<\/p>\n<pre>$post_data = array(\r\n  &#039;command&#039;=&gt;&#039;FINALIZE&#039;,\r\n  &#039;media_id&#039; =&gt; $media_id_string,\r\n);\r\n$res = [twiter\u3078\u30c7\u30fc\u30bf\u3092POST];\r\n$res = json_decode($res, true);\r\n\/* \u6210\u529f\u3057\u305f\u5834\u5408\u3001\u4ee5\u4e0b\u306e\u69d8\u306a\u5185\u5bb9\u306ejson\u304c\u8fd4\u3063\u3066\u304d\u307e\u3059\u3002\r\n{\r\n  &quot;media_id&quot;:628618021481787392,\r\n  &quot;media_id_string&quot;:&quot;628618021481787392&quot;,\r\n  &quot;size&quot;:4583156,\r\n  &quot;expires_after_secs&quot;:3600,\r\n  &quot;video&quot;:{\r\n    &quot;video_type&quot;:&quot;video\\\/mp4&quot;\r\n  }\r\n}\r\n*\/\r\n<\/pre>\n<p>\uff14\uff0emedia_ids\u4ed8\u3067\u30c4\u30a4\u30fc\u30c8<\/p>\n<pre>$url = &quot;https:\/\/api.twitter.com\/1.1\/statuses\/update.json&quot;;\r\n$dat = array(\r\n  &#039;status&#039;  =&gt; [\u30c4\u30a4\u30fc\u30c8\u5185\u5bb9],\r\n  &#039;media_ids&#039; =&gt; $media_id_string,\r\n);\r\n$res = [twiter\u3078\u30c7\u30fc\u30bf\u3092POST];\r\n$res = json_decode($res, true);\r\n<\/pre>\n<p>\u203b\u6210\u529f\u3059\u308c\u3070\u30c4\u30a4\u30fc\u30c8\u5185\u5bb9\u304c\u8fd4\u3063\u3066\u6765\u307e\u3059\u3002<\/p>\n<p>\u4ee5\u4e0a\u3067\u52d5\u753b\u306e\u6295\u7a3f\u304c\u4e00\u5fdc\u51fa\u6765\u307e\u3057\u305f\u3002<\/p>\n<p>\u203b\u672c\u5f53\u306f\u30d0\u30a4\u30ca\u30ea\u3067\u30c7\u30fc\u30bf\u3092\u305d\u306e\u307e\u307e\u9001\u308a\u305f\u3044\u306e\u3060\u304c\u3001\u30d0\u30a4\u30ca\u30ea\u3092\u305d\u306e\u307e\u307e\u304a\u304f\u308b\u3068\u30af\u30b8\u30e9\u7684\u306a\u30a8\u30e9\u30fc\u304c\u8fd4\u3063\u3066\u304d\u3066\u3057\u307e\u3046\u59cb\u672b\u30fb\u30fb\u30fb<\/p>\n<p>\u3075\u3045\uff5e\u306a\u304b\u306a\u304b\u4eca\u56de\u306f\u75b2\u308c\u307e\u3057\u305f\u3001\u3001<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u304a\u306f\u3053\u3093\u3070\u3093\u3061\u306f \u3054\u7121\u6c99\u6c70\u3057\u3066\u304a\u308a\u307e\u3059\u3002 twitter\u3067\u52d5\u753b\u306e\u30c4\u30a4\u30fc\u30c8\u3092\u898b\u304b\u3051\u3066\u306f\u3084\u6570\u304b\u6708\u30fb\u30fb\u30fb API\u3067\u6295\u7a3f\u306f\u3067\u304d\u306a\u3044\u306e\u304b\u306a\u3041\uff5e\u3068\u4e45\u3057\u3076\u308a\u306bAPI\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u773a\u3081\u3066\u307f\u307e\u3057\u305f\u3002 \u3068\u308a\u3042\u3048\u305a\u3001\u9805\u76ee\u3068\u3057\u3066video\u306e\u6295 &hellip; <a href=\"https:\/\/devlog.nb3.jp\/wordpress\/311\">\u7d9a\u304d\u3092\u8aad\u3080 <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69,28],"tags":[61,27,107,70,110,109,104,105],"class_list":["post-311","post","type-post","status-publish","format-standard","hentry","category-twitter","category-28","tag-api","tag-memo","tag-rest","tag-rest-api","tag-twitter","tag-109","tag-104","tag-105"],"_links":{"self":[{"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/posts\/311","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/comments?post=311"}],"version-history":[{"count":0,"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/posts\/311\/revisions"}],"wp:attachment":[{"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/media?parent=311"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/categories?post=311"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devlog.nb3.jp\/wordpress\/wp-json\/wp\/v2\/tags?post=311"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}