以下をやってみた時の作業メモ
- IRCサーバーを立てる
- IRCクライアントから接続する
- IRCのbotを作成してみる
- IRCのログを取得する
- IRCのログをブラウザで表示する
環境
- クライアント->Mac OSX(10.11.4)
- サーバー->Ubuntu14.04
IRCサーバーの構築
Vagrantを使ってローカルにUbuntuのVMを立てて、そこにIRCサーバーを立てました。
VMにはプライベートIPを割り当てて接続します。
ポートフォワードでも大丈夫だと思います。
config.vm.network "private_network", ip: "192.168.33.10"
UbuntuにSSHログイン後、以下のコマンドでインストールします。
/etc/ngircd/ngircd.conf
に設定ファイルがありますが、特に制限などはしないので今回は編集してません。
$sudo apt-get update
# 確認
$sudo apt-cache search ngircd
ngircd - lightweight Internet Relay Chat server
# インストール
$sudo apt-get install ngircd
# 起動
$sudo /etc/init.d/ngircd start
Mac側から接続確認
$nc -w 1 192.168.33.10 6667
$echo $?
0
OKですね。
IRCクライアントからの接続
MacにIRCクライアントをインストールして接続してみます。
今回はWindowsで使ったことのあるLimeChat for Macを使ってみました。
起動後、IRCサーバーの指定でIPアドレスを「192.168.33.10」と指定することで接続できました。
また、検証のために適用なチャンネルを作り、参加します。
大丈夫そうです。
簡単な返信ボットを作ってみる
こちらに記載のあるcinchというRubyで簡単にbotを作れるフレームワークを今回は利用してみました。
まずはGemでcinchをインストールします。
$gem install cinch
READMEを参考にhelloと言ったら返事をしてくれるbotを作ってみます。
require 'cinch'
bot = Cinch::Bot.new do
configure do |c|
c.server = '192.168.33.10'
c.channels = ['#zatu']
c.nick = 'toshi_bot'
c.realname = 'toshi_bot'
c.user= 'toshi_bot'
end
on :message, 'hello' do |m|
m.reply "Hello, #{m.user.nick}"
end
end
bot.start
実行します。
$ruby hello_bot.rb
この状態で「hello」と発言すると返信してくれます。
簡単にできました。
天気情報を取得してくる
上記を参考に天気情報を取得して表示するのを作ってみます。
最初にRESTで情報を取得する際に必要なAPIKEYを取得します。
OpenWeatherMapにログインして、アカウントを作成します。(無料です)
上記によってAPKEYが取得できるのでメモします。
試しに現在の天気が取得できるかやってみます。
aapidの値は取得したAPIキーを利用してください。
$curl http://api.openweathermap.org/data/2.5/weather\?q\=tokyo,jp\&appid\=xxxxxx
{"coord":{"lon":139.69,"lat":35.69},"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04n"}],"base":"stations","main":{"temp":293.89,"pressure":1007,"humidity":68,"temp_min":290.93,"temp_max":297.04},"visibility":10000,"wind":{"speed":12.9,"deg":200},"clouds":{"all":75},"dt":1462577628,"sys":{"type":1,"id":7619,"message":0.0137,"country":"JP","sunrise":1462477394,"sunset":1462527171},"id":1850147,"name":"Tokyo","cod":200}%
まずは先に情報を取得するスクリプトを確認してみます。
require 'json'
require 'uri'
require 'net/http'
require 'pp'
CITY = 'tokyo'
APIKEY = ''
uri = URI.parse("http://api.openweathermap.org/data/2.5/weather?q=#{CITY},jp&appid=#{APIKEY}")
json = Net::HTTP.get(uri)
result = JSON.parse(json)
pp result['weather'][0]['description']
require 'cinch'
require 'json'
require 'uri'
require 'net/http'
APIKEY = ''
bot = Cinch::Bot.new do
configure do |c|
c.server = '192.168.33.10'
c.channels = ['#zatu']
c.nick = 'toshi_bot'
c.realname = 'toshi_bot'
c.user= 'toshi_bot'
end
on :message, /^weather (.+)/ do |m, city|
uri = URI.parse("http://api.openweathermap.org/data/2.5/weather?q=#{city},jp&appid=#{APIKEY}")
json = Net::HTTP.get(uri)
result = JSON.parse(json)
description = result['weather'][0]['description']
m.reply "#{city} is #{description}"
end
end
bot.start
いいですね。
それらしいのが出来ました。
TiarraでIRCのログを残す
[IRC][さくらのVPS]tiarra を入れたので設定をメモしておくAdd Star
IRCではログアウトしている時の会話を確認する事が出来ません。
また、昔のログを残す事が出来ません。
上記問題に対してProxyとなるサーバーを立てて、プロセスを常駐させることでログアウト時を含むIRCログの取得を行います。
今回はIRCのProxyサーバーとしてTiarraというものを使ってみます。
まずはダウンロードと配置。
$wget http://www.clovery.jp/tiarra/archive/2010/02/tiarra-20100212.tar.gz
$tar -zxvf tiarra-20100212.tar.gz
$ln -s tiarra-20100212 tiarra
次に設定ファイルを作成します。
$cd tiarra
$cp -p sample.conf tiarra.conf
cryptされたパスワードを生成します。
$./tiarra --make-password
Tiarra encrypts your raw password to use it for config file.
Please enter raw password: xxxxx
cxNYayoReiBIQ is your encoded password.
Use this for the general/tiarra-password entry.
次に設定ファイルのtiarra.confを設定します。
設定が幾つかのブロックに分かれています。
generalブロック
全体的な設定です。
# ユーザー情報
# 省略不能です。
nick: toshi
user: toshi
name: toshi
# Tiarraが開くポート。ここに指定したポートへクライアントに接続させる。
# 省略されたらポートを開かない。
tiarra-port: 6667
# Tiarraにクライアントが接続する際に要求するパスワードをcryptした文字列。
# 空の文字列が指定されたり省略された場合はパスワードを要求しない。
# crypt は ./tiarra --make-password で行えます。
tiarra-password: cxNYayoReiBIQ
networksブロック
接続するIRCサーバーのネットワークの名称を設定します。
複数ある場合には複数の名称を設定します。
今回の例では一つ。
name: virtualbox
各ネットワークの設定
networksブロックで作成したブロック数分定義します。
今回は一つ。
virtualbox {
# サーバーのホストとポートを指定。複数行可。(host/port が指定されていない場合>は)省略不可。
# 同じサーバの複数のポート指定は順番に試すので、大量に書かない方がよい。
server: 192.168.33.10 6667
}
ログを取得できるようにする
以降は各機能で「-」を「+」に変更することで機能を有効化できます。
- Log::Channel {
以下に変更
+ Log::Channel {
また、以下のように設定することで指定したチャンネルのみログを取ることができます。
以下の設定ではネットワークで「virtualbox」と指定したIRCサーバーの#zatuというチャンネルをlog/zatuフォルダ配下に保存します。
channel: zatu #zatu@virtualbox
接続時に最近のログを表示
以下の記述に変更することで最近のログをログイン時に表示します。
- Log::Recent {
以下に変更
+ Log::Recent {
接続時に自動的にログインするチャンネルを設定
以下で接続時に自動参加するチャンネルを設定します。
- Channel::Join::Connect {
以下に変更
+ Channel::Join::Connect {
上記で設定を有効化し、チャンネルを設定します。
channel: #zatu@virtualbox
これで設定はできたのでtiarraを起動します。
./tiarra
ログが標準出力で表示されるので最初はこの状態で起動してみるのが良いと思います。
問題なければ./tiarra &
でバックグラウンド起動させておけば良いかと思います。
tiarraのプロセスが動いている状態でLimechatからはlocalhostのtiarra経由でIRCへ接続します。
接続時に設定したパスワードを指定することを注意。
接続がうまくできれば「#zatu@virtualbox」チャンネルに自動でログインできるはずです。
ログをブラウザで表示してみる
以下を参考にログをブラウザで表示してみました。
PHP IRC Log ViewerをリファクタリングしてTiarra対応にしてみた
$git clone https://github.com/kenjis/irc-log-viewer
ログフォーマットをTiarraのものに変更します。
//$logFormat = new LogFormatOrig($channel);
// for Tiarra logs
$logFormat = new LogFormatTiarra('');
次にTiarraのログファイルをコピーします。
$ cp /Users/toshihirock/irc/tiarra/log/zatu/2016.05.07.txt sample-logs
最後に起動スクリプトを変更します。
PP_LOGDIR=./sample-logs \
設定ができたので起動してみます。
$./local.sh
これで
にアクセスしてみます。
上記のように表示できました。