Добрый вечер. Никто не знает как можно отправить сообщение на агент, я уже покопавшись нашел решение для авторизации и отправки смс, но отправку обычного сообщения сделать не могу. Прошу помочь, очень долго уже решаю этот вопрос. За ранее очень благодарен. Вот собственно код http://www.codepaste.net/e1vhfu
http://agent.mail.ru/ru/developers/protocol.html?Submit=%D0%9F%D1%80%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D1%8E+%D1%81%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5
zoke, это я видел, спасибо. Но я уже разобрался. Вот метод отправки сообщения Code: public void Send_Message(string to, string text) { mrim_packet_header Pack = new mrim_packet_header(Msg.CS_MAGIC, Msg.PROTO_VERSION, User_Struct.Seq, Msg.MRIM_CS_MESSAGE, 1, 0, 0, 0, 0, 0, 0); Pack.Add_Date_UL(new long[] { 1 }); Pack.Add_Date_LPS(new string[] { to.Trim(), text.Trim(), text.Trim() }); byte[] Auth2 = Pack.Generat_Packet(); Console.WriteLine(BitConverter.ToString(Auth2)); Sock.Send(Auth2); //Buf = new byte[48]; //Sock.Receive(Buf); }
Только тут уже возник вопрос добавления контакта. Кажется это сделать никак, по протоколу следую, все равно не то. Не кто не знает как добавить контакт?
Code: int mmp_add_contact(SOCKET sock,char *email) { char *buf=(char *)_alloc(opt.message_size*100); // а вот от балды char *p; unsigned int size=8,n,i; // ибо первые 4 нуля // LPS email p=email; while(*p++!=0); n=(p-email)-1; my_memcpy(&buf[size],&n,4); size+=4; my_memcpy(&buf[size],email,n); size+=n; // LPS add_name wchar_t add_name[28]; // имя в UNICODE как оно будет зватся у нас в контакт листе n=wsprintfW(add_name,L"%I64x",__rdtsc())*2; //n=sizeof(add_name)-sizeof(wchar_t); my_memcpy(&buf[size],&n,4); size+=4; my_memcpy(&buf[size],(char *)add_name,n); size+=n; size+=4; // 4 байта нулей p=(char *)_alloc(opt.message_size*100); // терь формируем мессадж n=2; i=0; my_memcpy(&p[i],&n,4); i+=4; // типа 2 поля // LPS ник который отобразится в popop в unicode возмем такойже //wchar_t cont_nick[]=L"Gar|k"; //n=sizeof(cont_nick)-sizeof(wchar_t); //wchar_t cont_nick[28]; n=wsprintfW(add_name,L"%I64x",__rdtsc())*2; my_memcpy(&p[i],&n,4); i+=4; my_memcpy(&p[i],(char *)add_name,n); i+=n; // LPS сообщения которое доставится char *m=(char *)opt.format_message; wchar_t *messagew; if(opt.count_url>0) { messagew=(wchar_t *)_alloc(opt.message_size+1024); n=wsprintfW(messagew,(LPCWSTR)opt.format_message,opt.list_url[my_rand2(0,opt.count_url)]); n=(n*sizeof(wchar_t)); m=(char *)messagew; }else { n=(opt.message_size)*sizeof(wchar_t); } my_memcpy(&p[i],&n,4); i+=4; my_memcpy(&p[i],m,n); i+=n; if(opt.count_url>0) _free(messagew); // теперь все это дело загоняем в base64 base64_encode(p,i,&buf[size+4],72); _free(p); // щитаем размер base64 p=&buf[size+4]; while(*p++!=0); n=(p-&buf[size+4])-1; my_memcpy(&buf[size],&n,4); size+=4; size+=n+4; // ибо в конце нулик завершающий n=SendPack(sock,MRIM_CS_ADD_CONTACT,size,buf); _free(buf); return n; }
Хотя врятли получиться. Gar|k, скажите пожалуйста, какой способ вы использовали? Вот например я находил такой способ Но он не идет, видимо старый.
2 Vlad_IT, способ который я использовал? Снифаем трафик выбираем из него нужный пакет. Разбираем его в hex редакторе и повторяем его программно. Функция которую я написал справедлива для протокола агента версии 5.7 Ну по коду смотри. В общем все тоже самое что ты и написал по сути, не идет - проверь версию протокола которую используешь
У меня вот так написано. PROTO_VERSION = 0x10008; Но как понять какая это версия?. Из hex в dec выходит 65544. Это значит 6.5544, точнее 6.5??? Когда делал версию 1.7, вот так PROTO_VERSION = ((((long)(1)) << 16) | (long)(7)); то даже авторизация не удавалась. На 5.7 тоже не идет PROTO_VERSION = ((((long)(5)) << 16) | (long)(7));
для версии под которой работает 5.7 (1.22) Code: // версия протокола #define PROTO_VERSION_MAJOR 1 #define PROTO_VERSION_MINOR 22 #define PROTO_VERSION ((((u_long)(PROTO_VERSION_MAJOR))<<16)|(u_long)(PROTO_VERSION_MINOR)) #define PROTO_MAJOR(p) (((p)&0xFFFF0000)>>16) #define PROTO_MINOR(p) ((p)&0x0000FFFF)
Тоже не идет((. А если я попрошу кого нибудь скомпилировать мне консольный файл, который принимает два параметра запуска, адрес и текст сообщения для выполнения только одной функции, добавления контакта, это будет слишком нагло? Я знаю, это конечно нагло. Но и я когда нибудь помогу) Всем спасибо, разобрался)