PDA

Pogčedajte punu verziju : Automatsko logovanje


orangem
08. 04. 2008., 21:58
Da li neko ima dobar prijedlog, kako bi bilo najbolje da se automatski pristupi odredjenom sajtu, koristeci korisnicko ime i lozinku. A zatim da se pristupi nekoj stranici, unutar tog sajta i da se procita njen sadrzaj?

Dušan Dželebdžić
08. 04. 2008., 22:25
http://username:password@www.sajt.com/strana.html je prvo što mi pada na pamet, sa ovim obimom detalja koje si dao.

dinke
08. 04. 2008., 22:30
Pogledaj moju Curl klasu.

http://www.dinke.net/blog/2006/09/12/curl-http-client-2/sr/

Dakle, u najjednostavnije slucaju nesto tipa:


require_once("curl_http_client.php");

$curl = &new Curl_HTTP_Client();
//pretend to be IE6 on windows
$useragent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$curl->set_user_agent($useragent);

//where to store cookies
$cookies_file = "/tmp/cookies.txt";
$curl->store_cookies($cookies_file);

$curl->set_referrer("http://www.nekisajt.com/login.php");
$post_data = array();
$post_data['login'] = 'pera';
$post_data['pass'] = 'joe';
$post_data['nesto_trece'] = 'jos jedna post varijabla';
//...
$html_data = $curl->send_post_data("http://www.nekisajt.com/login.php", $post_data);

//parsujes recimo sa preg_match $html_data i uzmes sta ti treba
...


Inace, toplo preporucujem "tamper data" extenziju, odlicna je za pracenje sta se od post varijabli salje sa strane na stranu.

orangem
08. 04. 2008., 22:33
U pitanju je obicna login forma;
<input type="text" name="username">
<input type="password" name="pass">

Method = POST

jablan
08. 04. 2008., 22:35
Ako koristiš Ruby (što je malo verovatno), imaš izvanrednu biblioteku Mechanize (http://mechanize.rubyforge.org/mechanize/).

Sledeći primer uploaduje sliku na Flickr:

require 'rubygems'
require 'mechanize'

agent = WWW::Mechanize.new

# Get the flickr sign in page
page = agent.get('http://flickr.com/signin/flickr/')

# Fill out the login form
form = page.forms.name('flickrloginform').first
form.email = ARGV[0]
form.password = ARGV[1]
page = agent.submit(form)

# Go to the upload page
page = agent.click page.links.text('Upload')

# Fill out the form
form = page.forms.action('/photos_upload_process.gne').first
form.file_uploads.name('file1').first.file_name = ARGV[2]
agent.submit(form)


Obratite pažnju na liniju "page = agent.click page.links.text('Upload')", koja "klikće" na link na stranici koji sadrži tekst Upload. Kudikamo lakše nego ručno petljanje sa kukijima... ;)

dinke
08. 04. 2008., 23:20
U pitanju je obicna login forma;
<input type="text" name="username">
<input type="password" name="pass">

Method = POST

onda samo zameni
$post_data['login'] = 'pera';
$post_data['pass'] = 'joe';

u mom primeru sa

$post_data['username'] = 'pera_ili_sta_vec';
$post_data['password'] = 'ovde_ide_pass';

i imaces sadrzaj strane u $html_data (naravno promeni i link za poziv strane umesto http://www.nekisajt....).

Nakon uspesnog logovanja (a to mozes proveriti sa jednim strpos), neku drugu stranu unutar sajta ucitas sa:

$html_neke_strane = $curl->fetch_url("http://www.nekisajt.com/neka_strana");

Inace, posto ovo radim gotovo svakodneno (ukljucujucu "unofficial" API za regovanje nekih cctld domena), mozda napisem i jedan tutorijal kako se to radi ;)

ivanhoe
09. 04. 2008., 02:51
Dinke bre, a secret handshakes i tajne zanata, nemoj bre da nam kvaris posao :)))

orangem
09. 04. 2008., 15:35
Dinke, hvala ti. Ovo radi super!

mega023
11. 04. 2008., 22:49
onda samo zameni
$post_data['login'] = 'pera';
$post_data['pass'] = 'joe';

u mom primeru sa

$post_data['username'] = 'pera_ili_sta_vec';
$post_data['password'] = 'ovde_ide_pass';

i imaces sadrzaj strane u $html_data (naravno promeni i link za poziv strane umesto http://www.nekisajt....).


Kada uradim post na php fajl u njemu nema klasicnog output-a vec ima header(Location: ...) tj. redirekciju na odredjeni link, pa mi je output od curl-a uvek string(0) "" i onda ne vidim da li je "uspelo" ili ni je...
Moze li se iscitati taj header ili "pratiti" taj url?

dinke
11. 04. 2008., 23:59
^Verovatno ti je output zapravo boolean false posto curl klasa sama handluje server side redirekcije. Prema tome, uradi var_dump izlaza da vidis sta ti vraca (most likely false jer nesto nisi uradio kako treba).

mega023
12. 04. 2008., 00:50
kaze

Error message: The requested URL returned error: 404 bool(false)

I ako sada radi (postuje) samo sto mi je sad problem jer nemam pouzdan podatak da li je uspelo jer mi vraca 404.




Mislim da je problem u tome sto redirekt ide na link formata
http://www.domen.com/nesto.html#lokacija

e sad mozda curl ne konta bas nakjoblje to #lokacija pa se buni,
jer mi u browseru ista stvar radi ok...

dinke
12. 04. 2008., 01:04
Pa naravno da nije uspelo, verovatno ti je sama post strana pogresna.

orangem
13. 04. 2008., 00:49
Ima li neki poseban razlog, zasto se u browseru ne prikazuje sadrzaj stranice nakon ovog dijela koda:

$curl = &new Curl_HTTP_Client();

Npr.

<?php

require_once("curl_http_client.php");

print "OVO SE ISPISE";

$curl = &new Curl_HTTP_Client();

print "OVO NE!";
?>

Sa komandne linije vidim sve, ali ako skriptu pozivam preko IE ili Firefoxa, vidim samo blank page ili eventualni tekst prije kreiranja objekta.

:1092:

ivanhoe
13. 04. 2008., 14:39
pogledaj error log od servera da vidis koja je greska...

orangem
13. 04. 2008., 18:04
Odmah sam pogledao log, ali nema greske.
Sa komandne linije radi bez problema, sve se vidi.

Ali se u browseru ne prikazuje.

ivanhoe
13. 04. 2008., 20:15
hmmm, a da ne predje skripta memory limit ? Ako imas priviligije probaj da ga povecas u php.ini na neku solidno veliku vrednost, pa vidi da li ce da proradi (pa onda vrati na neku normalnu vrednost)

dinke
13. 04. 2008., 20:34
Meni pre lici da nemas curl podrsku na tom serveru.

Dakle stavi ovo na pocetak fajla:

ini_set(display_errors, "1");
error_reporting(E_ALL);

pa javi da li imas neku promenu u ispisu.

orangem
15. 04. 2008., 23:52
Izgleda da je problem bio kod apache-a, upravo sam ga restartovao i sada sve radi normalno.

Btw. da nisam imao php curl podrsku, ne bi radilo sa komandne linije.
Kako god bilo, nadam se da se ovo nece ponoviti:)