2014-08-28 57 views
2

這是我的問題。幾個月前,我寫了一個PHP腳本來連接到我的網站上的帳戶。我使用CURL來連接,一切都很好。然後,他們更新了網站,現在我不再能夠連接。問題不在於CURL,因爲我沒有從CURL中得到任何錯誤,但是它是網站本身,它告訴我我無能爲力。無法使用CURL登錄...但不知道爲什麼

這裏是我的腳本:

<?php 
require('simple_html_dom.php'); 


//Getting the website main page 
$url = "http://www.kijiji.ca/h-ville-de-quebec/1700124"; 
$main = file_get_html($url); 
$links = $main -> find('a'); 
//Finding the login page 
foreach($links as $link){ 
    if($link -> innertext == "Ouvrir une session"){ 
     $page = $link; 
    } 
} 
$to_go = "http://www.kijiji.ca/".$page->href; 


//Getting the login page 
$main = file_get_html($to_go); 
$form = $main -> find("form"); 
//Parsing the page for the login form 
foreach($form as $f){ 
    if($f -> id == "login-form"){ 
     $cform = $f; 
    } 
} 
$form = str_get_html($cform); 

//Getting my post data ready 
$postdata = ""; 
$tot = count($form->find("input")); 
$count = 0; 

/*I've got here a foreach loop to find all the inputs in the form. As there are hidden input for security, I make my script look for all the input and get the value of each, and then add them in my post data. When the name of the input is emailOrNickname or password, I enter my own info there, then it gets added to the post data*/ 


foreach($form -> find("input") as $input){ 
    $count++; 
    $postdata .= $input -> name; 
    $postdata .= "="; 
    if($input->name == "emailOrNickname"){ 
     $postdata.= "my email address "; 
    }else if($input->name == "password"){ 
     $postdata.= "my password"; 
    }else{ 
     $postdata .= $input -> value; 
    } 
    if($count<$tot){ 
     $postdata .= "&"; 
    } 
} 

//Getting my curl session 
$ch = curl_init(); 
curl_setopt_array($ch, array(
    CURLOPT_URL => $to_go, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => $postdata, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_COOKIESESSION => true, 
    CURLOPT_COOKIEJAR => 'cookie.txt' 
)); 
$result = curl_exec ($ch); 
curl_close ($ch); 
echo $result; 
?> 

捲曲也不PHP返回任何錯誤。事實上,它返回網站的網頁,但是這個網頁告訴我發生了一個錯誤,就好像缺少一些發佈數據一樣。

您認爲可以引起什麼?它可能是一些缺少curl_setopts?我不知道,你有嗎?

+1

你正在構建自己的postdata,可能沒有正確地做。捲曲可以採取陣列。使'$ postdata'爲key = value對的數組,然後傳遞整個數組來捲曲。 – 2014-08-28 19:04:44

+0

謝謝你的快速回答。不幸的是,我已經嘗試將我的postdata作爲一個數組,它也不起作用。 – user3602532 2014-08-28 19:16:34

+0

你確定你輸入了所有字段,並且不錯過一些有趣的隱藏字段嗎?嘗試設置引用來自他們的網站登錄腳本 – Soundz 2014-08-28 19:24:54

回答

0

$form = $main -> find("form")發現元素

的第一次出現,這是<form id="SearchForm" action="/b-search.html">

您將需要更改爲$form = $main->find('#login-form')

+0

謝謝你的快速回答。不幸的是,我試過了,似乎沒有解決問題。事實上,當你用'$ form = $ main - > find(「form」)解析時,它將返回所有的

。這就是爲什麼我之後有一個foreach循環來找到正確的表單。 – user3602532 2014-08-28 19:15:03

+0

哦,沒有看到下面的循環,但我會直接使用#登錄形式,它快了很多。但是,您應該嘗試調試要發送的/ var_dump數組,也許某些信息沒有正確發送 – vertazzar 2014-08-28 19:16:37

+0

也會查看http:// stackoverflow。com/questions/5224790/curl-post-format-for-curlopt-postfields – vertazzar 2014-08-28 19:19:10

0

最有可能的問題是,該網站(服務器)檢查餅乾。此過程主要由兩個階段組成:

1)當您在某個頁面上第一次訪問該網站時,例如在登錄頁面上,服務器將cookie設置爲一些數據。

2)在隨後的每個頁面訪問或POST請求中,服務器檢查它設置的cookie。

因此,您必須在腳本中重現此過程,這意味着您必須使用CURL從網站獲取任何頁面,包括應通過CURL獲取的登錄頁面,而不是file_get_html

Furthemore你必須既CURLOPT_COOKIEJARCURLOPT_COOKIEFILE選項設置爲相同的絕對路徑上每個請求值(「cookie.txt的」是一個相對路徑)。爲了在腳本執行的整個系列請求(包括重定向)中啓用cookie自動處理(會話維護),這是必要的。

+0

我相信你在做某件事。我覺得這很合乎邏輯。我會把我的腳本寫出來,稍後再更新。 – user3602532 2014-08-29 01:34:25

相關問題