在php 模仿登錄我們需要使用curl_init函數,下面我來介紹利用 curl 模擬 post 登錄discuz論壇并且實現自動頂帖功能.
其實模擬登錄就那點事,無法就是獲得相應的參數,然后模擬發送,把獲得的COOKIE 帶入下一步操作中去discuzx 系列為防止灌水,一直在用 formhash() 這個函數.
1、下面來看下formhash 這個函數,代碼如下:
- function formhash($specialadd = '') {
- global $_G;
- $hashadd = defined('IN_ADMINCP') ? 'Only For Discuz! Admin Control Panel' : '';//開源代碼Vevb.com
- return substr(md5(substr($_G['timestamp'],0,-7).$_G['username'].$_G['uid'].$_G['authkey'].$hashadd.$specialadd), 8, 8);
- }
注:生成方式:1、截取的時間戳,2、用戶名,3、用戶ID,4、authkey,5、hashadd(定值),6、specialadd(定值)
因為存在用戶名和用戶id,所以在登錄前跟登錄后的產生的值是不同的,即:在登錄前跟登錄后你要2次來獲得fromhash;
那么authkey又是個什么東西呢 ?
2、關于authkey
代碼位置:/source/class/discuz/discuz_application.php,代碼如下:
- if(emptyempty($this->var['cookie']['saltkey'])) {
- $this->var['cookie']['saltkey'] = random(8);//這一步不要去管
- dsetcookie('saltkey', $this->var['cookie']['saltkey'], 86400 * 30, 1, 1);
- }
- $this->var['authkey'] = md5($this->var['config']['security']['authkey'].$this->var['cookie']['saltkey']);
在這里可以看到:authkey是根據配置文件的authkey 和cookie 里面的saltkey 來生成的,其實在這里就可以看出來了,只要網站的$this->var['cookie']['saltkey'] 這個值始終保存在cookie里面就這樣就可以保證 formhash 那里生成的值永遠是一樣的,永遠是相對的.
3 cookie系列
discuz 的cookie的前綴是隨機生成的,代碼位置:/source/class/discuz/discuz_application.php,代碼如下:
- $this->var['config']['cookie']['cookiepre'] = $this->var['config']['cookie']['cookiepre'].substr(md5($this->;var['config']['cookie']['cookiepath'].'|'.$this->;var['config']['cookie']['cookiedomain']), 0, 4).'_';
只要你登錄下網站看看cookie 的設置這里就可以了,他的前綴確實hi一直不變的,當然改了配置文件那肯定會變,到底該怎么寫呢:說下我實現的思路.
1、登錄下訪問網站一下抓取網頁返回的 saltkey(cookie),formhash(值) 這兩個值(saltkey在下面一定要帶上,而且上下文要一致)
2、構造登錄的內容然后模擬post 提交 (一定要帶上第一步抓取到的cookie跟formhash 這一個值)
3、如果登錄成功,接著獲取一個頁面的 formhash 跟設置的cookie(這次獲得到的formhash 就是你可以一直使用的了)
4、構造發帖還有頂帖的post 提交到頁面 (cookie 跟formhash 還是重點 )
關于php 使用 crul 模擬 post 部分代碼,代碼如下:
- $ch = curl_init($url); //初始化
- curl_setopt($ch, CURLOPT_HEADER, 1); //不返回header部分
- curl_setopt($ch, CURLOPT_POST, 1);//是否
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //返回字符串,而非直接輸出
- curl_setopt($ch,CURLOPT_REFERER,$refer);
- curl_setopt($ch, CURLOPT_COOKIE, $tocookies); //存儲cookies
- curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);
代碼就不共享了,有能力的朋友自己寫把,這東西容易引起混亂.
新聞熱點
疑難解答