2011-10-19 167 views
0

所以,我想要做的是製作一個腳本,它會自動將我的登錄信息(我將在我的數據庫中)添加到我想要的任何形式。DOM文檔,編輯元素

爲此,我從網站(使用cURL)獲取html源代碼,然後使用DOMdocument編輯輸入的用戶名和密碼錶單名稱,然後輸入此信息,然後單擊登錄

一切應該沒問題吧?理論上是的,但事實並非如此。

這是做正確的代碼:

$dom = new DOMdocument(); 
$dom->formatOutput = true; 
@$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', $encoding)); 

$inputs = $dom->getElementsByTagName('input'); 
foreach ($inputs as $input) 
{ 
    if ($input->getAttribute('name') == $id_nameValue) 
    { 
    $new_input = $dom->createElement('input'); 

    $new_input->setAttribute('name', $id_nameValue); 
    $new_input->setAttribute('value', $id_value); 

    $input->parentNode->replaceChild($new_input, $input); 
    } 

    if ($input->getAttribute('name') == $password_nameValue) 
    { 
    $new_input = $dom->createElement('input'); 

    $new_input->setAttribute('name', $password_nameValue); 
    $new_input->setAttribute('value', $password_value); 
    $new_input->setAttribute('type', 'password'); 

    $input->parentNode->replaceChild($new_input, $input); 
    } 
} 

echo $dom->savehtml(); 

我遇到的問題,與JavaScript不加載或CSS,或沒有正確重定向...

讓我們例如reddit的:https://ssl.reddit.com/login 他們有這樣的CSS

<link rel="stylesheet" href="/static/reddit.cYdhnJIJSZ0.css" type="text/css" /> 

,而不必https://ssl.reddit.com/login/static/reddit.cYdhnJIJSZ0.css,所以我不能加載它正確LY,因爲它使用了自己的網址一樣

MY_URL.com/static/reddit.cYdhnJIJSZ0.css to find it... 

這同樣適用於JavaScript的,像

<script type="text/javascript" src="/static/jquery.js"> 

或用

<form id="login_login" method="post" action="/post/login" class="user-form login-form"> 

這將我重定向到MY_URL.com/post/login

我的問題是我該如何做這項工作? 如何編輯鏈接以包含網站網址? 由於這是我第一次使用DOM文檔,我不知道我將如何去有關編輯形式,或腳本SRC ...

所以我的最終結果將是

<link rel="stylesheet" href="https://ssl.reddit.com/login/static/reddit.cYdhnJIJSZ0.css" type="text/css" /> 
<script type="text/javascript" src="https://ssl.reddit.com/login/static/jquery.js"> 
<form id="login_login" method="post" action="https://ssl.reddit.com/login/post/login" class="user-form login-form"> 
+0

我是偏執狂還是會出現可疑?在任何情況下,您都不應該熱鏈接來自其他網站的JavaScript,CSS或圖像,以便自行放置。當然,你不應該設置一個看起來像一個網絡釣魚騙局。 – erisco

+0

恩,哈哈?這是一個網絡釣魚騙局?我想這是個人使用,當我在一臺不是我自己的計算機上,並且想要存儲我想要登錄的網站的用戶名和密碼時,所以我沒有使用鍵盤記錄或其他技巧來獲取您的密碼......並且它不是像即時通訊鏈接的CSS或JavaScript爲我個人使用,它的網站從它...你甚至讀過我說我想要它做什麼? – alex2005

+0

如果你想親自看看它,可以在這裏試試http://www.auto-complete.info/ ----用戶名:user,密碼:密碼----只是不要在添加密碼時使用真實密碼新的頁面,它的存儲就像在db(現在)... – alex2005

回答

1

我認爲最簡單的方法是注入一個base標記,其href屬性設置爲最後一個有效url的URL(在可能的重定向的情況下最終由cURL獲取的url)。這最後一個有效的URL可以捲曲通過檢索:

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

我已經解釋瞭如何將基礎標籤與DOM文檔in this answer設置。它還解釋了已有base標籤的情況。雖然我承認,但我的示例並未在base標記中查找href屬性。儘管通過利用DOMElement::hasAttribute()來添加此檢查應該是微不足道的。

編輯
針對alex2005的評論:雖然

$baseElement = $doc->createElement('base'); 
$baseElement->setAttribute('href', $url); 
$headElement = $doc->getElementsByTagName('head')->item(0); 

// it will automatically append, if $headElement has no firstChild (i.e. is null) 
$headElement->insertBefore($baseElement, $headElement->firstChild); 

編輯2
一個小警告:

你可以改變它一點,做到這一點。我忽略了一些東西。

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

...能有效地返回一個網址,如:

http://example.com/some/path/to/a/file.html

我不知道瀏覽器是如何處理的base標籤的文件名。我會假設他們提取目錄路徑。但不確定這一點。

但除了可能的警告,在大多數情況下,您可能只想擁有最後一個重定向url的域名,以便在基本標記中使用。

至少這是解決絕對URI的如

/css/some.css 
/js/some.js 
/some/file.html 

真正爲了解決相對的URI如:

css/some.css 
js/some.js 
some/file.html 

...你可能會想提取的目錄部分網址以及:

http://example.com/some/path/to/a/

所以,在給予了一點思考之後,考慮到所有可能的情況可能並不那麼微不足道。注意這一點。

+0

這實際上是有益的,謝謝。我遇到的問題是基礎標記之前的事情,不會有基礎網址,所以它不會幫助包含在它之前的css和java腳本。無論如何,做它在頂部? – alex2005

+0

@ alex2005:我對此感到有些驚訝。你確定?我認爲瀏覽器會在做任何其他事情之前先解析一個可能的「base」標籤......但是,好的,我在回答如何解釋這個問題時給出了一個提示。 HTH。 –

+0

@ alex2005:我簡化了一下。起初它相當冗長。 –