IT omoe

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

Bootstrapを乱用したホームページを作ってみた

自分のホームページのデザインがイマイチだったので,何か簡単にいい感じのデザインにしたいと思ってBootstrapを使ってみることにしました.
今回はその際に参考になった色々をメモっときたいと思います.

Bootstrapとは

そもそもBootstrapとはWikipediaさんによると

ウェブサイトやWebアプリケーションを作成するフロントエンドWebアプリケーションフレームワーク

だそうです.
まあ簡単に言うと,決められたclassを指定するだけで,サイトに自動的にデザインが適応される素晴らしいアイテムなんです.ちなみに,Twitterの会社が作っているというのは有名な話.

導入

Bootstrapの公式サイトから「Download Bootstrap」をポチポチすると,zipファイルがダウンロードされます.それを自分の開発したいところで解凍してやります.
f:id:ottosan84:20161005115334p:plain:w400
こんな感じ.後はこれらを適応したいHTMLなどにリンク付けてやるだけです.

参考になったサイト

個人的に参考になったサイトをあげておきます.

  • ドットインストール
    だいたいの必要な知識を得ることができます.
  • Bootstrapの使い方
    全ての内容を網羅しているわけではないですが,Bootstrapを使っていて,「このclass,何て書くんだったっけ〜?」ってなったときに素早く自分の知りたい内容を調べることができました.情報がよくまとまっていて,デモもたくさんあるのでわかりやすいです.
  • Bootstrapの公式サイト
    英語ですが,意外とテンプレや例が豊富なので使ってみるといいかもしれません.

できたもの

これです
f:id:ottosan84:20161005164417p:plain:w600
利用したBootstrapの機能は,

  • ヘッダー
  • スライド
  • パネル
  • テーブル
  • グリッドシステム

など.正直なところスライドとかそんなに必要性ないんですけど面白くて入れてしまいました.
スマホで見るとこんな感じ.
f:id:ottosan84:20161005165450j:plain:w200
簡単にレスポンシブデザインができちゃうんです.
今までBootstrapをいうものの存在は知っていたのですが,あまり詳しく知りませんでした.今回の件で「めっちゃ便利やん!!」となったのでしばらくBootstrap信者になってそうです.

LINEスタンプ作った

お久しぶりです.LINEスタンプを作ったので,その制作過程などについて簡単に綴りたいと思います.

LINEスタンプ作りました

f:id:ottosan84:20160928162727p:plain 無気力にゃんこ

私が普段ツイッターのアイコンにしたりこのブログにも使っているネコちゃんのスタンプです.

f:id:ottosan84:20160928162637j:plain
こいつですね.

制作過程のお話

私はキャラクターデザインを担当しました.データ化はさこくんがしてくれました.
ペンタブとか持ってないので普通に紙に書いたのを写真を撮って,それをillustratorでトレースして,色をつけてもらいました.

f:id:ottosan84:20160928164057j:plain
これが
f:id:ottosan84:20160928164154p:plain
こうなって
f:id:ottosan84:20160928164415j:plain
こうじゃ.

思ったよりも簡単にできちゃうんです.

申請過程

LINEの審査は結構時間がかかります.今回は最初の申請からリリースまで2週間近くかかりました.でも以前は何ヶ月もかかったそうなのでこれでも早い方みたいです.
審査基準は色々と厳しくて,未成年者の飲酒喫煙を想起するものがだめだとか,性的表現がだめだとかいうのがガイドラインに載っています.
そして今回,唯一リジェクトされたのがこれ(再現). f:id:ottosan84:20160928171228p:plain
エナジードリンクを飲んで倒れているのを表現したかったのですが,どうもこのモンエナらしき何かがだめだったようです.怪しいとは言われていたのですがやはりダメでした.
そして最終的にこうなりました. f:id:ottosan84:20160928172041p:plain
もうエナジードリンクなのかよくわからなくなってしまいましたが,まあ妥協です.

さいごに

結構作るのは楽しかったので,第2弾も作りたいな〜とか思ってます.よかったら買って下さい!!

MacBook Proのキーボードとマウスパッドが使えなくなったお話

前兆

昨年の12月に買ったばかりのMacBook Pro.ある日開いてみると(スリープから解除すると)ポインタが動きません. とりあえず再起動すると動いたので問題ないものと見て放置.
それから同じようなことが何回か起こりましたが,いつも再起動すれば直りました.

ヤバい

いつも通り再起動すると,ついに何やら変な表示が出てきました. f:id:ottosan84:20160422164908p:plain ずっとこの2つが交互に出てきます. マウスかマジックパッドの電源を入れろという表示です.
「いやあの,Bluetoothでマウスとかマジックパッド繋いで使ったりしてないんでw」
つまり,ノートパソコンのキーボードとマウスパッドの部分が認識されてないということです.
「ハード的な問題かしら」
嫌な予感が頭をよぎります.
PRAMリセットとか色々試してみるのですが,なんせキーボードがダメなので全く効果がありません.というか効果とか言う前にできません.

とりあえず,外付けのマウスとキーボードを繋いで起動. 起動したのは起動したのですが,相変わらずノーパソのキーボードとマウスパッドは反応してくれません.

「OSが悪いのかな」 溜まっていたソフトウェア・アップデートをかけます. すると...なんとなんとポインタが動くではありませんか!感動です!!(<-動いて普通)

直った...はずだった

数日くらい快適にノーパソライフを送っていました.
すると,また同じ症状に見舞われました.スリープ解除からは動かないけど,再起動すると動くというやつ.
それからその症状が多発し...再起動しても動かなくなりました.
「そうなる気はしてた」
外付けライフ再来.
でも今度はアップデートはありません. 外付けキーボードでPRAMリセットなどの自分でできる対処法を色々と試します.
が,効果はありません.悲しい. 仕方なく修理に出すことにします.

こうしてお嬢はキーボードの有り難みを思い知ったのでした.

お店で肩透かしを食らった

やっぱりハードの問題よね...と思ってバックアップもしっかりとって数日くらいノーパソが帰ってこないも当たり前といった心持ちでKitcutに向かいました.
パソコンの電源を入れると確かにポインタは動きません.
お店の人も奥から外付けのマウスとキーボードを取り出してきます.
しかし,お店の人は何かを少しいじっただけですぐに直してしまいました.
ほえ?
唖然としていると「確認して下さい」とPCを差し出されました. 確かにちゃんとキーボードもマウスパッドも反応してくれます.
お店の人はこの原因をこう語ります.

  • システムの一時的なエラー
  • 電源をつけたままにしておくとキーボードに入力情報が残り,それが溜まっていくとエラーを起こすことがある
  • 使わないときは電源切ってね

あ,はい.すみません.
確かにいつも電源切るのが面倒で電源つけっぱでノーパソを閉じていました. 今後はめんどくさがらずにちゃんと電源切ります(´;ω;`)

【追記】
今回,お店に持って行くまでの過程をあたかも全て自分でやったかのように書いておりますが,複数の方々に色々と手伝ってもらったりアドバイスを頂いたりしておりました.その方々にこの場を借りて厚く御礼申し上げたいと思います.ありがとうございましたm(._.)m

直ったと錯覚していた

お店の人に直してもらった後は,まあまあ普通に使えてました. ちゃんとこまめに電源を切るようにしていると,問題はありませんでした.
しかし,1回だけ電源を切るのを忘れて長時間放置してしまいました. するととたんに使えなくなって,今度は起動した後にキーボードが見つかりませんといった表示がでるようになりました. f:id:ottosan84:20160514084908j:plain こんな感じでキーボードもマウスも使えません.ログイン出来ないので何もできません.

再度お店へ

とりあえずもう迷わずお店に行きました. まさかの前回と同じ店員さんで,マジか〜と思いながら事情を説明すると,一度中を見たほうが良さそうですねということでお預かりになりました.
修理は丁度一週間ほどで出来ました.保証期間中だったので無料でしてもらえました.「キーボードとマウスパッドの中の線を交換しときました」とのこと.やはりハード的な問題だった模様.ちゃんとログインできました!しかも中のデータもちゃんと残ってる!わーい!しかし再度「電源をこまめに切るようにして下さい」と言われたので切るようにします(´・ω・`)

【スケート部】新歓ムービーつくったよ

珍しくスケートネタ.スケート部の新歓の動画作りました.情報系の学部だと言うと動画の編集とか任されちゃうのが情報系あるあるみたいです.動画の紹介と簡単な補足情報を伝えられたらいいかなと思います...

新歓ムービーその1


立命館大学スケート部新歓ムービー 〜その1〜

京都アクアリーナでの朝練の様子をもとに,部活の紹介をしています.基本的に先輩後輩関係なく経験者が初心者に教えます.コーチが来てくれているときはコーチにも教えてもらうことができます.貸切を取るのは基本的に以下の3つのスケートリンクです.

他大学の人がビジターで入ってきたりすることもあり,交流の輪が広がります.普段の貸切以外に合宿も年に数回ほどあり,楽しい感じです.

新歓ムービーその2


立命館大学スケート部新歓ムービー 〜その2〜

部員の試合での様子を紹介しています.立命館の出場する試合には以下の様なものがあります.正式名称だと長くなるので俗称で失礼します.

  • 大学生の大会
    • 西インカレ,インカレ,関カレ,フリー大会
  • 京都の大会

動画でもわかるように大学の試合は他の試合と雰囲気が違います.応援がすごいです.みんなでワイワイやってる感じです.後,全日本レベルのすごい人の演技も見れたりします.

さいごに

そんなこんなでスケート部こんな感じでやってます.動画でも言っているように初心者と男子を特に募集してます.大学で何か始めたいという方,スケートという選択肢がここにあります.無料体験とかやってるのでよかったら来てください.情報は基本的にツイッターから発信されてます(--->@rits__fsc).というかとにかくスケート部の存在を知ってもらいたいです.「そんなん立命にあったんや」ってよく言われます.あるんですよ!!!!w

映像撮影のいろいろ

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

事前準備

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

  • 細かいチェックやストライプは映像に影響する可能性があるので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していきたいと思います.今回はこの辺で.