witam, jestem poczatkujacym programista wiec prosze o wyrozumiałość.
mam nastepujacy problem, chcialbym napisac program który by po podaniu nazwy uzytkownika i hasla logowal sie w serwisie www np. nasza-klasa.pl albo fotka.pl i po udanym zalogwaniu zapisal strone na dysk (w firefox ctrl-s). programuje w codegear 07 i szukam artykulow o indy a dokladniej komponencie TidHttp bo myslalem ze to mi pomoze ale w internecie nie ma nic nawet na oficjalnej stornie indy, zadnej wzmianki jak sie zalogowac. ;-(
Powinno Ci pomóc. (Kawałek kodu odpowiedzialnego za logowanie na plemiona)
TStringStream *ODBIERA=new TStringStream("");
TStringStream *WYSYLA=new TStringStream("");
WYSYLA->WriteString("user="+Edit1->Text+"&clear=true"+"&password="+Edit2->Text+"&server="+ComboBox1->Text);
__try
{
IdHTTP1->Post("index.php?action=login",WYSYLA,ODBIERA);
}
__except (2)
{
}
Location=IdHTTP1->Response->Location;
__try
{
IdHTTP1->Get(Location,ODBIERA);
}
__except (2)
{
}
I tak się bawisz dopóki serwer Cię nie przyjmie pod swoje skromne progi... musisz jeszcze obsłużyć ciasteczka. :)
Pozdrawiam
hmm zaraz sprubuje to uzyc, napisalem taka funckcje szukajaca to co potrzebuje
kodzik=Indy->Get("http://nasza-klasa.pl/register").c_str();
Memo1->Lines->Add(kodzik.c_str());
plik << kodzik;
fstream plik2("data.dat",ios::in);
string dane, dane2;
int poz1=0, poz2=0;
string szukana("href=");
while(!plik2.eof())
{
getline(plik2,dane);
poz1=dane.find(szukana);
if (poz1>0) {
dane2=dane.substr(poz1,szukana.length());
Memo2->Lines->Add(dane2.c_str());
}
niestety plik jest tak zbudowany dzieki opcji get ze nie ma znaku powrotu karetki i jeden wiersz jest bardzo dluuuugi :/, a potrzebuje w nim znaleŹĆ wszystkie teksty "szukana" a nie tylko pierwszy na ktory program sie natknie jak to zrobic????
jak sie poslugiwac ciasteczkami moglibyscie mi to wyjasnic lopatologicznie (pierwszy raz pisze program klient -serwer) i nieznam sie na na tych wszystkich ciasteczkach protokolach etc..
i à propos kod strony odpowiadajacej za logowanie wyglada nastepująco:
<a href="/login" onclick="return mini_login_toggle();">Zaloguj</a></li></ul></div> <form id="mini_login" class="mini_form" action="/login" method="POST" accept-charset="UTF-8">
<div><label for="mini_login_login">Login:</label><input type="text" size="10" name="login" id="mini_login_login"></div>
<div><label for="mini_login_password">Hasło:</label><input type="password" size="10" name="password" id="mini_login_password"></div>
<div><input type="hidden" name="target" value="/register">
<input type="image" class="mini_form_button" src="http://static.nasza-klasa.pl/img/mini_login_submit" alt="Zaloguj"></div>
</form>
poradzilem sobie z znajdowaniem poszczegolnej wartosci w pliku i zapisaniem jej do pliku :)
mam nastepny problem [!!!]
fstream plik4 ("nkdata2.dat", ios::in);
int **wsk=new int*[sizeof(plik4)];
for (int i=0; i<sizeof(plik4); i++)
wsk[i]=new int[1];
for (int i=0; i<sizeof(plik4); i++) wsk[i][1]=0;
string *tab2= new string[sizeof(plik4)];
for (int i = 0; i < sizeof(plik4); i++) {
plik4>>wsk[i][0];
}
for (int i = 0; i < sizeof(plik4); i++)
for (int j = 0; j < sizeof(plik4); j++)
if (wsk[i][0]==wsk[j][0]) {
wsk[i][1]+=1;
}
for (int i = 0; i < sizeof(plik4); i++)
ListBox1->Items->Add(wsk[i][1]) ;
// delete tab; delete tab2;
}
w pliku nkdata2.dat mam liczby 7 cyfrowe oddzielone enterem,
tworze tablice wsk dwuwymiarawą o wielkosci pliku i laduje do w[i][0] kolejne liczby z pliku.
natomiast
for (int i = 0; i < sizeof(plik4); i++)
for (int j = 0; j < sizeof(plik4); j++)
if (wsk[i][0]==wsk[j][0]) {
wsk[i][1]+=1;
}
ten kod zlicza mi ilosc wystapien tej samej liczby w pliku, jak teraz wypisac tylko po jednej liczbie kazdego rodzaju do ListBoxa?? chce aby program nie wyspisywal tych liczb ktore sie powtarzaja ;P
jak mozna sie zalogowac na naszej-klasie?? ktos wie?
moj kodzik to:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TIdMultiPartFormDataStream *PostData = new TIdMultiPartFormDataStream;
PostData->AddFormField("login", Edit1->Text);
PostData->AddFormField("password", Edit2->Text);
AnsiString LoginResult = Id->Post("http://www.nasza-klasa.pl/", PostData);
delete PostData;
Memo1->Lines->Add(LoginResult);
}
podczas wykonywania wychodzi blad HTTP/1.0 301 Moved Parmanently :/ jak dam AnsiString LoginResult = Id->Post("http://nasza-klasa.pl/", PostData);
zamiast
AnsiString LoginResult = Id->Post("http://www.nasza-klasa.pl/", PostData);
to nie wyskakuje blad lecz zmienna LoginResult wypisuje mi kod storny glownej bez zalogowania czemu strona glowna nie przyjela mi hasla i logiinu uzyttkownika??
czesc sproboj sie zalogowac przez ten adres:
http://nasza-klasa.pl/login
lub
http://www.nasza-klasa.pl/login
bo musisz dane przesłać do logowania nie do strony głównej
a jeśli to nie pomoże to spróbuj jeszcze wypełnić pole remember=1
pozdro arni077
ale jak ? remeber=1?? dalej sie nie laczy dalej ten sam blad HTTP/1.1 302
sobie zainstaluje codegear 07 i spróbuje coś pokombinować bo jeszcze w nim nie robiłem tego
ale spróbuj po prostu dodać
PostData->AddFormField("remember", "1");
i ta linijke tak
AnsiString LoginResult = Id->Post("http://nasza-klasa.pl/login", PostData);
hmm probowalem dalej to samo, a moze zrobic tak zeby jakas funcje ktora wcisnie button "dalej" na stronie ?? bo w sumie on jakos nie chce tego posta zrobic, kolega mi mowil ze to w javie ladniej sie robi ale musze obsluzyc ciasteczka to o co kaman?? kod bledu mowi ze strone przeniesiono a jak wejsc w nasza-klasa.pl/login i przeczytac kod zrodlowy to tam jest forma <input> z metoda post czemu nie dziala ?? ja juz niemam pomyslow
no widzę ten błąd ale jak wpisze złe hasło to juz znika i pisze na stronie ze złe dane
wiem co powoduje ten błąd przekierowanie na inna stronę ale jak wlaczy sie przekierowanie to juz tylko ciasteczka jakos obsluzyc trzeba
masz pomysl ??? ja nigdy sie nie bawilem cisteczkami ani w programowanieu na http ;P poza tym u mnie nawet jak wpiszesz zly nick lub haslo to dalej dupa zbita ten sam blad