Jabberウェブカメラボット

このアイデアは、偶然に思い浮かびました。 自宅、職場、または別の都市にあるWebカメラから写真を取得し、Web経由でカメラを共有しないでください。また、sshを介して接続しないでください。 クレイジーに聞こえますが、私はこのナンセンスを売り始めました!



上記のすべてが、マニュアルまたはアクションの指示であると主張しているわけではありません。 タンバリンでこれらのダンスを繰り返すと、テクニックや脳にダメージを与える可能性があります。 だから注意してください)

だから、初心者のために、ジャバーと戦うための手段が何であるかを研究しました。 最初に、Java用のライブラリを探しました。 選択肢がありますが、何らかの理由ですべてが非常に複雑であり、個々のサーバー(たとえば、jabber.ru)で何かが機能しません。 したがって、私はこのリストから選択し始めました。 選択が下がった... Ruby)第一に、私は彼を知らないので、第二に、第一の例の単純さのために。 結局、私はxmpp4rに落ち着きました。 ルビーでは、私は完全な初心者なので、安全にトマトを批判して投げることができます)スタジオのコード:

#!/usr/bin/ruby

require 'xmpp4r/client'



include Jabber



class BasicClient

MSG_DEFAULT= "If your see this message you client doesn`t support html"

MSG_DENIED= "Access denied!"



def initialize(args)

puts(args[0])

puts "Jabber WebCamBot initializing"

@my_jid=args[0]

@my_pwd=args[1]

@user_jid=args[2]

if args[3] == "debug"

Jabber::debug = true

end

puts "Will connect to " + @my_jid + " and accept messages only from " + @user_jid

do_connect

do_auth

start_work

end



def do_connect()

@jid = JID. new (@my_jid)

@cl = Client. new (@jid)

@cl.connect

end



def do_auth

@cl.auth(@my_pwd)

presense = Presence. new (:dnd, "server running" )

@cl.send(presense)

end



def start_work

mainthread = Thread.current

@cl.add_message_callback do |m|

if m.type != :error

msg_jid=m. from .node + "@" + m. from .domain

puts(msg_jid)

if msg_jid != @user_jid

puts( "Unknown user" )

m2 = Message. new (m. from , MSG_DENIED)

@cl.send(m2)

else

get_image

m2 = Message. new (m. from , MSG_DEFAULT)

m2.type = m.type

h = REXML::Element:: new ( "html" )

h.add_namespace( 'http://jabber.org/protocol/xhtml-im' )



b = REXML::Element:: new ( "body" )

b.add_namespace( 'http://www.w3.org/1999/xhtml' )



t = REXML::Text. new ( @cam_image,

false , nil, true , nil, %r/.^/ )

b.add(t)

h.add(b)

m2.add_element(h)

puts(m. from )

@cl.send(m2)

end

end

end

Thread.stop

end



def get_image

system( "./make.img" )

image_file = File . new ( "data.html" , "r" )

@cam_image = image_file.read()

end

end



BasicClient. new (ARGV)








スクリプトには4つの引数が渡されます。





このコードの本質は、サーバーに接続し、特定の既知のユーザーからメッセージを受信するまで待機することです(職場で私を嫌がらせます)。 このメッセージを受信すると、スクリプトは外部コマンド./make.imgを開始し(後で詳しく説明します)、生成されたdata.htmlファイルに基づいてメッセージを生成します。このファイルには、htmlタグに画像が含まれます。



ここで最も興味深いことになります。 画像を転送して表示するにはどうすればよいですか? 私の最初のアイデアはアスキーアートを使うことでした。 しかし、試してみたところ、何かを作るのは非現実的だと気づきました。 したがって、データをカプセル化したhtml imgタグを(base64エンコードを介して)渡す必要があります。 make.imgスクリプトは、このようなパッケージを生成するのに役立ちます。



#!/bin/bash



uvccapture -mv -o out.jpg

convert out.jpg -quality 20 out.jpg

IMG=$(cat out.jpg | base64)

DATE=$(date -R)

echo "Created: $DATE < br />< img src =\ "data:image/png;base64,$IMG\" /> " > data.html









このスクリプトは、カメラから画像をキャプチャします(uvccapture-数千のオプションがあり、誰もが自分に合ったキャプチャツールを選択します。現在uvccaptureを持っています)。 次に、ImageMagickを使用して品質を低下させます(jabberで高品質の画像が必要なのはなぜですか?)。次に、base64エンコードを行い、htmlメッセージを作成します。



しかし、これは戦いの半分に過ぎません。 このメッセージはどこかで見る必要があります。 メッセージに写真を軽々しく表示するクライアントは1つしか見つかりませんでした。 これはシナプスです。 彼は最近登場し、最近Habréで彼について書かれました。 写真のリクエストとレンダリングの間に一定の時間が経過しますが、それは非常に簡単に機能します-何のために明確ではありません...最後に、ボットとの会話のスクリーンショットを提示します:

webcambot



PSもちろん、NP複雑な問題の解決策を探したり、計算物理学のアルゴリズムを最適化したり、スタートアップを作成したりするのは、そのようなナンセンスなことよりはましだと言えます。 たぶん、でも面白いことが判明した)

PPSコードが完全にひどくなく、テキストにそれほど多くの断片がないことを願っています



All Articles