方法1:discuz登陆框是ajax调用的,一开始在firebug下看到了调用了接口:
http://home.ecjtu.net/member.php?mod=logging&action=login&infloat=yes&handlekey=login&inajax=1&ajaxtarget=fwin_content_login
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的inputname=‘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>(.*)</h3>/i','',$login);
var_dump($login);
exit();
$login = iconv('utf-8','gbk',$login);
echo $login;
?>
01 | <?php |
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(); |
08 | $login = str_replace ( "member.php" , "http://home.ecjtu.net/member.php" , $tree [ "root" ][ "value" ]); |
09 | $login = str_replace ( "http://home.ecjtu.net/./" ,"http://home.ecjtu.net/home.php? |
10 | mod=spacecp&ac=blog", $login ); //跳转到发帖页面 |
11 | $login = preg_replace( '/<h3>(.*)</h3>/i' , '' , $login ); |
12 | var_dump( $login ); |
13 | exit (); |
14 | $login = iconv( 'utf-8' , 'gbk' , $login ); |
15 |
|
16 | echo $login ; |
17 | ?> |
这个方法缺点是form中的内容不好改变。正则都不好匹配div class都一样...一定要按这个样式来。
方法2:在网上找到的方法 ,很好用。直接上代码:
<?phprequire'source/class/class_core.php';
$discuz =& discuz_core::instance();
$discuz->init();//以上是调用discuz公共执行类等核心代码
?>
<?php if (empty($_G['uid'])){?>
<form action="http://localhost/bbsx2/member.php?
mod=logging&action=login&loginsubmit=yes&infloat=yes"method="post" name="form2" onSubmit="return check()">
用户名:<input name="username"type="text" id="textfield2" size="13" tabindex="1" value="请输入用户名"onFocus="this.value='';"onBlur="if(this.value==''){this.value='请输入用户名';}">
密码:<inputname="password" type="password" id="password"size="12"> <input type="submit" name="button2" id="button2"value="登录">
<ahref="/bbs/member.php?mod=register">注册</a>
<a href="http://localhost/bbsx2/member.php?mod=logging&action=login&viewlostpw">找回密码</a></form>
<?php }
else { ?><divalign="right">欢迎您:<ahref="http://localhost/bbsx2/space-uid-<?phpecho $_G['uid'];?>.html">
<?php echo $_G['username'];?></a><a href="http://localhost/bbsx2/home-space-do-thread-view-me.html">我的帖子</a>
<a href="http://localhost/bbsx2/home.php">个人中心</a>
<a href="http://localhost/bbsx2/member-logging-action-logout-formhash-<?phpechoFORMHASH;?>.html">退出登陆</a></div><?php}?>
上面代码是因为discuz用了伪静态,或者你没有使用的话,请修改成以下代码:
<a href="http://localhost/bbsx2/home.php?mod=space&do=thread&view=me">我的帖子</a>
<a href="http://localhost/bbsx2/member.php?mod=logging&action=logout&formhash=<?phpechoFORMHASH;?>">退出登陆</a>
01 | <?php |
02 |
require 'source/class/class_core.php' ; |
03 |
$discuz = &discuz_core::instance(); |
04 |
$discuz ->init(); //以上是调用discuz公共执行类等核心代码 |
05 | ?> |
06 | <?php if ( empty ( $_G [ 'uid' ])){?> |
07 | <formaction="http: //localhost/bbsx2/member.php? |
08 | mod=logging&action=login&loginsubmit=yes&infloat=yes "method=" post " name=" form2 "onSubmit=" return check()" > |
09 | 用户名:<inputname= "username" type= "text" id= "textfield2" size= "13" tabindex= "1" value= "请输入用户名" onFocus= "this.value='';" onBlur= "if(this.value==''){this.value='请输入用户名';}" > |
10 | 密码:<inputname= "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> |
12 |
<a href= "http://localhost/bbsx2/member.php?mod=logging&action=login&viewlostpw" >找回密码</a></form> |
13 | <?php} |
14 |
else {?><div align= "right" >欢迎您:<ahref= "http://localhost/bbsx2/space-uid-<?phpecho $_G['uid']; ?>.html" class = "yellow" > |
15 | <?php echo $_G [ 'username' ];?></a><a href= "http://localhost/bbsx2/home-space-do-thread-view-me.html" >我的帖子</a> |
16 |
<a href= "http://localhost/bbsx2/home.php" >个人中心</a> |
17 |
<a href= "http://localhost/bbsx2/member-logging-action-logout-formhash-<?phpecho FORMHASH;?>.html" >退出登陆</a></div><?php}?> |
18 | 上面代码是因为discuz用了伪静态,或者你没有使用的话,请修改成以下代码: |
19 | <ahref= "http://localhost/bbsx2/home.php?mod=space&do=thread&view=me" >我的帖子</a> |
20 | <ahref= "http://localhost/bbsx2/member.php?mod=logging&action=logout&formhash=<?phpecho FORMHASH;?>" >退出登陆</a> |
这种方法可以判断用户登陆状态.本来在辅导员博客程序用这种方法最好,不过由于博客程序是smarty做的,将这段程序用了很多种方法引入smarty中不兼容。
方法3:直接写个静态的表单就能登陆论坛。
<formaction="http://home.ecjtu.net/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes"method="post" name="form2" onSubmit="return check()"><span>用户名</span><inputname="username" type="text" id="textfield2" size="13" tabindex="1" value="请输入用户名"onFocus="this.value='';"onBlur="if(this.value==''){this.value='请输入用户名';}"><br/><br />
<span>密码</span><inputname="password" type="password" id="password" size="12"><br/><br />
<center>tips:请用论坛号登陆<ahref="http://home.ecjtu.net/member.php?mod=logging&action=login&viewlostpw">找回密码</a></center><br/>
<input type="hidden" name="referer"value="http://home.ecjtu.net/home.php?mod=spacecp&ac=blog"/>
<center>
<input type="submit" name="login" value="登录"/>
<a href="http://home.ecjtu.net/member.php?mod=register">注册</a>
</center>
</form>
01 | <formaction= "http://home.ecjtu.net/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes" method= "post" name= "form2" onSubmit= "return check()" > |
02 | <span class = "form_tip" >用户名</span><inputname= "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><inputname= "password" type= "password" id= "password" size= "12" style= "float:left;width:140px;" ><br/><br /> |
04 | <center>tips:请用论坛号登陆<ahref= "http://home.ecjtu.net/member.php?mod=logging&action=login&viewlostpw" >找回密码</a></center><br/> |
05 | <inputtype= "hidden" name= "referer" value= "http://home.ecjtu.net/home.php?mod=spacecp&ac=blog" /> |
06 | <center> |
07 |
<inputtype= "submit" name= "login" value= "登录" /> |
08 |
<ahref= "http://home.ecjtu.net/member.php?mod=register" >注册</a> |
09 | </center> |
10 | </form> |
这种最简单的方法居然也可以实现登陆并跳转到发帖页面。开始看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><ahref=/home.php?mod=space>{$_G[member][username]}</a></b><!--{if$_G['group']['allowinvisible']}--><ahref=/member.php?mod=switchstatus><!--{if$_G['session']['invisible']}-->{langlogin_invisible_mode}<!--{else}-->{langlogin_normal_mode}<!--{/if}--></a><!--{/if}-->| <ahref=/home.php?mod=space&do=home>{langmy_space}</a> <ahref=/home.php?mod=spacecp>{langsetup}</a> | <ahref=/home.php?mod=space&do=notice>{langremind}<!--{if$_G[member][newprompt]}-->($_G[member][newprompt])<!--{/if}--></a><spanid=myprompt_check></span>| <ahref=/home.php?mod=space&do=pm>{langpm_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'])}--> |<ahref=/portal.php?mod=portalcp>{langportal_manage}</a><!--{/if}--><!--{if$_G['uid'] &&$_G['group']['radminid'] > 1}--> |<ahref=/forum.php?mod=modcp&fid=$_G[fid]>{langforum_manager}</a><!--{/if}--><!--{if$_G['uid'] &&($_G['group']['radminid'] == 1 ||$_G['member']['allowadmincp'])}--> |<a href=/admin.php>{langadmincp}</a><!--{/if}-->| <ahref=/member.php?mod=logging&action=logout&formhash={FORMHASH}>{langlogout}</a><!--{elseif!empty($_G['cookie']['loginuser'])}--><a>$_G['cookie']['loginuser']</a>| <ahref=/member.php?mod=logging&action=login>{langactivation}</a> | <ahref=/member.php?mod=logging&action=logout&formhash={FORMHASH}>{langlogout}</a><!--{else}--><ahref=/member.php?mod=register>$_G['setting']['reglinkname']</a>| <ahref=/member.php?mod=logging&action=login>{langlogin}</a><!--{/if}-->");
3. 调用
<divid="zhairu">欢迎您</div>
<scriptsrc=/zx.php></script>
参考原文:discuz论坛登陆框外部调用的几种方法,Js全站调用discuzX 的用户登录信息