[メモ]twitter REST API による動画付きツイートの仕方[動画]

おはこんばんちは
ご無沙汰しております。

twitterで動画のツイートを見かけてはや数か月・・・
APIで投稿はできないのかなぁ~と久しぶりにAPIのドキュメントを眺めてみました。

とりあえず、項目としてvideoの投稿ができるようになったというのを見つけて実際に動画投稿を行ってみました。
以下のアドレスで投稿の仕方とか、動画の形式とかサイズとか書かれているので見てみてください。

https://dev.twitter.com/rest/reference/post/media/upload-chunked
https://dev.twitter.com/rest/public/uploading-media

見るの面倒な人用に以下

動画形式 mp4
動画の容量 最大15MB
アスペクト比 1:3~3:1
※twitterの公式アプリではたぶん640×640
動画の時間 0.5~30秒
Video Bitrate 2048K 1280×780の場合
Audio Bitrate 128K 1280×780の場合
//エンドポイント
$url = 'https://upload.twitter.com/1.1/media/upload.json';

1.INIT postするデータのファイルサイズを送りそのidを取得

//動画ファイル
$video_file = "/tmp/test.mp4";
//投稿データ command、media_type、total_bytes
$post_data = array(
  'command'=>'INIT',
  'media_type' => 'video/mp4',//動画の場合video/mp4固定(mp4のみ対応の為)
  'total_bytes' => filesize($video_file),//動画のファイルサイズ
);
//データをPOST
$res = [twiterへデータをPOST];
/* 返り値は以下のようなjson形式で返されます。
{
  "media_id": 601413451156586496,
  "media_id_string": "601413451156586496",
  "expires_after_secs": 3599
}
*/

2.APPEND postする実際のデータを送る
5MB以上15MB以下の場合、データを5MBずつ送信する

// 1で取得したmedia_id_stringを使用
$res = json_decode($res, true);
$media_id_string = $res['media_id_string'];
// 動画ファイルのデータを読み込む
$file_data = file_get_contents($video_file);
// 5MB以上の場合この値がPOSTする度増加
$segment_index = 0;
// 読み込んだデータの長さ
$len = strlen($file_data);
// ファイルサイズを分割するサイズ
$chank = 5 * 1024 * 1024;

// $file_dataがなくなるまで回す
while(strlen($file_data) > 0){
  if($len/$chank>0){
    $buf = substr($file_data, 0,$chank);
    $file_data = substr($file_data, $chank);
    $len = $len - $chank;
  } else {
    $buf = $file_data;
    $file_data = "";
    $len = 0;
  }
  //POSTデータ作成
  $post_data = array(
      'command'=>'APPEND',
      'media_data' => base64_encode($buf),
      'media_id' => $media_id_string,
      'segment_index' => $segment_index,
  );
  $res =  [twiterへデータをPOST];
  $res = json_decode($res, true);
  // エラーの場合処理終了(成功している場合はなにも返り値がない)
  if (isset($res['errors'])) {
    exit;
  }
  $segment_index++;
}

3.FINALIZE postした実際のデータが終わったことを伝える

$post_data = array(
  'command'=>'FINALIZE',
  'media_id' => $media_id_string,
);
$res = [twiterへデータをPOST];
$res = json_decode($res, true);
/* 成功した場合、以下の様な内容のjsonが返ってきます。
{
  "media_id":628618021481787392,
  "media_id_string":"628618021481787392",
  "size":4583156,
  "expires_after_secs":3600,
  "video":{
    "video_type":"video\/mp4"
  }
}
*/

4.media_ids付でツイート

$url = "https://api.twitter.com/1.1/statuses/update.json";
$dat = array(
  'status'  => [ツイート内容],
  'media_ids' => $media_id_string,
);
$res = [twiterへデータをPOST];
$res = json_decode($res, true);

※成功すればツイート内容が返って来ます。

以上で動画の投稿が一応出来ました。

※本当はバイナリでデータをそのまま送りたいのだが、バイナリをそのままおくるとクジラ的なエラーが返ってきてしまう始末・・・

ふぅ~なかなか今回は疲れました、、

スポンサーリンク

[メモ]プログラムによるinstagramへの写真投稿[API]

久しぶりの投稿です・・・

instagramに写真をuploadさせるやり方をグーグル先生に聞いて回ったところ

プログラムで投稿している人が居るではないですか!

その人のプログラムは基本的に、instagramのアカウントを持っていないと投稿することが出来ないみたいです。(なんでもそうか・・、※プログラム自体にIDとパスワードが必要になる感じなのがちょっといただけない感じです。本来であれば、アクセストークンなどを使用してuploadできるのが望ましいんですが・・)

投稿する画像のサイズは良く分からないですが、正方形でないとエラーになるようです。(他のブログを読んでいると縦横640px、サイズ500k以内的なことも書かれていた)

比率がおかしい場合のエラー時の戻り値

Array
(
    [0] => 400
    [1] => {"status":"fail","message":"Uploaded image isn't square"}
)

成功時の戻り値

Array
(
    [0] => 200
    [1] => {"status":"ok","media_id":"987765809705141669_15359112"}
)

尚、APIとしてのinstagramからの提供はないみたいですので、いつ変更されるかわからない感じです。

※instagramのデベロッパーサイト
https://instagram.com/developer/clients/manage/

※今回見つけたサイト
http://stackoverflow.com/questions/18844706/how-to-post-pictures-to-instagram-using-api
↑からの本家http://lancenewman.me/posting-a-photo-to-instagram-without-a-phone/

元記事のソースをそのまま(少しは修正)使用するだけで投稿は出来ました。

感想としては、上記投稿と他API提供されている機能などを盛り込みつつ自分なりのアプリを作ると面白いかもしれません。

最後に要注意なのは、上記プログラムから投稿するのはいいが、削除はスマートフォンのアプリからしか現在削除できないこと。
なのでこのプログラムを試す前には、アプリとID、パスワードをしっかり紐付け&メモしておく必要があるかと思います。

スポンサーリンク

[メモ]apache2.4 crtの設定[覚書]

ご無沙汰してます

今日、はまったことをメモ

COMODOのPositiveSSLワイルドカードを手に入れ、設定し「いやっほーい!」とか思っていたら・・・
※PCではちゃんとバッチグーでした。

スマートフォンでは危険のあるサイトだから危ないよってブラウザに言われていた・・・
1週間近く放置してたorz

で、何で??って思って調べたら・・・

中間CAとか設定してないとだめなのねorz

で次に、調べていくとapache2.2とかだと、
「SSLCertificateFile」とは別に、「SSLCertificateChainFile」 に中間CAとかを1ファイルに書き込み設定する

apache2.4だと「SSLCertificateChainFile」がなくなったらしく、「SSLCertificateFile」にもろもろのcrtファイルを1ファイルに書き込み設定する必要があった。

そういえば書き込む順番とか在ったのかな・・・

今回は適当に、以下のように書き込んで行った。

SSLにしたドメインのcrt

COMODO RSA Domain Validation Secure Server CA

COMODO RSA Certification Authority

ルート

※sslの購入先はssl-storeのCOMODOのPositiveSSLワイルドカード

とりあえず、何事も経験だな・・

スポンサーリンク

[mongo]配列カラム内の連想配列の複数条件一致検索

はまったのでメモ

[{
id:1,
name:"A class",
array_data:[
    {age:17, sex:"f", height:160, wight:40},
    {age:18, sex:"f", height:150, wight:35},
    {age:19, sex:"f", height:170, wight:45}
  ]
},
{
id:2,
name:"B class",
array_data:[
    {age:17, sex:"m", height:160, wight:50},
    {age:18, sex:"m", height:150, wight:55},
    {age:19, sex:"m", height:170, wight:65}
  ]
}
]

上記のようなデータが存在した場合に
array_dataカラムの配列中にage=18 且つ sex=”m”のある行のデータだけ
取得したい場合の書き方を下記に記述します。

db.hoge.find({
  "array_data.age":18,
  "array_data.sex":"m",
  $where: function(){
    var arr = this.array_data;
    for (var i in arr) {
      if (arr[i].age==18 && arr[i].sex == "m"){
        return true;
      }
    }
   return false;
  }
});

結果はid:2の行のみを取得できます。
※$whereのスクリプトを書かないとid:1も対象として取得されます。

また、phpでも上記$where部分を書けば思った通りのデータ行が取得できます。
更にarray_data内の該当行のみを取得する場合は、
プログラムで該当の連想配列行を取得する必要があります。

記憶を辿り書いてしまっているので誤って書いている部分があるかもしれまん、、

スポンサーリンク

[メモ]firefoxのメモリバカ食い[おまじない]

Firefox34にしてからメモリがバカ食いして、既に開いていたタブを表示しようとしたときにハングし、別windowに分離してしまうなどということが発生しまくっていました。

そこで、gigazinさんの記事を見つけ、以下の事がかかれていました。

1. アドレスバーに「about:config」と入力してEnterキーを押す
2. 開いたページ上で右クリックして「新規作成」→「Boolean」をクリック
3. 設定名を「config.trim_on_minimize」として「OK」をクリック
4. 真偽値として「true」を入力して「OK」をクリック
5. Mozillaを再起動する

今のところ、メモリのバカ食いはないみたいですので、メモメモと・・・

スポンサーリンク