映像撮影のいろいろ
先日,とあるご縁で映像(割りとガチめなやつ)の撮影に協力(出演)させていただくことになり,なかなかない経験だったので色々面白かったことを書き留めておきたいと思います.半分くらい私の勝手な推測で書いてますのでその辺ご了承ください.
事前準備
事前にメールが来て当日の服装のあれこれを指定されました.(基本的に映るのは上半身)
- 細かいチェックやストライプは映像に影響する可能性があるのでNG.
- 上半身全体が黒いと顔の雰囲気が暗くなるのでNG.一部明るい色があればOK.
- 上半身上半身全体が白いと,顔と服の絞りのバランスが難しいのでNG.
おそらく細かいチェックやストライプがNGなのは色にじみとかを起こすからだと思います.
例えばこういうやつですね.30という数字の周りに虹色のモヤッとしたやつがあります.これが色にじみです.多分.
上記の項目以外にも今回の映像のコンセプトに合わせた服装の制限がありました.
- ニットやブーツなどの冬を感じさせるものはNG.
- カジュアルな格好.
推測するに,作った映像は年中使いたいので冬を感じさせるものはNGなのでしょう.後はまあ,学生っぽくカジュアルにってことじゃないですかね(適当)
撮影場所の吟味
いよいよ撮影当日.一応建物のところでの撮影でしたが,屋内か屋外かというと屋外でした.実際にカメラを構えたりして撮影する場所を吟味しておられました.
セッティング
場所が決まったらカメラのセッティング.私は撮影場所を吟味されているときから寒さをしのぐために室内にいたので私の座るところに代わりの人が座って角度とかを調節されてました.多分.
撮影
いよいよ撮影です.実際に私が座って声を出して,光や音声の調節をされてました.レフ板は基本的に光の調節をするのに使うイメージですが,その日は結構風が吹いていて,マイクを風から守り,風の「ボボボボボ」という音を防ぐためにもレフ板を使っておられました.
撮影中も日差しの加減や周りの音(救急車のサイレン,ヒールで歩く音)など常に変化する環境に注意を向けておられたのが印象的でした.
さいごに
そんなこんなでたった30秒の映像撮るだけでもいろいろ大変なのだな〜って感じましたはい.おそらく一番気を遣っておられたであろう被写体の話に触れなかったのはたまたまじゃないです()まあ,始めの方に書いたように冬を感じさせるものはダメなのでコートとか普通に着れなくて普通に凍えてた話くらいはしときますか.
とりあえず他にも何人かの撮影があったみたいなので全体の完成が楽しみですね.
Rubyで天気予報の取得と画像のツイート
前回,前々回に引き続き,Twitter botの拡張をしていきます.わーい.
天気予報の取得とツイート
今回は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上で #お嬢の煽り というタグをつけてつぶやかれたツイートに煽り画像を送りつけるという仕様です. まず送りつけたい画像を用意します.ディレクトリの中はこんな感じ.
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に加えてやれば画像をツイートすることができます.めでたしめでたし.
今後の展開
なんか天気予報もっと簡単に出来んじゃねえのって煽られてる()ので暇があればやってみたいな〜.とりあえずTwitter botシリーズはここで一旦キリを付けたいと思います. Gitにコードうpしました.-> https://github.com/ottosan/ojobot
RubyでTwitterのbot化, 自動ふぁぼ, 自動リプ
前回の内容に引き続き,Twitterのbotを拡張していきます. 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.txt
にbotにつぶやかせたいことを書いておきます.こんな感じです.内容は突っ込まないでください.
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というTwitterのAPIを使います.この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
の内容はこんな感じ.
文頭に「さん」がついていたらリプを送ってきたアカウントの名前を最初にくっつける仕様です.
リプの仕方
自動リプの最大のポイント.
client_rest.update('@'+username+' '+repl, {:in_reply_to_status_id => tweet_id})
この部分ですね.最初,ユーザー名をリプの最初につけるだけで終わっていたのですが,これでは新規リプを投げてるだけでした.:in_reply_to_status_id
というオプションを使うことでツイートに対するリプを送ることができます.
こんな感じ.他にも色々なオプションがあり,これらを使うことで画像をつけてツイートしたり,位置情報をつけたりすることができます.詳しくはこちらのupdateのところを見てみてください.
今後の展開
今後というか,天気予報とか煽り画像を送りつけるコードも書いたので,まあ後々うpしていきたいと思います.今回はこの辺で.
Rubyでツイートしてみた
Rubyを始めて約一週間...なにかこう,実用的(?)なことをしてみたくてRubyでツイートが簡単にできると聞いたのでしてみることにしました.
環境
- Ruby: 2.3.0 (->Ruby公式サイト)
- Rubygem: 2.5.1
1. コンシューマ登録
Twitterのサービスプロバイダーにコンシューマ(アプリケーション)を登録します. こちらからできます.つぶやきたいアカウントでログインするとこんな感じの画面になります.
登録ができたらこんな感じになります.
めっちゃ適当."OjoBot"がさっき登録したアプリケーションの名前ですね.これの"Keys and Access Tokens"のところに
ってのがあって,これらがアプリケーションを使うのに必要になってくるので後で見れるようにしておきます.
2. アクセストークン発行
Twitterの各種リソースにアクセスするためのアクセストークンというのを発行してもらいます.先ほどの"Keys and Access Tokens"の下の方に"Create my access token"とかいうボタンが有ると思うのでそこをポチッとな.すると
ってのが出現します.こいつらも後で使うので見れるようにしておきます.
あ,後Permmisionが"Read and Write"になっているか要確認.
こうなってたらお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
って感じで実行してやるとツイートできます.
じゃじゃ〜ん!!ちゃんとクライアントがOjoBotになってます✨👏
今後の展望
展望というほどではないですが,このままだとツイート出来るだけでbotになってないので次はこれをbot化していったり,他にも面白いのがあったら適当に発展させていきたいです.