2011-10-19 130 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:我简化了一下。起初它相当冗长。 –