Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Общение с http формами.   Найти похожие ветки 

 
Atomik   (2004-03-22 22:41) [0]

Уважаемые мастера и знатоки :) Я хотел бы узнать, как возможно из соей программы заполнить несколько форм на http странице и "нажать" кнопку послать. Желательно с примером. Вот например для добавления вопроса в форум. Заранее огромное спасибо!


 
Piter ©   (2004-03-23 00:12) [1]

В чем проблема конкретно? Там ничего сложного нету.
Коннектишься к хосту (да хотя бы обычным TClientSocket), выдранному из URL по определенному порту (зачастую 80) и передаешь комманды, ждешь ответа. Вот например перехват трафика для этого сайта при запросе страниц.
Это посылается серверу после коннекта:

GET http://delphimaster.net/view/15-1074376310/
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
Accept-Language: ru
Cookie: small_thread=0; delphi_name=[ИМЯ]; delphi_email=; id=[тут должно быть нечто]; lg=[тут должно быть нечто]; ChatColor=EF4F78
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; MyIE2)
Host: www.delphimaster.ru
Proxy-Connection: Keep-Alive


Соответственно

1) GET <имя странички которую хочу>. Тут все понятно
2) Accept <bla-bla> это вроде того, что ты готов принять. Можешь писать здесь все подряд, мол готов принять все :)
3) Accept-Language: ru - сообщаешь свой язык. Теоретически сервер может выдавать разныую инфу для разных языков. Но по-моему, это не используется. Или очень редко
4) Cookie: <bla-bla> - сообщаешь свои куки для этого сайта. Это чтобы в поле ответа в "Ваше имя" сервер подставил что надо.
Подозреваю, что id и lg используется, чтобы не вводить пароль каждый раз.
5) User-Agent: <bla-bla> - пишешь какая программа посылает запрос (тут броузер пишет свою идентификацию, Опера например нетскейпом может прикинуться). Опять же теоретически сервер может выдавать разную инфу для разныз броузеров, но это редко используется.
6) Host: www.delphimaster.ru - хост, куда коннектился. По-моему, можно и не указывать, мало кто использует данную информацию
7) Proxy-Connection: Keep-Alive - чтобы прокси (если через нее соединение идет) не кешировала данный запрос.
В общем то и все.
А, вспомнил! После GET"а ты должен послать код перевода строки (в Delphi это #13#10). После запроса должен послать два кода перевода строки. После чего ждешь ответа.

А вот пример ответа:

HTTP/1.1 200 OK
|перевод строки|
Via: 1.0 MAIL
Proxy-Connection: Keep-Alive
Content-Length: 12479
Content-Type: text/html; charset=windows-1251
Server: 0W/0.6d
Date: Tue, 12 Aug 2003 18:01:08 GMT
charset: windows-1251

|двойной перевод строки>|

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<TITLE>Мастера DELPHI
.....
<и дальше пошел текст странички>


Ну тут понятно. "HTTP/1.1 200 OK" - означает что сервер обработал успешно запрос и сча тебе инфа посыпится :)
После этого идет код перевода строки.
Via: 1.0 MAIL - не знаю что это. Может, McSimm разъяснит
Content-Length: 12479 - длина самого текста странички, которая будет выдана.
charset=windows-1251 - кодирвока выдаваемой страницы
Ну остальное и так понятно
После заголовка идет код перевода строки (или два - не помню).

После чего посылается непосредственно текст страницы. Размер этого текста будет как раз равен Content-Length

Еще сервер может тебе выдать информацию архивированную, он об этом сообщит в заголовке параметром gzip. Это если ты попросишь.

---------------------------------------------------------------------------------------------------------------

А вот насчет поста, смотри пример:

POST http://www.beeonline.ru/servlet/send/sms/ HTTP/1.0
Accept-Language: ru,ja;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.7 [en] (Win95; I)
Referer: http://BeeOnLine-Express
Host: www.beeonline.ru
Content-Length: 91

[ПАРМЕТРЫ]


Указываешь имя апплета, http://www.beeonline.ru/servlet/send/sms/
для этого форума будет http://www.delphimaster.ru/cgi-bin/forum.pl

После заголовка двойной перевод строки и идут параметры запроса.

Допустим нужно передать параметры name, email.
Ты хочешь передать их значения "Undert" и "noemail@noemail.com" соответственно.

Тогда вместо [ПАРМЕТРЫ] будет

name=undert&email=noemail@noemail.com

Никаких кавычек. Разделение между параметрами "&"

допустим, для ответа на вопрос в этом форуме надо передать параметры апплету http://www.delphimaster.ru/cgi-bin/forum.pl такие:

name, email, text, n, id

(может еще чего надо, все это можно посмотреть в исходном коде HTML этой страницы).

Да, еще один пункт, нельзя передавать значение параметров по русски. Ты наверное видел как они выглядят, типа "%CC%E0%F1%F2%E5%F0%E0+%C4%E5%EB%FC%F4%E8" - это означает "Мастера Дельфи"

Для перевода русского текста в нужные символы используй:

function EncodeContent(const msg : String) : String;
var
   I : Integer;
begin
   Result := "";
   for I := 1 to Length(msg) do begin
       if msg[I] = " " then
           Result := Result + "+"
       else if msg[I] in ["a".."z", "A".."Z", "0".."9"] then
           Result := Result + msg[I]
       else
           Result := Result + "%" + IntToHex(ord(msg[I]), 2);
   end;
end;


 
Piter ©   (2004-03-23 00:28) [2]

Хотя смотря что ты имеешь в виду... может ты про то, чтобы заполнить формы в открытом браузере? Ну тогда это вообще очень сложно, хотя бы из-за того, что ты не знаешь какой у человека браузер...


 
VMcL ©   (2004-03-23 01:33) [3]

>>Atomik  (22.03.04 22:41)

TIdHTTP
?


 
Atomik   (2004-03-23 11:35) [4]

Спасибо за подробный ответ! Именно это я и хотел сделать, теперь буду пытаться. Если что - спрошу ещё :)


 
Atomik   (2004-03-23 12:50) [5]

Вот и появился вопрос:
Задача: послать смс с сайта:

procedure PostData(P_phone_number, P_msg: String);
var
 MemResponse: TStringStream;
 MemSource: TStringStream;
begin
  FResult:="";
  FContent:="phone="+P_phone_number+"&"+"message="+ P_msg+"#10";
  MemResponse:=TStringStream.Create("");
  MemSource:=TStringStream.Create(FContent);
  IdHTTP1.Post("http://editorial.rostov.tele2.ru/?page=tele2rov_sms&t2page=servises_sms",MemSource,MemResponse);
  FResult:=MemResponse.DataString;
  MemSource.Free;
  MemResponse.Free;
end;
var
  i:integer;
  f:textfile;
begin
  fcontent:="";
  for i:=0 to memo1.Lines.Count+1 do
  fcontent:=fcontent+" "+memo1.Lines[i];
  PostData(edit1.Text, fcontent):
  assignfile(f,"test.txt");
  rewrite(f);
  writeln(f,fresult);
  closefile(f);

end;


Вот этот код не работает: bar recquest

В полях IDhttp1 я записал:

Host: http://www.rostov.tele2.ru/
ProtocolVersion: pv1_1
в [+]Request:
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, */*
Referer: http://editorial.rostov.tele2.ru/?page=tele2rov_sms&t2page=servises_sms
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: http://www.rostov.tele2.ru/

Подскажи, что не так делаю?


 
Piter ©   (2004-03-23 19:55) [6]

Ну тут так сложно сказать... экспериментировать за тебя я не буду, конечно... но кое какие соображения выскажу:

1) http://editorial.rostov.tele2.ru/?page=tele2rov_sms&t2page=servises_sms - правильный URL? Точно? Как определил?

2) У тебя передается P_msg. А оно по правилам заполнено? Ты прочитал из моего предыдущего поста:

Да, еще один пункт, нельзя передавать значение параметров по русски. Ты наверное видел как они выглядят, типа "%CC%E0%F1%F2%E5%F0%E0+%C4%E5%EB%FC%F4%E8" - это означает "Мастера Дельфи"

Для перевода русского текста в нужные символы используй:

function EncodeContent(const msg : String) : String;
var
  I : Integer;
begin
  Result := "";
  for I := 1 to Length(msg) do begin
      if msg[I] = " " then
          Result := Result + "+"
      else if msg[I] in ["a".."z", "A".."Z", "0".."9"] then
          Result := Result + msg[I]
      else
          Result := Result + "%" + IntToHex(ord(msg[I]), 2);
  end;
end;


В твоем случае, например:

P_msg:= "Это тестовое SMS";
P_msg:= EncodeContent(P_msg)


3) К теме не относится, но вместо

fcontent:="";
 for i:=0 to memo1.Lines.Count+1 do
 fcontent:=fcontent+" "+memo1.Lines[i];


наверное, можно просто написать

fcontent::= Memo1.Text


 
Atomik   (2004-03-23 20:09) [7]

Все так, как ты написал делаю. :)))
Когда я жму Ctrl+F9 и выполняется код отправки он мне пишет останавливается и выдает ошибку:
bad request
???
Вот ещё вопрос как надо заполнять поля хост и реферер? Я правильно сделал?


 
Piter ©   (2004-03-23 20:10) [8]

И вообще

for i:=0 to memo1.Lines.Count+1 ???

Может все таки to memo1.Lines.Count - 1 ?


 
Atomik   (2004-03-23 21:02) [9]

Нет, не в этом дело :(
Вот смотри, что выдает:
"HTTP/1.1 400 Bad Request"


 
Atomik   (2004-03-23 21:09) [10]

http://delphi84.valuehost.ru/cgi-bin/forum.pl?id=1075556382&n=4
вот тут в принципе описывается, что делать. Но в дельфи 7 вроде нет компонента clientsocket


 
Verg ©   (2004-03-23 21:29) [11]


> Но в дельфи 7 вроде нет компонента clientsocket


Ты будешь смеяться, но вопрос "как вернуть TClientSocket в Delphi7" задается на этом форуме раз по 10-ять на неделю.

http://delphimaster.net/view/15-1074376310/
http://delphimaster.net/view/15-1074376310/
http://delphimaster.net/view/15-1074376310/
http://delphimaster.net/view/15-1074376310/
http://delphimaster.net/view/15-1074376310/

И т.д и т.п. и зае. и вообще...


 
Verg ©   (2004-03-23 21:36) [12]

Но больше всех "номеров" мне понравился вот этот

> http://delphimaster.net/view/15-1074376310/


....в цирк после этого больше не пойду - не за чем.
:)


 
Atomik   (2004-03-23 22:31) [13]

Установил я Клиент сокет :)) Переделал так:
procedure TForm1.Button1Click(Sender: TObject);

begin
ClientSocket1.host:="http://www.rostov.tele2.ru/";
clientsocket1.Port:=80;
clientsocket1.Active:=true;

end;

procedure TForm1.ClientSocket1Connect(Sender: TObject;
 Socket: TCustomWinSocket);
begin
s1:="deferto=&adv_year=&send=send&confirm_key=D1qFhsBdtZ&confirm_code=7284&destination_number_from=ordinary&network_code  =6&ph  one=5811808&message=body&mlength=152&phone_answer_number=";
S := "POST http://editorial.rostov.tele2.ru/?page=tele2rov_sms&t2page=servises_sms HTTP/1.0"+#13#10+
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"+#13#10+
"Accept-Language: ru"+#13#10+
"Content-Type: application/x-www-form-urlencoded"+#13#10+
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"+#13#10+
"Content-Length: "+inttostr(length(s1))+"#13#10"+
"Connection: Keep-Alive"+"#13#10"+
"Cache-Control: no-cache"+"#13#10#13#10"+
"phone=3465424&message=asd";

ClientSocket1.Socket.sendtext(S);

end;

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
begin
clientsocket1.Active:=false;
end;

end.


На что я получаю такое: "Windows socket error: затребованное имя допустимо и оно найдено в базе данных, но для имени отсутсвуют связанные с ним данные, который были разрешены для него(11004), on API "Asyc Lookup"
Я блин матом ругаться уже хочу :)))
Народ, кому не влом попробуте у себя скомпилить, плз!! Очень хочется её сделать :)


 
Verg ©   (2004-03-23 23:01) [14]

Брось ты эти http-формы, потренируйся пока "на тряпочных" - возьми, попробуй сконнектится с любым SMTP сервер, да хоть с mail.ru...

Сколько раз говорено - "Рясу в джинсы не заправляют, а в конце молитвы говорят Аминь, а не п....ц".
Так и свойство host предназначено для имен хостов, а не для URL-ев.

Понимашь разницу между "http://www.rostov.tele2.ru/" и "www.rostov.tele2.ru", нет ?
Может сначала на "тряпочных" потренируешься? А потом уже HTTP, FTP, и проч...?


 
Atomik   (2004-03-23 23:11) [15]

Спасибо за информативный и дельный совет :(


 
Verg ©   (2004-03-24 00:54) [16]

Хм. Обижаться, значит...

s1 - у тебя что ?
Хиде ты информацию из s1 собирался отправить серверу (хост которого ты назвал оскорбитьлными для ClientSocket-а префикс-суффиксными обрамлениями типа http:// и /) ?
Насколько я вижу, серверу ты собрался передать только длину s1, чем ты его очень сильно разочаруешь, даже если внемлешь "информативному и дельному" моему совету, и TCP-коннект с ним все-таки состоится.
Запрос к http серверу состоит из двух частей - заголовок (Header) и тело (Content), разделенных между собой пустой строкой (заметте - и ответ сервера клиетну тоже). В принципе, Content может и отсутствовать вовсе, как, например, чаще всего бывает в запросах типа GET.
Но у тебя - POST. И все данные, что ты хочешь адресовать форме должны быть заключены в Content - то, что после Header, отделяясь от него пустой строкой. Conent, если он вообще присутствует (о чем говорит ненулевое поле Content-Length в заголовке), должен, просто обязан содеражат кол-во байтов (символов) точно равное Content-Length. Ни больше, ни меньше.
Мало того, он должен быть специальным образом закодирован, а имеено так, чтобы не содержать спец-символов контента (&, =, например) в значениях его полей.
А для этого, в свою очередь, надо знать способ этой кодировки, принятый не помню, то ли в протоколе http, то ли в MIME. Content-Length, тем временем, должен указываться размером вместе с накладными расходами на эту кодировку....
Еже пара - тройка десятков "тонкостей" (!), описанных в паре-тройке десятков RFC и твой HTTP клиент будет как "взрослый".
Там еще может быть прокси, и со своим способом авторизации, а еще авторизация может быть и у самого (Усама, Блин) веб-сервера...

Слушай, я уже устал....


 
Atomik   (2004-03-24 10:37) [17]

Спасибо, я разобрался - все получилось.


 
Piter ©   (2004-03-24 19:02) [18]

Atomik   (24.03.04 10:37) [17]
Спасибо, я разобрался - все получилось


Да? ОЧЕНЬ СТРАННО...

Atomik (23.03.04 20:09) [7]
выполняется код отправки он мне пишет останавливается и выдает ошибку:
bad request


кто тебе выдает такую ошибку?

И вообще. Ну блин, ну почему нельзя самому разобраться. Полез я на твою http://editorial.rostov.tele2.ru/?page=tele2rov_sms&t2page=servises_sms

Указываешь имя апплета, http://www.beeonline.ru/servlet/send/sms/

А я вот посмотрел исходный код странички, там такое:

<form action="http://rocc.ru/cgi-bin/sms33.cgi" method="POST" name="Send_Message" >

Тебе же нужно указать путь к скрипту, а не путь к странице!!!

Значит, адрес аплета у тебя http://rocc.ru/cgi-bin/sms33.cgi

вообще на левом сайте, на этом твоем http://editorial.rostov.tele2.ru только форма лежит...


 
nikkie ©   (2004-03-24 20:01) [19]

>Piter
про апплет ты зря. серверное приложение никто апплетом не называет.
имхо, термин используется применительно к
1. Java applets
2. Control panel applets


 
Карелин Артем ©   (2004-03-25 12:56) [20]

nikkie ©   (24.03.04 20:01) [19]
Сервлеты есть. А апплет переводится как маленькая программа, или как IE переводит "приложеньице"


 
Reindeer Moss Eater ©   (2004-03-25 13:06) [21]

Значит, адрес аплета у тебя http://rocc.ru/cgi-bin/sms33.cgi
вообще на левом сайте, на этом твоем http://editorial.rostov.tele2.ru только форма лежит...


Если апплет (именно апплет) загружен с rocc.ru, то он никак не может отправить что бы то ни было на другой хост.

Нет там никакого апплета.


 
Piter ©   (2004-03-29 19:16) [22]

nikkie (24.03.04 20:01) [19]
про апплет ты зря. серверное приложение никто апплетом не называет


блин, ну извините. Я в том смысле, что форма находится на http://editorial.rostov.tele2.ru, а сама программа (PHP или там Perl или еще чего) находится на rocc.ru
Я все время апплетами называл



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.033 c
3-1082349604
Slavik_v
2004-04-19 08:40
2004.05.16
Суммирование записей с одиниковым значением в поле Field


1-1083228255
Senator
2004-04-29 12:44
2004.05.16
MDI


9-1073140938
Gnom
2004-01-03 17:42
2004.05.16
ДиректХ


3-1082387534
Vit
2004-04-19 19:12
2004.05.16
Какая функция преобразует String в Date


3-1082448180
Vit
2004-04-20 12:03
2004.05.16
QUERY





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский