Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Отправка смс


Автор: XbiT 3.7.2006, 22:41
Пишу программу которая должна отправлять смс с сайта www.kyivstar.net/ru/sms/form/
Возникла проблемма с получением антиспам кода. Вместо полной картинки отображаеться лишь 
Код

‰PNG


Вот собственно код на дельфи:
Код

const nl:string = #10;
procedure TForm1.Button1Click(Sender: TObject);
var
  sock : TSocket;
  host : TSockAddr;
  WSAData:TWSAData;

function sock_send(s : string) : boolean;
Var
  i : longint;
begin
  sock_send := true;
  for i := 1 to length(s) do
    if send(sock, s[i], 1, 0) = SOCKET_ERROR then
      begin
        sock_send := false;
        break;
      end;
end;
function sock_recv(Var s : string) : integer;
Var
  i, recvsize, recvsum: integer;
  buf : array [1..255] of char;
begin
  s := '';
  recvsum := 0; recvsize := 0;
  repeat
    recvsize := recv(sock, buf, sizeof(buf), 0);
    for i := 1 to recvsize do
      s := s + buf[i];
    inc(recvsum, recvsize);
  until recvsize = 0;
  sock_recv := recvsum;
end;

Var
  s, code : string;
  t : integer;
begin
  WSAStartUp($101,WSAData);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;

  host.sin_family := AF_INET;
  host.sin_port := htons(80);
  host.sin_addr.S_addr := inet_addr('193.41.60.108');

  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  //запрос для получения страницы с формой
  s := 'GET /ru/sms/form/ HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+nl;

 //отправляем запрос
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;

  t := sock_recv(s);
  memo1.Lines.Add('Получено байт: ' + inttostr(t));
  code := copy(s, pos('code=', s)+5, 4); //берем код из кукиса

  memo1.Lines.Add('Код: '+code);
  memo1.Lines.Add(s);

  //запрос для получения картинки с кодом
  s := 'GET /sms_code_image.gif HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+'Referer: http://www.kyivstar.net/ru/sms/form/'+nl+'Cookie: code='+code+nl+nl;

  closesocket(sock);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;

  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  memo1.Lines.Add(s);
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;

  t := sock_recv(s);
  memo1.Lines.Add('Получено байт: ' + inttostr(t));
  memo1.Lines.Add(s);

  closesocket(sock);
  WSACleanup();
end;

прошу извинить за немного кривой код smile 

Автор: _hunter 4.7.2006, 10:18
отображается где? 

Автор: dumb 4.7.2006, 11:09
товарищ! качая PNG-image, не забудь использовать соответствующий компонент для его отображения. memo таки не панацея. smile 

Автор: XbiT 4.7.2006, 14:13
_hunter, в memo

dumb, но всё таки в memo ведь должен отображаться "исходник" картинки?

Может кто-нибуть подскажет как правильно получать картинку с кодом? 

Автор: _hunter 4.7.2006, 14:40
исходник там отображается, но только до пераого #0.
можно просто позаменять все #0 в строке на пробелы 

Автор: XbiT 4.7.2006, 15:10
упс, а точно до первого #0.

_hunter, огромное спасибо!  smile  

Автор: XbiT 4.7.2006, 15:57
И на этом проблемы не закончились smile
Почему то не хочет отправляться смс smile
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  sock : TSocket;
  host : TSockAddr;
  WSAData:TWSAData;

function sock_send(s : string) : boolean;
Var
  i : longint;
begin
  sock_send := true;
  for i := 1 to length(s) do
    if send(sock, s[i], 1, 0) = SOCKET_ERROR then
      begin
        sock_send := false;
        break;
      end;
end;
function sock_recv(Var s : string) : integer;
Var
  i, recvsize, recvsum: integer;
  buf : array [1..255] of char;
begin
  s := '';
  recvsum := 0; recvsize := 0;
  repeat
    recvsize := recv(sock, buf, sizeof(buf), 0);
    for i := 1 to recvsize do
      s := s + buf[i];
    inc(recvsum, recvsize);
  until recvsize = 0;
  sock_recv := recvsum;
end;

Var
  s, code : string;
  t, i : integer;
  fo : textfile;
begin
  WSAStartUp($101,WSAData);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;

  host.sin_family := AF_INET;
  host.sin_port := htons(80);
  host.sin_addr.S_addr := inet_addr('193.41.60.108');

  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  //запрос для получения страницы с формой
  s := 'GET /ru/sms/form/ HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+nl;

 //отправляем запрос
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;

  t := sock_recv(s);
  memo1.Lines.Add('Получено байт: ' + inttostr(t));
  code := copy(s, pos('code=', s)+5, 4); //берем код из кукиса

  memo1.Lines.Add('Код: '+code);
  memo1.Lines.Add(s);

  //запрос для получения картинки с кодом
  s := 'GET /sms_code_image.gif HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+'Referer: http://www.kyivstar.net/ru/sms/form/'+nl+'Cookie: code='+code+nl+nl;

  closesocket(sock);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;

  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  memo1.Lines.Add(s);
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;

  t := sock_recv(s);
  memo1.Lines.Add('Получено байт: ' + inttostr(t));
  while pos(#0, s)>0 do
    s[pos(#0, s)] := ' ';

  memo1.Lines.Add(s);
  assignfile(fo, '1.png'); rewrite(fo);
  t := pos('PNG', s)-1;
  for i := t to length(s) do
    write(fo, s[i]);
  closefile(fo);

  //отправка сообщения
  s := 'POST /ru/sms/form/ HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+'Referer: http://www.kyivstar.net/ru/sms/form/'+nl+'Cookie: code='+code+nl+'Content-Length: 78'+nl+'Content-Type: application/x-www-form-urlencoded'+nl+nl+'submitted=true&mobcode=097&number=9604122&lat=0&message=12345%21&antispam='+code+nl+nl;
  closesocket(sock);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;

  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  memo1.Lines.Add(s);
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;

  //получение статуса сообщения
  s := 'GET /ru/sms/form/?request_status=true HTTP/1.1'+nl+'Host: www.kyivstar.net'+nl+'Accept: */*'+nl+'Referer: http://www.kyivstar.net/ru/sms/form/'+nl+'Cookie: code='+code+nl+nl;
    closesocket(sock);
  sock := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if sock = INVALID_SOCKET then
    begin
      memo1.Lines.Add('INVALID_SOCKET error');
      exit;
    end;
  //коннектимся к серверу
  if connect(sock, host, SizeOf(host)) > 0 then
    begin
      memo1.Lines.Add('connect() error');
      exit;
    end;

  memo1.Lines.Add(s);
  if not sock_send(s) then
    begin
      memo1.Lines.Add('sock_send() error');
      exit;
    end;
  t := sock_recv(s);
  memo1.Lines.Add('Получено байт: ' + inttostr(t));

  memo1.Lines.Add(s);
  closesocket(sock);
  WSACleanup();
end;


Запросы кажеться правильные, хотя возможно именно в них и проблема...  

Автор: _hunter 4.7.2006, 16:25
ну так сравни запросы браузера со своими.
+ ответ сервера почитай
++ ты уверен что ты правильно картинку распознал? 

Автор: RA 4.7.2006, 16:45
Цитата(_hunter @  4.7.2006,  16:25 Найти цитируемый пост)
ты уверен что ты правильно картинку распознал? 


Ахтунг-Ахтунг!  smile  щас посмотрел как там всё работает, код картинки передаётся в кукизе браузеру, тоесть распознавать её  не составит проблемы smile

Добавлено @ 16:50 
XbiT, а ты отправляеш куку ? 

Автор: XbiT 4.7.2006, 17:04
   
Код

POST /ru/sms/form/ HTTP/1.1
Host: www.kyivstar.net
Accept: */*
Referer: http://www.kyivstar.net/ru/sms/form/
Cookie: code= +code
Content-Length: 78
Content-Type: application/x-www-form-urlencoded

submitted=true&mobcode=097&number=9604122&lat=0&message=12345%21&antispam=+code




Вот запрос, кукиз с кодом отправляю... 
в переменной code сохраняеться код.
Но смс упорно не хочет отправляться smile 

Автор: XbiT 5.7.2006, 22:22
Сейчас проверил запросыс программой Coyote(тоже отправляет смс), кажеться всё правильно. Но всё равно не отправляеться smile(( 

Автор: RA 6.7.2006, 01:37
Ну вобщем у меня всё получилось, правда я использовал в качесве HTTP клиента компоненты ICS.
Если надо могу пример скинуть.

Как я понял грабли именно тут  



Код

http://www.kyivstar.net/ru/sms/form/?


а и менно в наличии вопросительного знака в конце  smile для запроса POST , ибо как только я его туда поставил усё заработало у меня, а до этого бяка всякая была.


      

Автор: XbiT 6.7.2006, 20:48
скинь пример плз denis90{at}gmail{dot}com 

Автор: RA 7.7.2006, 00:52
sent 

Автор: XbiT 8.7.2006, 12:54
RAdmin, спасибо, мэйл получил. буду разбираться... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)