Bilibili番剧/视频下载 || BILIBILI AS
萌新杰少
2020年08月08日 16:34

看到最近网上有很多这样的程序,他们有网页脚本,PC电脑端,但是我发现几乎没有正式的Android端,所有呢我就用Java写了个Android的,免费使用,这里也提醒大家在使用过程中不得商用,不得做违法侵权行为。

我通过到处搜集B站的接口 参考大量文献才实现的 我的程序也已经开源了

唉,不过马上高二了,我会很努力更新视频,大家一定要多多支持呀awa


最后面我也简单提供下自己的匹配算法  

软件已经实现了扫码WEB端方式接入登录 并且可以记录你的登录历史记录

我还加入了 投币 点赞 三连 功能

实现了扫码登录  下载速度稍微有点慢,依赖于B站接口。

当前还在测试程序

下载地址  https://www.lanzoui.com/iisi8fds5ab

这里简单说一下软件目前存在的问题

  1. 本程序依赖于B站的API  也就是不要想什么4K画质,就1080P60格式都需要登录大会员账号下载。画质问题就不要在问了,我也没有突破的意思。

  2. 同样的付费番剧也需要登录大会员账号,否则无法下载,画质最高1080。全部视频均携带水印,这也是对B站视频的保护。

  3. 如果你的Android10闪退,请重新进入一次,等待软件公告出现后再操作,这是我们软件公告获取节点问题,部分地区无法访问到这个接口,如果还是闪退,你试一下流量进入。

  4. 进入后点击解析,没有登录会调到登录页面,登录一次后会记录下来在你本地,下次直接解析即可,登录记录消失,会重新提醒。

  5. 登录页面进入后耐心等待加载,如果加载不出来二维码就刷新一下页面,点击后耐心等待,并非没有响应,还是网站节点问题,我们正在想办法,


BILIBILI AS截图


下面我把自己的计算用户输入的内容,分别分配到BVID和AID的接口算法放出来。

看代码吧,就不再多解释了,注意里面调用的方法,我已经开源了,分配后二次处理的方法你去开源项目里看看。

public class bvUrl extends Thread {    @Override    public void run() {        /*修什么BUG???写个try罩住 【手动滑稽】        哈哈好吧,这里实际上是我有点懒了,不想再分析空指针也就是其中有必需值为空时提示解析失败        所以最快的方法就是罩住,我以后一定改写一下         */        try {            String name = null;            //定位数据            //判断下这是不是个纯bv号            if (isENChar(bvid)) {                //先检测av是否具备,因为av接口更为苛刻                if (bvid.contains("av&#​34;)) {                    //过滤掉多余的东西                    //判断这是不是一个链接                    if(bvid.contains("https&#​34;)||bvid.contains("http&#​34;)){                        //给特殊的方法处理判断,传导这个链接进去 即为公共解析                        public_jx(bvid);                    }else {                        //如果不是,就直接让接口解析                        bvid = bvid.replaceAll("av&#​34;, "&#​34;);                        name = HttpUtils.doGet("网页链接​; + bvid,cookie);                        abvGo(name);                    }                } else if(bvid.contains("bv&#​34;)||bvid.contains("BV&#​34;)) {                    //有BV也有链接头                    if(bvid.contains("https&#​34;)||bvid.contains("http&#​34;)){                        //给特殊的方法处理判断,传导这个链接进去 即为公共解析                        public_jx(bvid);                    }else{                        //相反没有携带则就是BV编号                        name = HttpUtils.doGet("网页链接​; + bvid,cookie);                        abvGo(name);                    }                }else                {                    //AV/BV都没有,则可能是番剧的或者是手机分享的av,bv链接                    //给番剧接口处理即可,这里先判断是不是手机分享地址                    if(bvid.contains("https://b23.tv/&#​34;)){                        //这里来看看是不是番剧                        if(bvid.contains("ep&#​34;)){                            epGo(bvid);                        }else{                            //如果不是则一定是视频地址                            public_jx(bvid);                        }                    }else {                        //如果都不是那就应该是电脑番剧链接                        epGo(bvid);                    }                }            } else {                //全数字一定是av                name = HttpUtils.doGet("网页链接​; + bvid,cookie);                abvGo(name);            }        }catch (Exception e) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    //关闭弹窗,提示失败                    pd2.cancel();                    Toast.makeText(getApplicationContext(), "看起来没有解析到&#​34;, Toast.LENGTH_SHORT).show();                }            });        }    } }

下面是正则匹配是否有英文的方法

//bv和av号的检测 -- 正则表达匹配是否有英文 public static boolean isENChar(String string) {    //赋值初始类型    boolean flag = false;    //正则表达式执行返回结果    Pattern p = Pattern.compile("[a-zA-z]&#​34;);    //判断是否满足matcher()是完全匹配find()是部分满足    if(p.matcher(string).find()) {        flag = true;    }    return flag; }