从Google Drive获取流式链接[代码已准备好,访问被拒绝]
我试图重复从Google云端硬盘中获取可下载链接的过程,就像在Internet下载管理器(Windows)中使用的过程一样。
我正在做以下事情:
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播放器并找出如何复制它请求这些网址的方式。
上一篇: Getting streamable link from Google Drive [Code is ready, Access is denied]
下一篇: Function speed improvement: Convert ints to list of 32bit ints