上記のすべてが、マニュアルまたはアクションの指示であると主張しているわけではありません。 タンバリンでこれらのダンスを繰り返すと、テクニックや脳にダメージを与える可能性があります。 だから注意してください)
だから、初心者のために、ジャバーと戦うための手段が何であるかを研究しました。 最初に、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つの引数が渡されます。
- Jabber ID
- 彼からのパスワード
- ウェブカメラから写真を見ることができるユーザーのJabber ID
- xmpp4rからのサービス情報の出力用のオプションのデバッグパラメーター
このコードの本質は、サーバーに接続し、特定の既知のユーザーからメッセージを受信するまで待機することです(職場で私を嫌がらせます)。 このメッセージを受信すると、スクリプトは外部コマンド./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éで彼について書かれました。 写真のリクエストとレンダリングの間に一定の時間が経過しますが、それは非常に簡単に機能します-何のために明確ではありません...最後に、ボットとの会話のスクリーンショットを提示します:
PSもちろん、NP複雑な問題の解決策を探したり、計算物理学のアルゴリズムを最適化したり、スタートアップを作成したりするのは、そのようなナンセンスなことよりはましだと言えます。 たぶん、でも面白いことが判明した)
PPSコードが完全にひどくなく、テキストにそれほど多くの断片がないことを願っています