哈喽大家好,我做了一个随机访问一个B站视频的网页。这个是我看到一个随机访问网页的项目而突发奇想的。
功能:
- 随机访问一个B站视频
- 针对手机端的适配
地址:
如果有什么意见和建议都可以写在评论区,我都会看的!
以下内容为开发难点和攻克过程:
这个网页由HTML + JS + PHP开发,前端并不难写,主要我花费了很多时间寻找BV号的规律:
1.最开始我是根据作者阿瓦隆系统的BV号规律总结(https://www.bilibili.com/read/cv5262072/)
第一种(绝大部分,从AV2到最新的视频)
BV1++411+7++
第二种(对应的AV号是以7,8,9开头的9位数字)
BV1++4y1+7++
而拼出的bv号地址,发现拼出的BV号很多视频都不存在!
2.后面为了改进这个问题,我在知乎上寻找到了B站的API地址(https://zhuanlan.zhihu.com/p/210779665):
其中根据B站官方的伪随机API:
API:https://api.bilibili.com/x/web-interface/dynamic/region
说明:每次请求都会有伪随机的视频推荐,推荐视频和当前用户偏好有关
而制作的地址
3.得到了API,我本来是想JS直接AJAX-GET获取API的内容,但是存在CORS跨域的而无法获取到数据的问题,
而且我尝试了很多办法都无法克服跨域。正当我一筹莫展的时候,群里的老哥CodeDog给出了意见:
找个http请求的框架请求不就好了
请求头加上个host
意思是你用PHP的话就用curl请求在封装接口
最后我根据一个老哥在菜鸟教程底下的笔记得到了一个curl封装:
因为需要在 php 开发中对接其它接口需要用 php curl 去对接其它接口 我把他们封装成函数 希望能对大家有所帮助。
这里面是封装好的会自动把 data 进行转成 json 格式,同时解码成 php 数组输出。
<?php
function geturl($url){
$headerArray =array("Content-type:application/json;","Accept:application/json");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
return $output;
}
function posturl($url,$data){
$data = json_encode($data);
$headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return json_decode($output,true);
}
function puturl($url,$data){
$data = json_encode($data);
$ch = curl_init(); //初始化CURL句柄
curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出
curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output,true);
}
function delurl($url,$data){
$data = json_encode($data);
$ch = curl_init();
curl_setopt ($ch,CURLOPT_URL,$put_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output,true);
}
function patchurl($url,$data){
$data = json_encode($data);
$ch = curl_init();
curl_setopt ($ch,CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data); //20170611修改接口,用/id的方式传递,直接写在url中了
$output = curl_exec($ch);
curl_close($ch);
$output = json_decode($output);
return $output;
}
?>
终于,这个看似简单的HTML界面写成了!非常感谢以上提到的大佬们的帮助!
- 最新
- 最热
只看作者啊这...感谢 {{dianzan}}