實現了瀏覽欄目列表和帖子列表之後,下面最重要的就是實現發帖功能,先看了看論壇網頁版的html代碼,提取出下面這些有用的代碼:
<html>
<head>
<script src="http://112.74.102.213/static/js/forum.js?A6S" type="text/javascript"></script>
<meta charset="utf-8">
</head>
<body>
<form method="post" autocomplete="off" id="fastpostform" action="http://112.74.102.213/forum.php?mod=post&action=newthread&fid=2&topicsubmit=yes&infloat=yes&handlekey=fastnewpost">
<input type="text" id="subject" name="subject" />
<textarea rows="6" cols="80" name="message" id="fastpostmessage" tabindex="12" ></textarea>
<input id='hash' type="hidden" name="formhash" value="c21b9112" />
<p class="ptm pnpost">
<button type="submit" name="topicsubmit" id="fastpostsubmit" value="topicsubmit" tabindex="13" class="pn pnc"><strong>發表帖子</strong>
</button>
</p>
</form>
</body>
</html>
表單提交到的位置要根據自己的服務器ip來定:
action="http://112.74.102.213/forum.php?mod=post&action=newthread&fid=2&topicsubmit=yes&infloat=yes&handlekey=fastnewpost">
但forum.php及後面的內容不要輕易修改,除了fid=2之外,這個是你要發帖的欄目編號
除此之外,裏面最重要的部分就是formhash的值,這個值是在登錄之後服務器分配給當前頁面的一個驗證值,用於判斷表單的來路是否正確,簡單說就是防止惡意發帖。
我們可以手動生成它
生成formhash
先來看看discuz內部是怎麼生成這個值的,源碼位於source/function/function_core.php,下面是實現方法:
function formhash($specialadd = '') {
global $_G;
$hashadd = defined('IN_ADMINCP') ? 'Only For Discuz! Admin Control Panel' : '';
return substr(md5(substr($_G['timestamp'], 0, -7).$_G['username'].$_G['uid'].$_G['authkey'].$hashadd.$specialadd), 8, 8);
}
關鍵的四個值:
$_G['timestamp']
$_G['username']
$_G['uid']
$_G['authkey']
我們只需要關心最後一個值就好,原因:
第一個值是當前訪問的時間戳,由服務器自動分配
第二和第三個值是當前登錄用戶的用戶名和uid,在驗證登錄後這個值也會被填充,最後只剩下authkey,注意不是discuz_auth_key
需要兩個全局變量:
$_G['config']['security']
和 $_G['cookie']['saltkey']
第一個變量,在安裝了discuz之後,在config/config_global.php中有這個值,是一個長度爲15的字符串,第二個變量說實在不知道在哪裏設置的,反正可以讀出來就是了,生成方式:
$key=$_G['config']['security']['authkey'];
$saltkey=$_G['cookie']['saltkey'];
$myauthkey=md5($key.$saltkey);
可以先從全局變量裏讀出authkey,再和我們生成的authkey比較,相同則表示成功了。
有了authkey,生成formhash就簡單了
另外,需要注意的是,要使用$_G的全局變量,需要引入function_core.php