IT omoe

ITのこと知らないんですけどIT関連のことを気ままに綴ります

映像撮影のいろいろ

先日,とあるご縁で映像(割りとガチめなやつ)の撮影に協力(出演)させていただくことになり,なかなかない経験だったので色々面白かったことを書き留めておきたいと思います.半分くらい私の勝手な推測で書いてますのでその辺ご了承ください.

事前準備

事前にメールが来て当日の服装のあれこれを指定されました.(基本的に映るのは上半身)

  • 細かいチェックやストライプは映像に影響する可能性があるのでNG.
  • 上半身全体が黒いと顔の雰囲気が暗くなるのでNG.一部明るい色があればOK.
  • 上半身上半身全体が白いと,顔と服の絞りのバランスが難しいのでNG.

おそらく細かいチェックやストライプがNGなのは色にじみとかを起こすからだと思います.

f:id:ottosan84:20160227221452j:plain

例えばこういうやつですね.30という数字の周りに虹色のモヤッとしたやつがあります.これが色にじみです.多分.

上記の項目以外にも今回の映像のコンセプトに合わせた服装の制限がありました.

  • ニットやブーツなどの冬を感じさせるものはNG.
  • カジュアルな格好.

推測するに,作った映像は年中使いたいので冬を感じさせるものはNGなのでしょう.後はまあ,学生っぽくカジュアルにってことじゃないですかね(適当)

撮影場所の吟味

いよいよ撮影当日.一応建物のところでの撮影でしたが,屋内か屋外かというと屋外でした.実際にカメラを構えたりして撮影する場所を吟味しておられました.

セッティング

場所が決まったらカメラのセッティング.私は撮影場所を吟味されているときから寒さをしのぐために室内にいたので私の座るところに代わりの人が座って角度とかを調節されてました.多分.

撮影

いよいよ撮影です.実際に私が座って声を出して,光や音声の調節をされてました.レフ板は基本的に光の調節をするのに使うイメージですが,その日は結構風が吹いていて,マイクを風から守り,風の「ボボボボボ」という音を防ぐためにもレフ板を使っておられました.

撮影中も日差しの加減や周りの音(救急車のサイレン,ヒールで歩く音)など常に変化する環境に注意を向けておられたのが印象的でした.

さいごに

そんなこんなでたった30秒の映像撮るだけでもいろいろ大変なのだな〜って感じましたはい.おそらく一番気を遣っておられたであろう被写体の話に触れなかったのはたまたまじゃないです()まあ,始めの方に書いたように冬を感じさせるものはダメなのでコートとか普通に着れなくて普通に凍えてた話くらいはしときますか.

とりあえず他にも何人かの撮影があったみたいなので全体の完成が楽しみですね.

Rubyで天気予報の取得と画像のツイート

前回,前々回に引き続き,Twitter botの拡張をしていきます.わーい.

ottosan84.hatenablog.com

ottosan84.hatenablog.com

天気予報の取得とツイート

今回はbotのTL上で #お嬢天気予報 というハッシュタグをつけてつぶやいた人に対して,天気予報を送りつけるという機能を作ってみますた.

天気予報の取得

これも色々とやり方があると思いますが,今回はライブドア天気情報「Weather Hacks」の結果を利用します.例えば,滋賀県大津の天気の取得はこんな感じ.

require 'net/http'
require 'uri'
require 'json'

uri = URI.parse('http://weather.livedoor.com/forecast/webservice/json/v1?city=250010')
json = Net::HTTP.get(uri)
result = JSON.parse(json)
p result

city=の後のIDを変えてやることで,様々な地域の天気予報を取得することができます.これを実行すると,

{
"pinpointLocations"=>
[{
    "link"=>"http://weather.livedoor.com/area/forecast/2520101", 
    "name"=>"大津市南部"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2520400",
    "name"=>"近江八幡市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2520600",
    "name"=>"草津市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2520700",
    "name"=>"守山市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2520800",
    "name"=>"栗東市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2520900",
    "name"=>"甲賀市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2521000",
    "name"=>"野洲市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2521100",
    "name"=>"湖南市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2521300",
    "name"=>"東近江市"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2538300",
    "name"=>"日野町"
 },{
    "link"=>"http://weather.livedoor.com/area/forecast/2538400",
    "name"=>"竜王町"
 }], 
"link"=>"http://weather.livedoor.com/area/forecast/250010",
"forecasts"=>
[{
    "dateLabel"=>"今日",
    "telop"=>"晴時々曇",
    "date"=>"2016-02-21",
    "temperature"=>{
        "min"=>nil,
        "max"=>{"celsius"=>"10", "fahrenheit"=>"50.0"}
    },
    "image"=>{
        "width"=>50,
        "url"=>"http://weather.livedoor.com/img/icon/2.gif",
        "title"=>"晴時々曇",
        "height"=>31
        }
 },{
    "dateLabel"=>"明日",
    "telop"=>"晴のち曇",
    "date"=>"2016-02-22",
    "temperature"=>{
        "min"=>{"celsius"=>"2", "fahrenheit"=>"35.6"},
        "max"=>{"celsius"=>"9", "fahrenheit"=>"48.2"}},
    "image"=>{
        "width"=>50,
        "url"=>"http://weather.livedoor.com/img/icon/5.gif",
        "title"=>"晴のち曇",
        "height"=>31
        }
},{
    "dateLabel"=>"明後日",
    "telop"=>"曇のち雨",
    "date"=>"2016-02-23",
    "temperature"=>{
        "min"=>nil,
        "max"=>nil
    },
    "image"=>{
        "width"=>50,
        "url"=>"http://weather.livedoor.com/img/icon/13.gif",
        "title"=>"曇のち雨",
        "height"=>31
    }
}], 
"location"=>{
    "city"=>"大津",
    "area"=>"近畿",
    "prefecture"=>"滋賀県"
},
"publicTime"=>"2016-02-21T11:00:00+0900",
"copyright"=>{
    "provider"=>[{
        "link"=>"http://tenki.jp/",
        "name"=>"日本気象協会"
    }],
    "link"=>"http://weather.livedoor.com/",
    "title"=>"(C) LINE Corporation",
    "image"=>{
        "width"=>118,
        "link"=>"http://weather.livedoor.com/",
        "url"=>"http://weather.livedoor.com/img/cmn/livedoor.gif",
        "title"=>"livedoor 天気情報",
        "height"=>26
    }
},
"title"=>"滋賀県 大津 の天気",
"description"=>{
    "text"=>"近畿地方は、寒気の影響で北部を中心に雲が広がり、雨や雪の降っているところがあります。
            今日の滋賀県は、冬型の気圧配置となり北部を中心に雲が広がりやすく、夕方まで雪や雨の降るところがある見込みです。
            明日の滋賀県は、高気圧に覆われて概ね晴れますが、午後は気圧の谷の影響で次第に雲が広がるでしょう。",
    "publicTime"=>"2016-02-21T10:34:00+0900"
    }
}

こんな感じの結果が返ってきます.この中の,今日の天気や明日の天気の情報を利用していきたいと思います.

取得結果のツイート

天気予報が取得できたら,後はこの結果を表示したい形にしてツイートしてやるだけです.

require 'twitter'
require 'net/http'
require 'uri'
require 'json'

client_streaming = Twitter::Streaming::Client.new do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.access_token = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_TOKEN_SECRET"
end

client_rest = Twitter::REST::Client.new do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.access_token = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_TOKEN_SECRET"
end

USERNAME = "ottosan884_bot"
client_streaming.user do |object|
  case object
  when Twitter::Tweet
    username = object.user.screen_name # ユーザー名
    tweet = object.text                # ツイート内容
    tweet_id = object.id               # ツイートのID
    option = {:in_reply_to_status_id => tweet_id}
    if (!tweet.index("RT")) && (username != USERNAME)
      if (/#お嬢天気予報/ =~ tweet)
        puts username + ':' + tweet
        uri = URI.parse('http://weather.livedoor.com/forecast/webservice/json/v1?city=250010')
        json = Net::HTTP.get(uri)
        result = JSON.parse(json)
        today_tel = result['forecasts'][0]['telop'] #今日の天気
        tomor_tel = result['forecasts'][1]['telop'] #明日の天気
        min_tem = result['forecasts'][1]['temperature']['min']['celsius'] #明日の最低気温
        max_tem = result['forecasts'][1]['temperature']['max']['celsius'] #明日の最高気温
        client_rest.update("@#{username} #{result['title']}\n#{result['link']}\n予報の発表日時: #{result['publicTime']}\n今日: #{today_tel}\n明日: #{tomor_tel} 最低#{min_tem}度 最高#{max_tem}度\n#お嬢天気予報", option) 
# つづく

って感じです.

煽り画像を送りつける

画像のツイートはとても簡単ですが一応書き留めときます. 今回はお嬢botのTL上で #お嬢の煽り というタグをつけてつぶやかれたツイートに煽り画像を送りつけるという仕様です. まず送りつけたい画像を用意します.ディレクトリの中はこんな感じ. f:id:ottosan84:20160225155737p:plain

autorep.rbってのの中身はこんな感じ.上記の天気予報のプログラムの続きになってます.

#つづき
    elsif (/#お嬢の煽り/ =~ tweet)
        puts username + ':' + tweet
        files = Dir.glob("aori*")
        pic_id = client_rest.upload(File.new(files.sample))
        option = {
          :in_reply_to_status_id => tweet_id,
          :media_ids => pic_id
        }
        client_rest.update('@'+username+' #お嬢の煽り', option)
      end
    end
  end
end

Dir.glob()はカッコ内の条件に該当するファイル名を文字列の配列として返します.該当ファイルがない場合は空の配列を返します.今回,画像には全てaoriという文字列が含まれるようにしたので"aori*"(*は空文字列を含む任意の文字列)で全ての画像のファイル名がfilesという配列に格納されます.

後はuploadして得られたIDをoptionに加えてやれば画像をツイートすることができます.めでたしめでたし.

今後の展開

mcg.hateblo.jp

なんか天気予報もっと簡単に出来んじゃねえのって煽られてる()ので暇があればやってみたいな〜.とりあえずTwitter botシリーズはここで一旦キリを付けたいと思います. Gitにコードうpしました.-> https://github.com/ottosan/ojobot

RubyでTwitterのbot化, 自動ふぁぼ, 自動リプ

前回の内容に引き続き,Twitterbotを拡張していきます. ottosan84.hatenablog.com

とりあえずbot

前回のはただ単に実行したら1回ツイートするだけのものだったで,自動的につぶやいてくれるbotにしていきます.

色々やり方はあると思いますが今回はsleep関数を活用した方法でやっていきたいと思います.

require "twitter"

#この辺の詳しいことは前回の記事へ--------------------------
client = Twitter::REST::Client.new do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.access_token = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_TOKEN_SECRET"
end
#-----------------------------------------------------

  loop do
    File.open("tweets.txt", "r") do |bot|
      @bots = bot.read.split("\n")
    end
    tweet = @bots.sample
    sleep_time = 60 + rand(3600)
    t = Time.now
    puts "#{tweet} (#{t}) next (#{t + sleep_time})"

    client.update tweet

    sleep sleep_time
  end

全体のコードはこんな感じです. ちょっと詳しく見て行きませう.

テキストファイルからツイートを決定

    File.open("tweets.txt", "r") do |bot|
      @bots = bot.read.split("\n")
    end
    tweet = @bots.sample

この部分ですね.予めtweets.txtbotにつぶやかせたいことを書いておきます.こんな感じです.内容は突っ込まないでください. f:id:ottosan84:20160218094906p:plain

splitは与えた条件でデータを区切って配列に入れてくれます.sampleでランダムにその中から一つ選びます.

sleep関数で時間をあけてツイート

    sleep_time = 60 + rand(3600)
    t = Time.now
    puts "#{tweet} (#{t}) next (#{t + sleep_time})"

    client.update tweet

    sleep sleep_time

sleepは与えた秒数分だけプログラムの実行を停止させてくれます.今回はツイートする感覚もランダムにしたかったのでrand関数を使って1分〜1時間(60秒〜3600秒)の間隔でツイートするようにしました.

これらを無限ループで繰り返すことでbotの完成です.ファイル処理はloopの外でも良かったのですが.いちいちプログラムを止めなくてもテキストファイルを編集するだけでbotのツイートパターンを追加・削除できるようにループの中に入れました.

後,同じ内容のツイートを連続してするとツイートが反映されないことがあるのでその点は注意です.できだけたくさんのパターンを作っておきましょう.

自動ふぁぼ(いいね)

個人的にまだ「ふぁぼ」という言い方のほうがしっくり来るのですが,「いいね」に名前が変わった今では自動ふぁぼじゃなくて自動いいねの方が正しいのでしょうか...なんて話は置いといて

とりあえず全体のコード.自分のTL上にある「お嬢」というワードが含まれるツイートをふぁぼ...じゃなくていいねします.

require "twitter"

client_streaming = Twitter::Streaming::Client.new do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.access_token = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_TOKEN_SECRET"
end

client_rest = Twitter::REST::Client.new do |config|
  config.consumer_key = "YOUR_CONSUMER_KEY"
  config.consumer_secret = "YOUR_CONSUMER_SECRET"
  config.access_token = "YOUR_ACCESS_TOKEN"
  config.access_token_secret = "YOUR_TOKEN_SECRET"
end

USERNAME = "ottosan884" #自分のユーザー名(@以下のやつ)

client_streaming.user do |object|
  case object
  when Twitter::Tweet
    if (/お嬢/ =~ object.text) && (object.user.screen_name != USERNAME)
      puts object.user.screen_name + ':' + object.text
      client_rest.favorite(object.id)
    end
  end
end

今回,タイムラインを取得するためにStreamingというTwitterAPIを使います.このAPIは新しいツイートを受信し続けることができます.今まで使っていたRESTと同じように,コンシューマキーとかを渡してやることで使えます.

object.user.screen_name != USERNAME で自分のツイートは除きます.favoriteにツイートのIDを与えるとそのツイートがいいねされます.ここで簡単に取得できるデータの説明をします.

  • .text....ツイートの内容を取得.
  • .id...ツイートのIDを取得.
  • .user.name...ツイートをしたアカウントのアカウント名を取得.
  • .user.screen_name...ツイートをしたアカウントのユーザー名を取得.

このコードで使ってないのもありますが後で使うのでまとめてここに書いておきます.他にも取得できるデータはありますがまあ今回はこのくらいで.以上が自動いいねでした.はい.

自動リプ

USERNAME = "ottosan884_bot"

client_streaming.user do |object|
  case object
  when Twitter::Tweet
    #取得した必要なデータを変数に格納
    username = object.user.screen_name
    name = object.user.name
    tweet = object.text
    tweet_id = object.id

   if (/@ottosan884_bot/ =~ tweet) && (username != USERNAME) && (!tweet.index("RT")) #自分のツイートとRTは除く 
    puts username + ':' + tweet
    File.open("replies.txt", "r") do |reply|
      @rere = reply.read.split("\n")
    end
    re = @rere.sample
    if (re =~ /さん/)
      repl = name + re
    else
      repl = re
    end
   end
   puts ' >' + repl
   client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})

  end
end

全体のコードはこんな感じ.APIのとこは省略しました.replies.txtの内容はこんな感じ. f:id:ottosan84:20160218150119p:plain

文頭に「さん」がついていたらリプを送ってきたアカウントの名前を最初にくっつける仕様です.

リプの仕方

自動リプの最大のポイント.

client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})

この部分ですね.最初,ユーザー名をリプの最初につけるだけで終わっていたのですが,これでは新規リプを投げてるだけでした.:in_reply_to_status_idというオプションを使うことでツイートに対するリプを送ることができます.

f:id:ottosan84:20160218154813p:plain

こんな感じ.他にも色々なオプションがあり,これらを使うことで画像をつけてツイートしたり,位置情報をつけたりすることができます.詳しくはこちらのupdateのところを見てみてください.

今後の展開

今後というか,天気予報とか煽り画像を送りつけるコードも書いたので,まあ後々うpしていきたいと思います.今回はこの辺で.

Rubyでツイートしてみた

Rubyを始めて約一週間...なにかこう,実用的(?)なことをしてみたくてRubyでツイートが簡単にできると聞いたのでしてみることにしました.

環境

1. コンシューマ登録

Twitterのサービスプロバイダーにコンシューマ(アプリケーション)を登録します. こちらからできます.つぶやきたいアカウントでログインするとこんな感じの画面になります.f:id:ottosan84:20160206114941p:plain

登録ができたらこんな感じになります. f:id:ottosan84:20160206115203p:plain
めっちゃ適当."OjoBot"がさっき登録したアプリケーションの名前ですね.これの"Keys and Access Tokens"のところに

  • Consumer Key (API Key)
  • Consumer Secret (API Secret)

ってのがあって,これらがアプリケーションを使うのに必要になってくるので後で見れるようにしておきます.

2. アクセストークン発行

Twitterの各種リソースにアクセスするためのアクセストークンというのを発行してもらいます.先ほどの"Keys and Access Tokens"の下の方に"Create my access token"とかいうボタンが有ると思うのでそこをポチッとな.すると

ってのが出現します.こいつらも後で使うので見れるようにしておきます. あ,後Permmisionが"Read and Write"になっているか要確認. f:id:ottosan84:20160207161819p:plain
こうなってたらおk.

3. twitterをインストール

gemでtwitterをインストールします.ターミナルで
gem install twitter
を実行.現時点での最新版は5.16.0.(詳しくは->twitter)

4. Ruby実装

わーい!やっとコーディングするお!

require "twitter"
client = Twitter::REST::Client.new do |config|
  config.consumer_key = "自分のConsumer Keyをコピペ"
  config.consumer_secret = "自分のConsumer Secretをコピペ"
  config.access_token = "自分のAccess Tokenをコピペ"
  config.access_token_secret = "自分のAccess Token Secretをコピペ"
end
client.update("test from OjoBot") #つぶやきたいことを適当に    

これを
ruby [ファイル名].rb
って感じで実行してやるとツイートできます.
f:id:ottosan84:20160207163204p:plain
じゃじゃ〜ん!!ちゃんとクライアントがOjoBotになってます✨👏

今後の展望

展望というほどではないですが,このままだとツイート出来るだけでbotになってないので次はこれをbot化していったり,他にも面白いのがあったら適当に発展させていきたいです.

お嬢だぉ〜(テスト投稿)

はじめまして

こんにちは.お嬢です.
ノリでブログ始めちゃいました.
イマイチはてブロの使い方わかってないですので変なとこあったら指摘とかドシドシしちゃってください.(内容に関しても)

自己紹介

某R大学の学生やってます.
情報系ですがぱそこんとかわからないです.
以上

このブログについて

自分が日々体験したことやったことでTwitterとかFacebookじゃ書ききれねえよっ!って感じのことを気まぐれに共有していきたいと思います.
ということでよろしくお願いしますm(__)m