澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站采集爬取百度网盘分享文

标题起的太大了,都是骗人的。最近使用PHP实现了简单的网盘搜索程序,并且关联了微信公众平台。用户可以通过公众号输入关键字,公众号会返回相应的网盘下载地址。就是这么一个简单的功能,类似很多的网盘搜索类网站,我这个采集和搜索程序都是PHP实现的,全文和分词搜索部分使用到了开源软件xunsearch,现在就来介绍一下实现过程。

最近在研究百度网盘的视频解析,目的是找出网盘视频的真实源地址。百度网盘对于超过1G的文件需要通过网盘客户端下载,通过抓包研究,可下载源视频有以下4个渠道:

  1. 获取一批网盘用户

  2. 根据网盘用户获取分享列表

  3. xunsearch实现全文检索和分词检索

  4. 微信公众平台接口开发

 

 

一、

 

这是分享后的视频地址

功能展示:

澳门新浦京娱乐场网站 1

澳门新浦京娱乐场网站 2澳门新浦京娱乐场网站 3

找到视频源解析地址:

 

澳门新浦京娱乐场网站 4

获取并采集百度网盘用户

接口地址:

要想获取到分享列表,首先要先把百度的用户信息收集下来,现在我来介绍如何找到一大批百度的用户。先把浏览器的审查元素打开,查看HTTP的请求包,打开自己的百度网盘主页地址  ,查看订阅的用户列表,观察请求。

请求方式:GET,需带登录后的百度网盘COOKIE

澳门新浦京娱乐场网站 5

参数:channel、uk、path、sign、timestamp、shareid、type

这个请求就是获取订阅用户列表的接口。

说明:

上面的参数含义分别是:query_uk (我自己的id编号,百度都是以uk来命名的)  ; limit (分页时每页显示的条数) ; start (分页起始编号) ; 剩下的参数全都并无任何卵用。

channel=chunlei (固定写死)

精简后的接口地址是:

uk、path、sign、timestamp、shareid在源代码可以采集到

 

澳门新浦京娱乐场网站 6

处理分页的获取订阅者接口地址

 

先暂时假设,我订阅了2400个用户,这个数量基本够用了。每页显示24个用户,那么就会分100页,则先看如何生成这个100个url。

type为视频类型和清晰度

<?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);

视频解析出来是m3u8格式

获取的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请求接口地址

这是未分享的视频地址,通过PC端网盘抓包的接口也一样

请求接口地址时,可以直接使用file_get_contents()函数,但是我这里使用的是PHP的CURL扩展函数,因为在获取分享文件列表时需要修改请求的header头信息。

澳门新浦京娱乐场网站 7

此接口返回的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."rn";
    //随机睡眠7到11秒
    $second=rand(7,11);
    echo "sleep...{$second}srn";
    sleep($second);
    //发起请求
    $followList=$ukSpider->getFollowsByUrl($url);
    //如果已经没有数据了,要停掉请求
    if(empty($followList)){
        break;
    }
    print_r($followList);
}

请求方式:GET,需带登录后的百度网盘COOKIE

澳门新浦京娱乐场网站, 

请求参数:timestamp、sign、fidlist、type

循环请求上一步生成的urls,注意,此处要间隔一定秒数来发请求,否则会被直接封掉的,并且要判断如果没有数据了要停掉循环。此脚本一定要在命令行模式下运行,在浏览器上会直接超时死掉了。

说明:

循环往复采集用户uk编号

timestamp可以在页面源代码中采集;

使用mysql数据库,建一张表例如uks,存储采集到的用户编号,表结构如下:

澳门新浦京娱乐场网站 8

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,防止重复采集。

sign需要取得sign3和sign1后(sign3和sign1在页面源代码中采集

 

澳门新浦京娱乐场网站 9

下一篇介绍根据uk获取分享列表,并且入库

),通过sign2的加密算法并base64后得到;

演示地址,关注微信公众号:网盘小说,或者扫描下面的二维码

 

澳门新浦京娱乐场网站 10

下面给出sign的php实现算法:

 

function s($j,$r)
{
  $a = array();
  $p = array();
  $o = "";
  $v = strlen($j);
  $j = str_split($j,1);

  for($q=0;$q<256;$q  )
  {
    $a[$q] = charCodeAt($j[$q%$v]);
    $p[$q]=$q;
  }

  for($u=$q=0;$q<256;$q  )
  {
    $u=($u $p[$q] $a[$q])%6;
    $t=$p[$q];
    $p[$q]=$p[$u];
    $p[$u]=$t;
  }

  for($i=$u=$q=0;$q<strlen($r);$q  )
  {
    $i=($i 1)%6;
    $u=($u $p[$i])%6;
    $t=$p[$i];
    $p[$i]=$p[$u];
    $p[$u]=$t;
    $k=$p[(($p[$i] $p[$u])%6)];
    $r2 = str_split($r,1);
    $o.=fromCharCode(charCodeAt($r2[$q])^$k);
  }
  return base64_encode($o);
}

function charCodeAt($str)
{
  $ret = mb_convert_encoding($str, 'UTF-32BE', 'UTF-8');
  return hexdec(bin2hex($ret));
}

function fromCharCode($codes)
{
  if (is_scalar($codes))
    $codes= func_get_args();
  $str= '';
  foreach ($codes as $code)
    $str.= chr($code);
  return $str;
}

sign=s($sign3,$sign1);

 

fidlist值是视频ID值的集合,例如视频ID为1157929130,fidlist就是[1157929130],当取多视频时就是[澳门新浦京娱乐场网站采集爬取百度网盘分享文件实现网盘搜索,获取真实源地址。1157929130,1157929131,1157929132],视频ID可以通过列表接口获得:

 

type值写死dlink

 

最后请求返回json结果,其中dlink就是我们要的视频真实源地址:

澳门新浦京娱乐场网站 11

 

三、

澳门新浦京娱乐场网站采集爬取百度网盘分享文件实现网盘搜索,获取真实源地址。百度开发者中心-PCS接口,目前暂停开放;

 

四、

百度网盘开放平台-目前只支持AndroidSDK

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:澳门新浦京娱乐场网站采集爬取百度网盘分享文