关于 curl 页面跳转的疑惑

2014-11-25 15:25:57 +08:00
 csensix
function login_post($url, $cookie, $post) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($curl, CURLOPT_POST, 1);//post方式提交
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); curl_exec($curl);
curl_close($curl);
}

用以上函数模拟表单登录验证,但是目标页面验证成功后 通过 输出 <script> location.href="home.php";</script> 跳转到了home.php 页,所以造成 login_post 函数之后的语句都没有执行。

试问,如何才能顺利执行login_post函数之后的那些语句。
4087 次点击
所在节点    问与答
8 条回复
ahu
2014-11-25 15:43:38 +08:00
CURLOPT_FOLLOWLOCATION ?
momaer
2014-11-25 16:05:47 +08:00
你要使用浏览器引擎来执行js啦。比如这个:phantomjs
momaer
2014-11-25 16:09:15 +08:00
等下,你这个login_post函数执行完了,就已经登录上去了啊。

但是目标页面验证成功后 通过 输出 <script> location.href="home.php";</script> 跳转到了home.php 页,所以造成 login_post 函数之后的语句都没有执行。

这句话我不明白啊。
wingoo
2014-11-25 16:11:11 +08:00
js执行不了的吧
只能再写个curl来跳转,跳转地址如果固定可写死,不固定获取内容后抓取
csensix
2014-11-25 16:14:43 +08:00
@momaer 就是通过函数模拟登录,curl到登录页面,验证通过,登录页面就通过输出 <script> location.href="home.php";</script> 这句话实现跳转的
momaer
2014-11-25 16:20:31 +08:00
@csensix 你把这个CURLOPT_RETURNTRANSFER改为true,完了判断response里面有没有
<script> location.href="home.php";</script>
然后把这个href提取出来。然后 你跳转就是了。
aaaa007cn
2014-11-25 21:36:03 +08:00
突然想到该不会是
浏览器访问你的服务器
在你的服务器上模拟登录远程服务器
然后你的 php 把远程服务器的 js 跳转代码发回浏览器
导致浏览器跟着 js 跳转了
没法继续执行之前那个 php 中的 login_post 之后的语句?

所以你的问题其实是如何让 php 不直接输出 curl 远程服务器的结果?
那就是 @momaer 说的 CURLOPT_RETURNTRANSFER 改为 true
之后也不用提取 href 了
csensix
2014-11-26 13:52:17 +08:00
@aaaa007cn 貌似是这样子的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/149156

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX