標題起的太大了,都是騙人的。最近使用PHP實現了簡單的網盤搜索程序,而且關聯了微信公衆平臺。用戶能夠經過公衆號輸入關鍵字,公衆號會返回相應的網盤下載地址。就是這麼一個簡單的功能,相似不少的網盤搜索類網站,我這個採集和搜索程序都是PHP實現的,全文和分詞搜索部分使用到了開源軟件xunsearch,如今就來介紹一下實現過程。php
1. 獲取一批網盤用戶mysql
2. 根據網盤用戶獲取分享列表web
3. xunsearch實現全文檢索和分詞檢索sql
4. 微信公衆平臺接口開發數據庫
功能展現:json
獲取並採集百度網盤用戶瀏覽器
要想獲取到分享列表,首先要先把百度的用戶信息收集下來,如今我來介紹如何找到一大批百度的用戶。先把瀏覽器的審查元素打開,查看HTTP的請求包,打開本身的百度網盤主頁地址 https://pan.baidu.com/pcloud/home ,查看訂閱的用戶列表,觀察請求。微信
https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=0&bdstoken=bc329b0677cad94231e973953a09b46f&channel=chunlei&clienttype=0&web=1&logid=MTQ5MzczNDgzMjgwMTAuOTE3Mzc4MDc4NDQ3NjU0OA== 這個請求就是獲取訂閱用戶列表的接口。微信公衆平臺
上面的參數含義分別是:query_uk (我本身的id編號,百度都是以uk來命名的) ; limit (分頁時每頁顯示的條數) ; start (分頁起始編號) ; 剩下的參數全都並沒有任何卵用。curl
精簡後的接口地址是:https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$uk}&limit=24&start={$start}
處理分頁的獲取訂閱者接口地址
先暫時假設,我訂閱了2400個用戶,這個數量基本夠用了。每頁顯示24個用戶,那麼就會分100頁,則先看如何生成這個100個url。
<?php /* * 獲取訂閱者 */ class UkSpider{ private $pages;//分頁數 private $start=24;//每頁個數 public function __construct($pages=100){ $this->pages=$pages; } /** * 生成接口的url */ public function makeUrl($rootUk){ $urls=array(); for($i=0;$i<=$this->pages;$i++){ $start=$this->start*$i; $url="http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$rootUk}&limit=24&start={$start}"; $urls[]=$url; } return $urls; } } $ukSpider=new UkSpider(); $urls=$ukSpider->makeUrl(3317165372); print_r($urls);
獲取的url接口列表結果:
Array ( [0] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=0 [1] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=24 [2] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=48 [3] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=72 [4] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=96 [5] => http://pan.baidu.com/pcloud/friend/getfollowlist?query_uk=3317165372&limit=24&start=120
使用CURL請求接口地址
請求接口地址時,能夠直接使用file_get_contents()函數,可是我這裏使用的是PHP的CURL擴展函數,由於在獲取分享文件列表時須要修改請求的header頭信息。
此接口返回的JSON信息結構以下
{ "errno": 0, "request_id": 3319309807, "total_count": 3, "follow_list": [ { "type": -1, "follow_uname": "熱心***聯盟", "avatar_url": "http://himg.bdimg.com/sys/portrait/item/7fd8667f.jpg", "intro": "", "user_type": 0, "is_vip": 0, "follow_count": 0, "fans_count": 21677, "follow_time": 1493550371, "pubshare_count": 23467, "follow_uk": 3631952313, "album_count": 0 }, { "type": -1, "follow_uname": "綰*兮", "avatar_url": "http://himg.bdimg.com/sys/portrait/item/fa5ec198.jpg", "intro": "萬里淘金,爲你推薦精品全本小說,滿滿的資源福利!", "user_type": 6, "is_vip": 0, "follow_count": 10, "fans_count": 5463, "follow_time": 1493548024, "pubshare_count": 2448, "follow_uk": 1587328030, "album_count": 0 }, { "type": -1, "follow_uname": "自**檢票", "avatar_url": "http://himg.bdimg.com/sys/portrait/item/8c5b2810.jpg", "intro": "沒事看點小說。", "user_type": 0, "is_vip": 0, "follow_count": 299, "fans_count": 60771, "follow_time": 1493547941, "pubshare_count": 13404, "follow_uk": 1528087287, "album_count": 0 } ] }
若是要作一個綜合性的網盤搜索網站,就能夠把這些信息全都存入數據庫,如今我只是作一個很簡單的小說搜索網站,所以只留下了訂閱盤主的uk編號。
<?php /* * 獲取訂閱者 */ class UkSpider{ private $pages;//分頁數 private $start=24;//每頁個數 public function __construct($pages=100){ $this->pages=$pages; } /** * 生成接口的url */ public function makeUrl($rootUk){ $urls=array(); for($i=0;$i<=$this->pages;$i++){ $start=$this->start*$i; $url="https://pan.baidu.com/pcloud/friend/getfollowlist?query_uk={$rootUk}&limit=24&start={$start}"; $urls[]=$url; } return $urls; } /** * 根據URL獲取訂閱用戶id */ public function getFollowsByUrl($url){ $result=$this->sendRequest($url); $arr=json_decode($result,true); if(empty($arr)||!isset($arr['follow_list'])){ return; } $ret=array(); foreach($arr['follow_list'] as $fan){ $ret[]=$fan['follow_uk']; } return $ret; } /** * 發送請求 */ public function sendRequest($url,$data = null,$header=null){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); if (!empty($data)){ curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data); } if (!empty($header)){ curl_setopt($curl, CURLOPT_HTTPHEADER, $header); } curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($curl); curl_close($curl); return $output; } } $ukSpider=new UkSpider(); $urls=$ukSpider->makeUrl(3317165372); //循環分頁url foreach($urls as $url){ echo "loading:".$url."\r\n"; //隨機睡眠7到11秒 $second=rand(7,11); echo "sleep...{$second}s\r\n"; sleep($second); //發起請求 $followList=$ukSpider->getFollowsByUrl($url); //若是已經沒有數據了,要停掉請求 if(empty($followList)){ break; } print_r($followList); }
循環請求上一步生成的urls,注意,此處要間隔必定秒數來發請求,不然會被直接封掉的,而且要判斷若是沒有數據了要停掉循環。此腳本必定要在命令行模式下運行,在瀏覽器上會直接超時死掉了。
循環往復採集用戶uk編號
使用mysql數據庫,建一張表例如uks,存儲採集到的用戶編號,表結構以下:
CREATE TABLE `uks` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `uk` varchar(100) NOT NULL DEFAULT '', `get_follow` tinyint(4) NOT NULL DEFAULT '0', `get_share` tinyint(4) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `uk_2` (`uk`), KEY `uk` (`uk`) )
先存入一批,而後再根據這批繼續找訂閱盤主,不停的循環,裏面的重要字段是:uk是惟一的 ; ’get_follow默認爲0 當第二遍找它的訂閱列表時,修改成1,防止重複採集。
下一篇介紹根據uk獲取分享列表,而且入庫
演示地址,關注微信公衆號:網盤小說,或者掃描下面的二維碼