Что нового

[Сеть, интернет] Передача файла через Jabber

TFX

Новичок
Сообщения
6
Репутация
0
Господа, подскажите, пожалуйста, возможно ли вообще передать небольшой файл (~200 Kb, jpg) через Jabber, используя Jabber.au3? Или хотя бы в каком направлении копать? Jabber бот сидит за НАТом, так что прямое подключение не проходит.
Вычитал, что есть передача в канале (in-band)... Цитирую: "Медленный и ненадежный, но будет работать всегда, при его использовании файлы превращаются в текст с помощью base64 и отсылаются как обычные сообщения. Не требует настройки, но его стоит использовать только при неработоспособности других разновидностей."

Буду очень рад любым соображениям.

Я и говорю про JAdmin...
Ткните носом, плз...
 
Автор
T

TFX

Новичок
Сообщения
6
Репутация
0
В общем, перекопал протокол XMPP aka Jabber...
Средствами Jabber.au3 в текущем виде пересылку файлов реализовать нельзя.
Буду пытаться написать свою UDF. Кто-нибудь может подкинуть литературу\файлики\инструменты для работы по сабжу? Конкретно интересует модуль наподобие RAW XML для просмотра потока XML.

Добавлено 26.01.10
Мда, видимо, никому не сабж не интерсен.... Жаль...
Через пару дней тему, скорее всего, можно будет закрывать... :-\
 
Автор
T

TFX

Новичок
Сообщения
6
Репутация
0
Ап...
Хотелось бы пообщаться на эту тему с камрадом Nik_rus - Jadmin его детище, вроде...
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Хм... да есть передача файлов... (извини что не замечал темку :smile:) собственно сейчас потестю пару вещичек и выложу результаты...


Добавлено:
Сообщение автоматически объединено:

<iq type="set" to="glasko@localhost/Miranda" id="mir_18">
<si xmlns="http://jabber.org/protocol/si" id="55911749" mime-type="binary/octet-stream" profile="http://jabber.org/protocol/si/profile/file-transfer">
<file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="liter8.doc" size="44032">
<desc></desc>
</file>
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x xmlns="jabber:x:data" type="form">
<field var="stream-method" type="list-single">
<option>
<value>http://jabber.org/protocol/ibb</value>
</option>
</field>
</x>
</feature>
</si>
</iq>
­
<iq from="glasko@localhost/Miranda" to="glasalmas@localhost/RPCHack" xml:lang="en" type="result" id="mir_18">
<si xmlns="http://jabber.org/protocol/si">
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x xmlns="jabber:x:data" type="submit">
<field var="stream-method">
<value>http://jabber.org/protocol/ibb</value>
</field>
</x>
</feature>
</si>
</iq>
­
<iq type="set" to="glasko@localhost/Miranda" id="mir_19">
<open xmlns="http://jabber.org/protocol/ibb" sid="55911749" block-size="2048" />
</iq>
­
<iq from="glasko@localhost/Miranda" to="glasalmas@localhost/RPCHack" xml:lang="en" type="result" id="mir_19" />
­
<message to="glasko@localhost/Miranda" id="mir_20">
<data xmlns="http://jabber.org/protocol/ibb" sid="55911749" seq="0">тут был base64 блок</data>
<amp xmlns="http://jabber.org/protocol/amp">
<rule condition="deliver-at" value="stored" action="error" />
<rule condition="match-resource" value="exact" action="error" />
</amp>
</message>
предыдущих блоков еще полно :smile:
­
<iq type="set" to="glasko@localhost/Miranda" id="mir_42">
<close xmlns="http://jabber.org/protocol/ibb" sid="55911749" />
</iq>
­
<iq from="glasko@localhost/Miranda" to="glasalmas@localhost/RPCHack" xml:lang="en" type="result" id="mir_42" />
Собственно листинг консоли mirandы, попробуем заюзать :smile:
А тут подробненько про это...
 
Автор
T

TFX

Новичок
Сообщения
6
Репутация
0
Пробовал использовать XML-консоль в Tkabber - в принципе, структура запроса на передачу файла более-менее понятна... Только засунуть в Jabber.au3 её никак не могу - навыков не хватает. :0(
Как я понял, требуется сохранять ID сесии... Или нет?
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Собственно я доделываю функцию (особенно сложно с парсингом ;)), потестю и выложу
И да, название и номер пакета нужно знать и сохранять
 

Nik_rus

Python The Snake.
Сообщения
214
Репутация
62
Итак... Фукция написана, осталось выверить время\пакет (Sleep или TCPRecv :smile:) между блоками файла!
А если пока без них (с MsgBox'ами), то файл передает :smile:
Юзал si + ibb


Добавлено:
Сообщение автоматически объединено:

2TFX
Вобщем расклад такой: функция есть (даже работает!), чуток переделал своего бота, отправил тебе в личку, функция:
Код:
Func _JabSendFile($fname,$to,ByRef $socket)
	$sid = Int(Random(10000000,99999999))
	$count = 0
	if StringRegExp($fname,".*\\.*") = 1 Then
		$f = StringSplit($fname,"\\",2)
		$fname2 = $f[UBound($f)-1]
	Else
		$fname2 = $fname
	EndIf
	TCPSend($socket,"<iq type='set' to='" & $to & "' id='jadmin_" & $count & "'>" & @CRLF & _
"<si xmlns='http://jabber.org/protocol/si' id='" & $sid & "' mime-type='binary/octet-stream' profile='http://jabber.org/protocol/si/profile/file-transfer'>" & @CRLF & _
"<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='" & $fname2 & "' size='" & StringLen(FileRead($fname)) & "'>" & @CRLF & _
"<desc>" & $fname2 & "</desc>" & @CRLF & _
"</file>" & @CRLF & _
"<feature xmlns='http://jabber.org/protocol/feature-neg'>" & @CRLF & _
"<x xmlns='jabber:x:data' type='form'>" & @CRLF & _
"<field var='stream-method' type='list-single'>" & @CRLF & _
"<option>" & @CRLF & _
"<value>http://jabber.org/protocol/ibb</value>" & @CRLF & _
"</option>" & @CRLF & _
"</field>" & @CRLF & _
"</x>" & @CRLF & _
"</feature>" & @CRLF & _
"</si>" & @CRLF & _
"</iq>")
	$recv = ""
	While $recv = ""
		$recv = TCPRecv($socket, 2048)
		if StringRegExp($recv,".*id=[""']jadmin_" & $count & "[""'].*") and StringRegExp($recv,".*type=[""']result[""'].*") Then
			TCPSend($socket,"<iq type='set' to='" & $to & "' id='jadmin_" & $count+1 & "'>" & @CRLF & _
"<open xmlns='http://jabber.org/protocol/ibb' sid='" & $sid & "' block-size='2048' />" & @CRLF & _
"</iq>")
			$fblocks = _StringSplit(FileRead($fname),2048)
			For $iBl=0 To UBound($fblocks)-1 Step 1
				TCPSend($socket,"<message id='jadmin_" & $count+2 & "' to='" & $to & "'>" & @CRLF & _
				"<data xmlns='http://jabber.org/protocol/ibb' seq='" & $count & "' sid='" & $sid & "'>" & _Base64Encode($fblocks[$iBl]) & "</data>" & @CRLF & _
				"<amp xmlns='http://jabber.org/protocol/amp'>" & @CRLF & _
				"<rule condition='deliver-at' value='stored' action='error' />" & @CRLF & _
				"<rule condition='match-resource' value='exact' action='error' />" & @CRLF & _
				"</amp>" & @CRLF & _
				"</message>")
				$count = $count + 1
				Sleep(1000)
			Next
			TCPSend($socket,"<iq type='set' to='" & $to & "' id='jadmin_" & $count+2 & "'>" & @CRLF & _
			"<close xmlns='http://jabber.org/protocol/ibb' sid='" & $sid & "' />" & @CRLF & _
			"</iq>")
			return True
		ElseIf StringRegExp($recv,".*type=[""']cancel[""'].*") or StringRegExp($recv,".*type=[""']error[""'].*") Then
			Return False
		Else
			$recv = ""
			ContinueLoop
		EndIf
	WEnd
EndFunc

Func _StringSplit($str,$count)
	Dim $l[1]
	For $i=0 To StringLen($str) Step $count
		_ArrayAdd($l,StringTrimRight(StringTrimLeft($str,$i),StringLen($str)-$i-$count))
	Next
	_ArrayDelete($l,0)
	Return $l
EndFunc

Func _Base64Decode($Data)
	Local $Opcode = "0xC81000005356578365F800E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFF00FFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132338F45F08B7D0C8B5D0831D2E9910000008365FC00837DFC047D548A034384C0750383EA033C3D75094A803B3D75014AB00084C0751A837DFC047D0D8B75FCC64435F400FF45FCEBED6A018F45F8EB1F3C2B72193C7A77150FB6F083EE2B0375F08A068B75FC884435F4FF45FCEBA68D75F4668B06C0E002C0EC0408E08807668B4601C0E004C0EC0208E08847018A4602C0E00624C00A46038847028D7F038D5203837DF8000F8465FFFFFF89D05F5E5BC9C21000"
	
	Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
	DllStructSetData($CodeBuffer, 1, $Opcode)

	Local $Ouput = DllStructCreate("byte[" & BinaryLen($Data) & "]")
	Local $Ret = DllCall("user32.dll", "int", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
													"str", $Data, _
													"ptr", DllStructGetPtr($Ouput), _
													"int", 0, _
													"int", 0)

	Return BinaryMid(DllStructGetData($Ouput, 1), 1, $Ret[0])
EndFunc

Func _Base64Encode($Data, $LineBreak = 76)
	Local $Opcode = "0x5589E5FF7514535657E8410000004142434445464748494A4B4C4D4E4F505152535455565758595A6162636465666768696A6B6C6D6E6F707172737475767778797A303132333435363738392B2F005A8B5D088B7D108B4D0CE98F0000000FB633C1EE0201D68A06880731C083F901760C0FB6430125F0000000C1E8040FB63383E603C1E60409C601D68A0688470183F90176210FB6430225C0000000C1E8060FB6730183E60FC1E60209C601D68A06884702EB04C647023D83F90276100FB6730283E63F01D68A06884703EB04C647033D8D5B038D7F0483E903836DFC04750C8B45148945FC66B80D0A66AB85C90F8F69FFFFFFC607005F5E5BC9C21000"

	Local $CodeBuffer = DllStructCreate("byte[" & BinaryLen($Opcode) & "]")
	DllStructSetData($CodeBuffer, 1, $Opcode)

	$Data = Binary($Data)
	Local $Input = DllStructCreate("byte[" & BinaryLen($Data) & "]")
	DllStructSetData($Input, 1, $Data)

	$LineBreak = Floor($LineBreak / 4) * 4
	Local $OputputSize = Ceiling(BinaryLen($Data) * 4 / 3) 
	$OputputSize = $OputputSize + Ceiling($OputputSize / $LineBreak) * 2 + 4

	Local $Ouput = DllStructCreate("char[" & $OputputSize & "]")
	DllCall("user32.dll", "none", "CallWindowProc", "ptr", DllStructGetPtr($CodeBuffer), _
													"ptr", DllStructGetPtr($Input), _
													"int", BinaryLen($Data), _
													"ptr", DllStructGetPtr($Ouput), _
													"uint", $LineBreak)
	Return DllStructGetData($Ouput, 1)
EndFunc
Я очень удивился, когда узнал что в родном афтоите нет base64encode :(
А по функции _JabSebdFile:
$fname = руть к файлу
$to = кому шлем
$socket = сокет к серверу
Лучшей паузы между пакетами не нашел, кроме как 1 секунда ;)
$to помоему обязательно с клиентом ([email protected]/ClientName)
Желаю приятного кодинга :IL_AutoIt_1:
 
Автор
T

TFX

Новичок
Сообщения
6
Репутация
0
Я использовал (пытался, точнее) UDF Base64 с буржуйского сайта...
 
Верх