方法1:discuz登陆框是ajax调用的,一开始在firebug下看到了调用了接口:
1 | http: //home.ecjtu.net/member.php |
2 | ?mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login |
这返回的是一个xml的内容,其中就一个结点root,里面会根据本地的cookies判断是否登录了论坛,如果没有登陆里面的内容就是一段form登陆表单。如果登陆了里面就是一段登陆后的信息。然后将ajax请求中的css保存到本地。能够实现登陆框调用。登陆框中有一个hidden的input name=‘reffer’ 这里面的value值是来路链接.不过要是论坛程序里的。比如将这个连接换成http://home.ecjtu.net/home.php?mod=spacecp&ac=blog这样登陆完后会自动跳转到发博客的页面。可以实现一键发帖功能。
代码如下:
<?php
$login = file_get_contents("http://home.ecjtu.net/member.php?
mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login");
require_once('SofeeXmlParser.php');//xml解析类 博客里搜索xml有相关介绍
$xml = new SofeeXmlParser();
$xml->parseString($login);
$tree = $xml->getTree();
$login = str_replace("member.php","http://home.ecjtu.net/member.php",$tree["root"]["value"]);
$login = str_replace("http://home.ecjtu.net/./","http://home.ecjtu.net/home.php?
mod=spacecp&ac=blog",$login);//跳转到发帖页面
$login = preg_replace('/<h3 class="flb">(.*)<\/h3>/i','',$login);
var_dump($login);
exit();
$login = iconv('utf-8','gbk',$login);
echo $login;
?>
02 | $login = file_get_contents ("http: //home.ecjtu.net/member.php? |
03 | mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login"); |
04 | require_once ( 'SofeeXmlParser.php' ); //xml解析类 博客里搜索xml有相关介绍 |
05 | $xml = new SofeeXmlParser(); |
06 | $xml ->parseString( $login ); |
07 | $tree = $xml ->getTree(); |
10 | mod=spacecp&ac=blog", $login ); //跳转到发帖页面 |
11 | $login = preg_replace( '/<h3 class="flb">(.*)<\/h3>/i' , '' , $login ); |
14 | $login = iconv( 'utf-8' , 'gbk' , $login ); |
这个方法缺点是form中的内容不好改变。正则都不好匹配div class都一样...一定要按这个样式来。
方法2:在网上找到的方法 ,很好用。直接上代码:
02 | require 'source/class/class_core.php' ; |
03 | $discuz = & discuz_core::instance(); |
04 | $discuz ->init(); //以上是调用discuz公共执行类等核心代码 |
06 | <?php if ( empty ( $_G [ 'uid' ])) {?> |
07 | <form action="http: //localhost/bbsx2/member.php? |
08 | mod=logging&action=login&loginsubmit=yes&infloat=yes " method=" post " name=" form2 " onSubmit=" return check()" > |
09 | 用户名:<input name= "username" type= "text" id= "textfield2" size= "13" tabindex= "1" value= "请输入用户名" onFocus= "this.value='';" onBlur= "if(this.value==''){this.value='请输入用户名';}" > |
10 | 密码:<input name= "password" type= "password" id= "password" size= "12" > <input class = "input_on1111" type= "submit" name= "button2" id= "button2" value= "登录" > |
11 | <a href= "/bbs/member.php?mod=register" > 注册</a> |
18 | 上面代码是因为discuz用了伪静态,或者你没有使用的话,请修改成以下代码: |
这种方法可以判断用户登陆状态.本来在辅导员博客程序用这种方法最好,不过由于博客程序是smarty做的,将这段程序用了很多种方法引入smarty中不兼容。
方法3:直接写个静态的表单就能登陆论坛。
02 | <span class = "form_tip" >用户名</span><input name= "username" type= "text" id= "textfield2" size= "13" tabindex= "1" style= "float:left; width:140px;" value= "请输入用户名" onFocus= "this.value='';" onBlur= "if(this.value==''){this.value='请输入用户名';}" ><br /><br /> |
03 | <span class = "form_tip" >密码</span><input name= "password" type= "password" id= "password" size= "12" style= "float:left;width:140px;" ><br /><br /> |
07 | <input type= "submit" name= "login" value= "登录" /> |
这种最简单的方法居然也可以实现登陆并跳转到发帖页面。开始看discuz的登录框表单中的name值都有随机值
这是用来做crsf保护的,以为不能直接提交表单。
上面是几种登陆的方法。
最后我使用了第二种方法,但引用的核心文件必须放在前面,后来放到了每页都引用的配置文件中,可以使用了,但会有一些变量函数会冲突,数据库加载的变量冲突比较多。但这种方法可以获取登陆状态,使用方便。
还有一种通过JS的方式获取登陆状态的方法,代码如下:
1. 调用文件制作zx.php
<?php
require './source/class/class_core.php';
$discuz = & discuz_core::instance();
$discuz->init();
include template('common/zx');
?>
2. 调用文件模板制作zx.htm(存放在:template/default/common )
document.getElementByIdx_x('zhairu').innerHTML = ("<!--{if $_G['uid']}--><b><a href=/home.php?mod=space>{$_G[member][username]}</a></b> <!--{if $_G['group']['allowinvisible']}--><a href=/member.php?mod=switchstatus><!--{if $_G['session']['invisible']}-->{lang login_invisible_mode}<!--{else}-->{lang login_normal_mode}<!--{/if}--></a><!--{/if}--> | <a href=/home.php?mod=space&do=home>{lang my_space}</a> <a href=/home.php?mod=spacecp>{lang setup}</a> | <a href=/home.php?mod=space&do=notice>{lang remind}<!--{if $_G[member][newprompt]}-->($_G[member][newprompt])<!--{/if}--></a><span id=myprompt_check></span> | <a href=/home.php?mod=space&do=pm>{lang pm_center}<!--{if $_G[member][newpm]}-->($_G[member][newpm])<!--{/if}--></a> <!--{if $_G['group']['allowmanagearticle'] || $_G['group']['allowdiy'] || in_array($_G['uid'], $_G['setting']['ext_portalmanager'])}--> | <a href=/portal.php?mod=portalcp>{lang portal_manage}</a><!--{/if}--><!--{if $_G['uid'] && $_G['group']['radminid'] > 1}--> | <a href=/forum.php?mod=modcp&fid=$_G[fid]>{lang forum_manager}</a><!--{/if}--><!--{if $_G['uid'] && ($_G['group']['radminid'] == 1 || $_G['member']['allowadmincp'])}--> | <a href=/admin.php>{lang admincp}</a><!--{/if}--> | <a href=/member.php?mod=logging&action=logout&formhash={FORMHASH}>{lang logout}</a><!--{elseif !empty($_G['cookie']['loginuser'])}--><a >$_G['cookie']['loginuser']</a> | <a href=/member.php?mod=logging&action=login>{lang activation}</a> | <a href=/member.php?mod=logging&action=logout&formhash={FORMHASH}>{lang logout}</a><!--{else}--><a href=/member.php?mod=register>$_G['setting']['reglinkname']</a> | <a href=/member.php?mod=logging&action=login>{lang login}</a><!--{/if}-->");
3. 调用
<div id="zhairu">欢迎您</div>
<script src=/zx.php></script>