Что нового

[Сеть, интернет] Отправка смс используя протокол MMP

Renz

Осваивающий
Сообщения
63
Репутация
37
AutoIt: 3.3.6.1
Версия: 0.1

Категория: Автоматизация, Сеть, Интернет

Описание: Приложение отправляет смс сообщение используя протокол MMP ( <a href="http://agent.mail.ru/ru/developers/protocol.html">описание протокола</a> )

Код:
Код:
;**************************AutoIt_MA v0.1****************************************
;****AutoItv3.3.6.1                                                          ****
;****Author:Renz                                                             ****
;****fail:http://narod.ru/disk/8573738001/AutoItMA.au3.html
;********************************************************************************

Файл: <a href="http://narod.ru/disk/8573738001/AutoItMA.au3.html">AutoItMA.au3</a>

Автор(ы): Renz

:IL_AutoIt_1: Жду предложений по оптимизации кода и обнаруженным ошибкам. :whistle:
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
Обнаружена ошибка!!!
Если не отправляет смс, необходимо после строки:
Код:
$interval_ping = Dec(Hex(_Rotate_srv($interval)))*1000

поставить слип
Код:
Sleep(1000)

В чем причина пока непонятно :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Renz
Отправил себе, получил нормально, значит работает. ;D
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Для этого должны быть деньги на счету?) А то мне ничего не пришло :(
 
Автор
Renz

Renz

Осваивающий
Сообщения
63
Репутация
37
SECTOR сказал(а):
Для этого должны быть деньги на счету?) А то мне ничего не пришло :(
Отправка и прием бесплатный.
Проверь логин и пароль. Сколько символов в сообщении?
Отправка только на российские номера. Уточнить на сайте.
Если включен другой майл_агент то подключения не будет.
Спасибо, это тема к размышлению о ведении лога. :smile:
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
Все работает спасибо ! ...Вот только можно пример как организовать отсылку сообщений используя AutoItMA.au3 как включенную в скрипт библиотеку ?
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Renz сказал(а):
Сколько символов в сообщении?
Максимум 50 ) но писал только "привет") ничего не пришло(((

Агент у меня не установлен
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Renz,
А нельзя ли отправку СМС оформить в функцию, которая бы возвращала результат (успешная отправка или ошибка, или еще что-нибудь), чтобы был виден результат, отправлена ли СМС или нет, а то я с проверками всю семью замучил своими "приветами". :smile:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Заработало! :laugh:

1-е Отправляет только с ящиков @mail.ru... на @list.ru и т.д. не получилось заставить работать.
2-е Отправляет sms только раз в 5 минут. :smile: А если флудить дальше интервал вырастает до 30 мин. :smile:
3-е Пример для lirikmel.
Код:
;**************************AutoIt_MA v0.1****************************************
;****AutoItv3.3.6.1                                                          ****
;****Author:Renz                                                             ****
;********************************************************************************
;константы протокола mrim
Const $CS_MAGIC          = 0xDEADBEEF
Const $CS_PROTO          = 0x00010013 ;ma v1.13
Const $MRIM_CS_HELLO     = 0x00001001
Const $MRIM_CS_HELLO_ACK = 0x00001002
Const $MRIM_CS_LOGIN_ACK = 0x00001004
Const $MRIM_CS_LOGIN_REJ = 0x00001005
Const $MRIM_CS_PING      = 0x00001006
Const $MRIM_CS_MESSAGE   = 0x00001008
Const $FST_SEQ           = 0x00000001
Const $RESERVED          = "00000000000000000000000000000000"
Const $FROM              = 0x00000000      
Const $FROMPORT          = 0x00000000
Const $DLENZERO          = 0x00000000
Const $MRIM_CS_LOGIN2    = 0x00001038
Const $STATUS_OFFLINE                  = 0x00000000
Const $STATUS_ONLINE                   = 0x00000001
Const $STATUS_AWAY                     = 0x00000002
Const $STATUS_UNDETERMINATED           = 0x00000003
Const $STATUS_FLAG_INVISIBLE           = 0x80000000
Const $FROM_LOGIN_HZ                   = 0x0000FF03
Const $MRIM_CS_SMS                     = 0x00001039
Const $STATUS_SMS                      = 0x00000004
;Логин
;Пароль
;Номер
;Текст
Func _SendSMS($login, $pass, $nom_tel, $sms_msg)
$STATUS_SMS_STR = "status_24"
$status_str ="sms"
;$login= "[email protected]" ;логин
;$pass= "Password" ;пароль
$name_clt = 'client="magent" version="5.3" build="2546"'
$name_clt2 = "MRA 5.3 (build 2546);"
$RU ="ru"
;$sms_msg = "Привет чувак!";сообщение
;$nom_tel = "+7917XXXXXXX" ;номер телефона

;**********************msg hello*****************************************************
$hello_title = _Rotate_cl($CS_MAGIC) &_Rotate_cl($CS_PROTO) & _Rotate_cl($FST_SEQ) & _Rotate_cl($MRIM_CS_HELLO) & _Rotate_cl($DLENZERO) & _Rotate_cl($FROM) & _Rotate_cl($FROMPORT)
$hello_msg = Binary ( $hello_title ) & $RESERVED
;MsgBox(1,"$hello_msg--IsBinary",IsBinary($hello_msg))
;**********************msg login*****************************************************
$login_str = _string_UPL($login) & _string_UPL($pass) & _Rotate_cl($STATUS_SMS) & _string_UPL($STATUS_SMS_STR) & _string_UPL_RU($status_str) & _Rotate_cl($FROM) & _Rotate_cl($FROM_LOGIN_HZ)
$login_str = $login_str & _string_UPL($name_clt) & _string_UPL($RU) & _string_UPL($name_clt2)
$login_str = Binary($login_str)
;MsgBox(1,"$login_str--IsBinary",IsBinary($login_str))
$DLENLOGIN = BinaryLen ($login_str)
;MsgBox(1,"BinaryLen",$DLENLOGIN)
$login_title = _Rotate_cl($CS_MAGIC) &_Rotate_cl($CS_PROTO) & _Rotate_cl($FST_SEQ+1) & _Rotate_cl($MRIM_CS_LOGIN2) & _Rotate_cl($DLENLOGIN) & _Rotate_cl($FROM) & _Rotate_cl($FROMPORT)
$login_msg = Binary ( $login_title ) & $RESERVED &  StringTrimLeft( String($login_str),2) 
;$login_msg = Binary ($login_msg)
;MsgBox(1,"$login_msg",$login_msg)
;Exit
;****************msg ping************************************************************
$ping_title1 = _Rotate_cl($CS_MAGIC) &_Rotate_cl($CS_PROTO)
$ping_title2 = _Rotate_cl($MRIM_CS_PING) & _Rotate_cl($DLENZERO) & _Rotate_cl($FROM) & _Rotate_cl($FROMPORT)
;***************msg sms**************************************************************
$sms_str = _Rotate_cl($DLENZERO) & _string_UPL($nom_tel) & _string_UPL_RU($sms_msg)
$sms_str = Binary($sms_str)
$dlensms = BinaryLen($sms_str)
$sms_title1 = _Rotate_cl($CS_MAGIC) & _Rotate_cl($CS_PROTO) ;& п\номер пакета
$sms_title2 = _Rotate_cl($MRIM_CS_SMS) & _Rotate_cl($dlensms) & _Rotate_cl($FROM) & _Rotate_cl($FROMPORT)
;****************Инициировать использование службы TCP*******************************
If TCPStartup() = 0 Then 
	MsgBox(1,"TCP","Неудалось инициализировать службу TCP",5)
EndIf
;***************создание сокета для подкл. к серверу*********************************
Do
	$ip_srv = _GetMrimIp()
    $socket_srv = TCPConnect( $ip_srv[0], $ip_srv[1] )
Until $socket_srv <> -1

;***************инициализация клиента на сервере*************************************
TCPSend($socket_srv,$hello_msg)
While 1
	$msg_srv = TCPRecv($socket_srv, 2048)
	If $msg_srv <> "" Then
		$rez = _ReadMsgSrv($msg_srv)
		If @error <> -1 Then
			If $rez[0] = Binary($MRIM_CS_HELLO_ACK) Then
				TCPSend($socket_srv,$login_msg)
				$interval = $rez[1]
				;MsgBox(1,"interval_ping",$interval_ping)
			ElseIf $rez[0] = Binary($MRIM_CS_LOGIN_ACK) Then
				ExitLoop
			EndIf
		EndIf
	EndIf
Wend

;**************сам клиент********************************************************
$first_ping_msg = $ping_title1 & Binary(0x00000003) & $ping_title2 & $RESERVED
TCPSend($socket_srv,$first_ping_msg)
$timer = TimerInit()
$counter_seq = 0x00000003
$interval_ping = Dec(Hex(_Rotate_srv($interval)))*1000
While 1
	;$msg_srv = TCPRecv($socket_srv, 2048)
	$dif = TimerDiff($timer)
	If $dif >= $interval_ping Then
		$counter_seq = $counter_seq+1
		$ping_msg = $ping_title1 & Binary($counter_seq) & $ping_title2 & $RESERVED
		TCPSend($socket_srv,$ping_msg)
		$timer = TimerInit()
	Else
		$counter_seq = $counter_seq+1
		;тут смс сообщения
		$sms_msg = $sms_title1 & Binary($counter_seq) & $sms_title2 & $RESERVED & StringTrimLeft( String($sms_str),2)
		TCPSend($socket_srv,$sms_msg)
		ExitLoop
	EndIf
Wend
TCPCloseSocket ( $socket_srv )
EndFunc			
;функция обрабатывает сообщение сервера
Func _ReadMsgSrv($msg_srv)
Local $rezmsgsrv[2],$lenfullmsg,$lenmsg,$error = -1
If BinaryMid($msg_srv,1,4) = Binary($CS_MAGIC) Then
	$lenfullmsg = BinaryLen($msg_srv)
	;MsgBox(1,"lenfullmsg",$lenfullmsg)
	$lenmsg = Binary(Dec(Hex(BinaryMid($msg_srv,17,4))))
	$lenmsg = Dec(Hex($lenmsg))
	;MsgBox(1,"lenmsg",$lenmsg)
	$rezmsgsrv[0] = BinaryMid($msg_srv,13,4) ;тип пакета
	$rezmsgsrv[1] = BinaryMid($msg_srv,$lenfullmsg-$lenmsg+1,$lenmsg) ;текст сообщения
	Return $rezmsgsrv
EndIf
Return SetError(1,0,-1)
EndFunc  ;==>_ReadMsgSrv

; функция возвращает ip & port сервера
Func _GetMrimIp()
Local $ip[2]
If InetGet("http://mrim.mail.ru:2042/", @TempDir & "\~ipm.tmp") Then
	$ipstr = FileRead(@TempDir & "\~ipm.tmp", FileGetSize(@TempDir & "\~ipm.tmp"))
	$ipstr = StringStripWS($ipstr,8)
	$ipstrlen = StringLen($ipstr)
	$ipstrin = StringInStr($ipstr, ":")
	$ip[0] = StringTrimRight($ipstr,$ipstrlen-$ipstrin+1)
	$ip[1] = StringTrimLeft($ipstr,$ipstrin)
	If $ip[0] <>"" Then
		Return $ip
	EndIf
EndIf
If InetGet("http://mrim.mail.ru:2042/", @TempDir & "\~ipm.tmp") Then
	$ipstr = FileRead(@TempDir & "\~ipm.tmp", FileGetSize(@TempDir & "\~ipm.tmp"))
	$ipstr = StringStripWS($ipstr,8)
	$ipstrlen = StringLen($ipstr)
	$ipstrin = StringInStr($ipstr, ":")
	$ip[0] = StringTrimRight($ipstr,$ipstrlen-$ipstrin+1)
	$ip[1] = StringTrimLeft($ipstr,$ipstrin)
	If $ip[0] <>"" Then
		Return $ip
	EndIf
EndIf
Return SetError(1,0,-1)
EndFunc   ;==>_GetMrimIp

;функция разворачивает  число от клиента
Func _Rotate_cl($val)
	Local $valrot
	$valrot = Binary($val)
	Return $valrot
EndFunc ;==>_Rotate_cl

;функция разворачивает число от сервера
Func _Rotate_srv($val)
	Local $valrot
	$valrot = Binary(Dec(Hex($val)))
	Return $valrot
EndFunc ;==>_Rotate_srv

;функция создает ULP строку(формат протокола)
Func _string_UPL($val)
	Local $bstr,$lenstr
	$bstr = StringToBinary ( $val,4 )
    $lenstr = Binary(BinaryLen($val))
	$string_UPL = $lenstr & $bstr
	$string_UPL = Binary($string_UPL)
    ;MsgBox(1,"",$lenstr&"\"& $bstr)
	Return $string_UPL
EndFunc ;==>_string_UPL

;функция создает ULP_RU строку(формат протокола)
Func _string_UPL_RU($val)
	Local $bstr,$lenstr
	$bstr = StringToBinary ( $val,2 )
	;MsgBox(0,"",$bstr)
    $lenstr = Binary(BinaryLen($bstr))
	$string_UPL = $lenstr & $bstr
	;$string_UPL = Binary($string_UPL)
    ;MsgBox(1,"",$lenstr&"\"& $bstr)
	Return $string_UPL
EndFunc ;==>_string_UPL_RU

;заголовок пакета
#cs
u_long      magic;        // Magic
u_long      proto;        // Версия протокола
u_long      seq;        // Sequence
u_long      msg;        // Тип пакета
u_long      dlen;         // Длина данных
u_long    from;        // Адрес отправителя
u_long    fromport;    // Порт отправителя
u_char    reserved[16];    // Зарезервировано
#ce

Код:
#include <AutoItMA.au3>
_SendSMS("[email protected]","pass","+7917-XXX-XX-XX","Привет Чувак!")
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
довольно часто начало выпадать : Subscript used with non-Array variable.
Код:
$socket_srv = TCPConnect( $ip_srv[0], $ip_srv[1] )
$socket_srv = TCPConnect( $ip_srv^ ERROR
 

Arei

Скриптер
Сообщения
938
Репутация
115
Как получить список контактов использую этот протокол.Заранее спасибо.
 

warmroof

Новичок
Сообщения
10
Репутация
0
Доделайте кто-нибудь функцию. Что бы отлавливала ошибки на всех этапах отправки. Интересуют ответы о статусе SMS, а то не понятно отправилось оно иногда или нет. А если нет то почему?

От себя добавлю вот этот измененный кусок кода. Не понятно зачем автор использовал сохрание в файл, а также не ясно значение Return SetError(1,0,-1) :scratch:
Код:
;***************создание сокета для подкл. к серверу*********************************
$socket_srv = -1 ;декларирование переменной
Do
	$ip_srv = _GetMrimIp()
;проверяем вернулся ли массив
    if VarGetType($ip_srv) = "Array" Then
		$socket_srv = TCPConnect( $ip_srv[1], $ip_srv[2] )
	EndIf
	If @error Then
		MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
	EndIf
Until $socket_srv <> -1

;тут все по старому

; функция возвращает ip & port сервера
Func _GetMrimIp()
local $ip
$mserver=BinaryToString(InetRead("http://mrim.mail.ru:2042/",8))
if $mserver Then $ip=StringSplit($mserver, ':')
if VarGetType($ip) = "Array" Then Return $ip
Return SetError(1,0,-1)
EndFunc   ;==>_GetMrimIp
 

Jan-Jak

Новичок
Сообщения
45
Репутация
1
Скачать файл

AutoItMA.au3
Размер:8.04 кБ
Закачан:27 мар 2011 21:09
Скачан последний раз:19 мар 2013 22:47
Файл проверен Dr.Web:Вирусов нет
md5:c820f1041cf72edeb53e55d24ae96175
Закончился срок хранения файла. Файл удален с сервиса.
Залейте заново.
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Есть возможность добавить прокси?
 

mef-t

Осваивающий
Сообщения
306
Репутация
30
Нет, не секрет.
Изучаю и экспериментирую на работе.
А там стоит HTTP прокси.
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Заинтересовался, просьба пере-выложить если у кого завалялась. :smile:
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Пробовал отправить самому себе :-X, не получилось. И так и эдак. Вроде бы все правильно, № билайновский. Перешел по ссылке в начале темы(о протоколе) - страницы нет, "лавочку" прикрыли что ли? :smile:
 
Верх