#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端 原创 精华

dstt_l3
发布于 2021-12-15 12:40
浏览
13收藏

【本文正在参与51CTO HarmonyOS技术社区创作者激励计划-星光计划2.0】

介绍

什么是菟盘

菟盘,由百度网盘开放平台提供的API开发的一个百度网盘客户端。
主要提供网盘文件浏览,文件下载等。(100M以下文件不限速,超过100M就是祖传100k/s了,支持会员加速)
👉百度网盘开放平台

应用主入口

本应用主入口是MainAbility ,当打开应用时,会判断用户是否已登录,未登录会跳转到登录页面,已登录会跳转到主页。

登录界面

登录通过webview来请求百度的access_token
#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙开发者社区
接入流程文档
这里需要注意一个细节,官方文档提供的授权地址是PC版的,需要改造一下,来适配手机页面。
原理是先在百度H5端登录,登录完成后重定向至授权地址。

/*
    百度应用信息
     */
    String YOUR_CLIENT_ID = ""; //填自己的
    String YOUR_REGISTERED_REDIRECT_URI = "https://dsttl3.cn/baiduapi.html"; //需要和自己在百度网盘开放平台填写的相同,有个地址就行,不需要在服务器操作。当然也可以在服务器请求token后直接返回。
    String YOUR_CLIENT_SECRET = ""; //填自己的

    /**
     * @return 移动端登录授权链接
     */

    public String getLoginUrl(){

        String url = "https://openapi.baidu.com/oauth/2.0/authorize?response_type=code" +
                "&client_id=" +YOUR_CLIENT_ID +
                "&redirect_uri=" + YOUR_REGISTERED_REDIRECT_URI +
                "&scope=basic,netdisk&force_login=0";
        try {
            url = URLEncoder.encode(url,"UTF-8");
            url = "https://wappass.baidu.com/passport/?login&tpl=wimn&sms=1&regtype=1&u=" +
                    url +
                    "&extrajson=%7b%22src%22%3a%22se_000000%22%7d#/password_login";
            return url;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * @return Access_token授权链接
     */

    public String getAccessTokenUrl(String CODE){
        return "https://openapi.baidu.com/oauth/2.0/token?grant_type=authorization_code" +
                "&code=" + CODE +
                "&client_id=" + YOUR_CLIENT_ID +
                "&client_secret=" + YOUR_CLIENT_SECRET +
                "&redirect_uri=" + YOUR_REGISTERED_REDIRECT_URI;
    }

webview内的操作

WebView webView = (WebView) findComponentById(ResourceTable.Id_login_wv);
        webView.getWebConfig().setJavaScriptPermit(true);
        webView.setWebAgent(new WebAgent(){
            @Override
            public boolean isNeedLoadUrl(WebView webView, ResourceRequest request) {
                if (request.getRequestUrl().toString().startsWith("https://dsttl3.cn")){ // 这个链接是你所填写的 YOUR_REGISTERED_REDIRECT_URI 这里只写了开头,效果相同
                    String code = request.getRequestUrl().toString().split("code=")[1];
                    String Access_token_url = new AppUtils().getAccessTokenUrl(code);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                OkHttpClient client = new OkHttpClient();
                                Request request = new Request.Builder().url(Access_token_url)
                                        .header("User-Agent","pan.baidu.com")
                                        .build();
                                Call call = client.newCall(request);
                                String accessTokenJson = call.execute().body().string();
                                AccessToken accessToken = new Gson().fromJson(accessTokenJson, AccessToken.class);
                                System.out.println(accessToken.getAccess_token());
                                getUITaskDispatcher().asyncDispatch(new Runnable() {
                                    @Override
                                    public void run() {
                                        Preferences preferences = new DataUtils().getPreferences(getApplicationContext());
                                        preferences.putString("token",accessToken.getAccess_token());
                                        preferences.flush();
                                        Intent intent1 = new Intent();
                                        Operation operation = new Intent.OperationBuilder()
                                                .withBundleName(MyApp.bundleName)
                                                .withAbilityName("cn.dsttl3.tupan.Ability.IndexAbility")
                                                .build();
                                        intent1.setOperation(operation);
                                        startAbility(intent1);
                                        terminateAbility(); //因为登录完成后无需返回改界面,通过 terminateAbility() 方法销毁该界面
                                    }
                                });
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }).start();
                    return false;
                }
                return super.isNeedLoadUrl(webView, request);
            }
        });
        webView.load(new AppUtils().getLoginUrl()); // 这里是上面转换链接的方法

当用户完成登录后,token就保存到本地了。

主页面

使用ListContainer来显示文件列表
#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙开发者社区
代码有点多,不在本文介绍了,可以参考ListContainer的相关文档

==这里介绍一下防手滑操作==
当该应用只有一个界面时,一不小心返回,导致应用直接退出,可以使用这个方法进行一个提醒。

/**
     * 防止误退出操作
     */
    boolean exit = true;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
        if (exit){
            new ToastDialog(getContext()).setText("再次返回退出程序").show();
            exit = false;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    Time.sleep(3000);//三秒内再次返回退出程序
                    exit=true;
                }
            }).start();
            return true;
        }else {
            return false;
        }
    }

下载页面

提供两种下载方式,本地下载和Aria2下载
#星光计划2.0# 菟盘 - 鸿蒙版百度网盘客户端-鸿蒙开发者社区

解析处理的链接不能直接下载,必需要设置User-Agent字段为pan.baidu.com才能正常下载

怎么获取该应用

1、自己编译,本文附件提供源码

需要修改的地方
1、 包名
config.json 下的bundleName,和cn.dsttl3.tupan目录下MyApp.javabundleName。不修改导致无法真机运行和页面跳转失败
2、 填写百度开放平台应用信息
cn.dsttl3.tupan.utils 目录下的 AppUtils.java

/*
    百度应用信息
     */
    String YOUR_CLIENT_ID = ""; //填自己的
    String YOUR_REGISTERED_REDIRECT_URI = "https://dsttl3.cn/baiduapi.html"; //需要和自己在百度网盘开放平台填写的相同,有个地址就行,不需要在服务器操作。当然也可以在服务器请求token后直接返回。
    String YOUR_CLIENT_SECRET = ""; //填自己的

3、 签名文件
这个需要自己操作

视频讲解https://www.bilibili.com/video/BV1dR4y1p7f6/

2、下载测试版

不需要自己下载代码进行编译

留言或私信华为账号,我会给你添加测试。然后通过华为官方发送的短信进行下载。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
TuPan.zip 12.83M 107次下载
已于2021-12-16 19:52:08修改
13
收藏 13
回复
举报
19条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

前排支持,另外为了自己的个人隐私,大佬可以考虑给自己的网盘打个码

1
回复
2021-12-15 14:28:44
dstt_l3
dstt_l3 回复了 红叶亦知秋
前排支持,另外为了自己的个人隐私,大佬可以考虑给自己的网盘打个码

关键信息删掉了,谢谢提醒

1
回复
2021-12-15 15:34:32
文艺青年Rick
文艺青年Rick
求测试版下载
1
回复
2021-12-16 13:23:04
dstt_l3
dstt_l3 回复了 文艺青年Rick
求测试版下载

私信我你的华为账号就可以邀请了

1
回复
2021-12-16 13:47:28
dstt_l3
dstt_l3

在B站更新了视频讲解,需要自己编译的可以看看

https://www.bilibili.com/video/BV1dR4y1p7f6/

2
回复
2021-12-17 01:11:38
mb61bcc04ca57bf
mb61bcc04ca57bf 回复了 dstt_l3
私信我你的华为账号就可以邀请了
15630868405
1
回复
2021-12-18 00:53:46
ᴊ_ʜ_ғ_ᴛ
ᴊ_ʜ_ғ_ᴛ

18684029678  谢谢

回复
2021-12-21 12:14:59
dstt_l3
dstt_l3 回复了 ᴊ_ʜ_ғ_ᴛ
18684029678 谢谢

邀请了

回复
2021-12-21 13:17:15
mb61c1b44c3d1ad
mb61c1b44c3d1ad
18657255539 想要一个邀请。谢谢
回复
2021-12-21 19:04:37
dstt_l3
dstt_l3 回复了 mb61c1b44c3d1ad
18657255539 想要一个邀请。谢谢

邀请了

回复
2021-12-21 19:39:16
mb61c1b44c3d1ad
mb61c1b44c3d1ad 回复了 dstt_l3
邀请了
好的谢谢,刚刚试了下,从登录到下载一切都还蛮顺利的。既然是轻量化。那么就要做到一步直达。希望后续的更新可以保留这种简洁的布局。
回复
2021-12-21 20:18:14
mb61c1dee145d5b
mb61c1dee145d5b
19895803295 谢谢楼主分享!
回复
2021-12-21 22:07:53
mb61c1f149a17ad
mb61c1f149a17ad
935288674@qq.com 谢谢
回复
2021-12-21 23:23:45
mb61c1f149a17ad
mb61c1f149a17ad
18626851051
回复
2021-12-22 09:59:24
dstt_l3
dstt_l3 回复了 mb61c1f149a17ad
18626851051

你的我邀请了,不知道为啥还显示未发送,你看看有没有收到邀请短信

 

回复
2021-12-22 12:02:03
mb61c392bd28bb3
mb61c392bd28bb3
13186190988 谢谢
回复
2021-12-23 05:05:35
dstt_l3
dstt_l3 回复了 mb61c1f149a17ad
935288674@qq.com 谢谢

邀请你了,因为你的是邮箱账号,需要到邮箱查看邀请链接

回复
2021-12-23 08:49:50
宴秋
宴秋

18063303698 想测试一下!

回复
2021-12-26 15:04:14
dstt_l3
dstt_l3 回复了 宴秋
18063303698 想测试一下!

你这个是无效账号

回复
2021-12-27 11:29:50
回复
    相关推荐