从Google Drive获取流式链接[代码已准备好,访问被拒绝]

我试图重复从Google云端硬盘中获取可下载链接的过程,就像在Internet下载管理器(Windows)中使用的过程一样。

我正在做以下事情:

  • 下载链接的HTML源代码。
  • 使用正则表达式来搜索fmt_stream_map
  • 解码。
  • 试图达到链接。
  • 拒绝访问。
  • 互联网下载管理器使用相同的方法,并且运行良好。 我使用手机获取链接,并通过手机访问链接。 所以基本上它是相同的IP和相同的设备。

    我的代码首先下载源代码。 搜索地图列表,然后将质量及其描述存储在数组中。 之后,我搜索链接的fmt_stream_map,并将它们添加到最终model ,以便轻松访问它们。

    我有3个类,其中两个是模型,最后一个是这个过程的主要类。

    public class ItemStreamList {
    
        private String quality;
        private String description;
    
        public ItemStreamList(){
    
        }
    
        public ItemStreamList(String quality, String description){
            this.quality = quality;
            this.description = description;
        }
    
        public String getQuality() {
            return quality;
        }
    
        public void setQuality(String quality) {
            this.quality = quality;
        }
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    }
    
    
    
    
    
    public class ItemLink {
    
        private String quality;
        private String qualityDesc;
        private String link;
    
        public ItemLink(){
    
        }
    
        public ItemLink(String quality, String qualityDesc, String link){
            this.quality = quality;
            this.qualityDesc = qualityDesc;
            this.link = link;
        }
    
        public String getQualityDesc() {
            return qualityDesc;
        }
    
        public void setQualityDesc(String qualityDesc) {
            this.qualityDesc = qualityDesc;
        }
    
        public String getLink() {
            return link;
        }
    
        public void setLink(String link) {
            this.link = link;
        }
    
        public String getQuality() {
            return quality;
        }
    
        public void setQuality(String quality) {
            this.quality = quality;
        }
    }
    

    现在我们来到主要课程。 这是一个“有点”记录。

      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            getPageHTML("https://drive.google.com/file/d/0B7--EhvK76QDNmduLWFZMXh1dGs/view");
        }
    
        private void getPageHTML(final String mURL){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Document mDoc = Jsoup.connect(mURL).get();
                        String mHTML = mDoc.toString();
    
                        boolean hasSetStreamMapList = setStreamMapList(mHTML);
    
                        String mStreamMap = getMatchRegex(mHTML,""fmt_stream_map","",""]");
                        mStreamMap = org.apache.commons.text.StringEscapeUtils.unescapeJava(mStreamMap);
                        String[] mStreamMapQualities = mStreamMap.split(",");
    
                        if(hasSetStreamMapList){
                            List<ItemLink> mLinks = new ArrayList<>();
    
                            for (int i = 0; i < mStreamMapQualities.length; i++){
                                String[] mLinksArray = mStreamMapQualities[i].split("|");
                                String mLink = mLinksArray[1];
                                mLink = mLink.replaceAll("%2",",");
                                mLinks.add(new ItemLink(mLinksArray[0],getQualityDescription(mLinksArray[0]),mLink));
                            }
    
                            for (int i = 0; i < mLinks.size(); i++){
                                Log.i("StreamMap","Quality: " + mLinks.get(i).getQuality() + " - " + mLinks.get(i).getQualityDesc() + "n" + "Link: " + mLinks.get(i).getLink());
                                Log.i("StreamMap","---------------------------");
                            }
    
                            startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(mLinks.get(0).getLink())));
    
    
                        } else {
                            Log.i("StreamMap","Stream Map is NOT set");
                        }
    
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        private List<ItemStreamList> mStreamListItems;
    
        private String getQualityDescription(String mQuality){
            // Loop through the Stream Map's Array
            for (int i = 0; i < mStreamListItems.size(); i++){
                // If the Quality contains the Param, then return it
                if(mStreamListItems.get(i).getQuality().contains(mQuality))
                    return mStreamListItems.get(i).getDescription();
            }
            // Didn't find the quality, return null
            return null;
        }
    
        private boolean setStreamMapList(String mSource){
    
            // Define the Array
            mStreamListItems = new ArrayList<>();
    
            // Get the fmt_list from the HTML
            String mStreamMapList = getMatchRegex(mSource,""fmt_list","",""]");
            // Check if isn't null
            if(mStreamMapList != null){
                // Split the qualities by ","
                String[] mStreamMapListArray = mStreamMapList.split(",");
                // Loop through the Array
                for (int i = 0; i < mStreamMapListArray.length; i++){
                    /*
                    Split the array by "/"
                    First index has the quality
                    Second index has the quality's description
                    */
                    String[] mModelArray = mStreamMapListArray[i].split("/");
                    mStreamListItems.add(new ItemStreamList(mModelArray[0],mModelArray[1]));
                }
    
                return true;
    
            }
    
            // It's null or not set, return false
            return false;
        }
    
        private String getMatchRegex(String mSource, String mFirst, String mSecond){
            String regexString = Pattern.quote(mFirst) + "(.*?)" + Pattern.quote(mSecond);
            Pattern mPattern = Pattern.compile(regexString);
            Matcher mMatcher = mPattern.matcher(mSource);
            while(mMatcher.find())
            {
                String resultString = mMatcher.group(1);
    
    
                return resultString;
            }
            return null;
        } 
    

    你得到一个403代码,因为你没有在fmt_stream_map链接上传递任何头文件。

    在浏览器中打开顶部链接时,使用所有这些标头查询fmt_stream_map链接:

    在这里输入图像描述

    所需的标题没有记录,因为你不应该这样整合谷歌驱动器


    我认为流式链接仅限于类似YouTube的视频查看器。 这可能会导致“403访问被拒绝”错误。 我不认为你能够以这种方式下载流链接。 我不知道IDM使用什么方法(无法找到src代码),但我认为他们以某种方式与Google API集成,因为这将是更加正确和持久的方式。

    这里有一些替代品。

  • 如果您只需要该文件,请尝试使用Google Drive Android API。

  • 如果您想播放视频,请考虑使用YouTube Android Player API。

  • 最后的办法是挖掘YouTube播放器并找出如何复制它请求这些网址的方式。

  • 链接地址: http://www.djcxy.com/p/841.html

    上一篇: Getting streamable link from Google Drive [Code is ready, Access is denied]

    下一篇: Function speed improvement: Convert ints to list of 32bit ints