標題起的太大了,都是騙人的。最近使用PHP實現了簡單的網盤搜索程序,並且關聯了微信公眾平台。用戶可以通過公眾號輸入關鍵字,公眾號會返回相應的網盤下載地址。就是這么一個簡單的功能,類似很多的網盤搜索類網站,我這個采集和搜索程序都是PHP實現的,全文和分詞搜索部分使用到了開源軟件xunsearch,現在就來介紹一下實現過程。
1. 獲取一批網盤用戶
2. 根據網盤用戶獲取分享列表
3. xunsearch實現全文檢索和分詞檢索
4. 微信公眾平台接口開發
功能展示:
獲取並采集百度網盤用戶
要想獲取到分享列表,首先要先把百度的用戶信息收集下來,現在我來介紹如何找到一大批百度的用戶。先把瀏覽器的審查元素打開,查看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 (分頁起始編號) ; 剩下的參數全都並無任何卵用。
精簡后的接口地址是: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獲取分享列表,並且入庫
演示地址,關注微信公眾號:網盤小說,或者掃描下面的二維碼