必威体育Betway必威体育官网
当前位置:首页 > IT技术

autojs调用java的类库爬取bilibili视频弹幕内容,get请求方法值得学习

时间:2019-08-27 09:42:11来源:IT技术作者:seo实验室小编阅读:69次「手机版」
 

www.bilibili.com

/**
 * @功能 爬取指定bilibili视频弹幕
 * @作者 家
 * @感谢 内个谁, ProjectXero
 * @难点 不会解压gzip和deflate,再次感谢上面两位大佬的帮助
 * @return 弹幕数组
 */
 //此代码由飞云脚本圈整理提供(www.feiyunjs.com)
runtime.loadJar('/sdcard/jsoup.jar')
importClass("org.jsoup.Jsoup")
importClass("java.io.IOException")
importClass("java.util.HashMap")
// importClass("org.jsoup.nodes.Document")
// importClass("org.jsoup.nodes.Element")
// importClass("org.jsoup.select.Elements")
importClass(java.io.fileinputstream);
importClass(java.util.zip.GZIPInputStream);
importClass("java.util.ArrayList")
importClass("java.io.DatainputStream");
importClass("java.io.Dataoutputstream");
importClass("java.io.outputstreamwriter");
importClass("java.io.BufferedWriter");
importClass('java.io.BufferedReader');
importClass('java.io.IOException');
importClass('java.io.InputStream');
importClass('java.io.inputstreamreader');
importClass('java.io.OutputStream');
importClass('java.io.BufferedOutputStream');
importClass('java.io.ByteArrayInputStream');
importClass('java.io.BufferedInputStream');
importClass('java.io.ByteArrayOutputStream');
importClass('java.io.printwriter');
importClass('java.io.FileOutputStream');
// importClass('java.io.StringBuffer');
importClass('java.io.File');
importClass('java.net.socket');
importClass('java.net.UnknownHostException');
importClass("java.util.zip.CRC32")
importClass("java.util.zip.CheckedOutputStream")
importClass("java.util.zip.ZipEntry")
importClass("java.util.zip.ZipOutputStream")
importClass("java.util.zip.ZipFile")
importClass("java.util.zip.InflaterInputStream")
importClass("java.util.zip.Inflater")
var videoUrl = 'https://www.bilibili.com/video/av41925519?from=search&seid=4347458925007967861'
main(videoUrl)

function main(videoUrl) {
  var webPage = getWebPageGzip(videoUrl)
  var videoInfo = getVideoInfo(webPage)
  var oid = getOid(videoInfo)
  var barrageUrl = getBarrageUrl(oid)
  webPage = getWebPageDeflate(barrageUrl)
  var doc = Jsoup.parse(webPage);
  var barrage = getBarrage(doc)
  console.show()
  log(barrage)
}

function getOid(videoInfo) {
  return videoInfo.cid
}

function getVideoInfo(webPage) {
  var window__INITIAL_STATE__REG = /<script>window\.__INITIAL_STATE__={[\s\S]*?<\/script>/
  var window__INITIAL_STATE__ = webPage.match(window__INITIAL_STATE__REG)
  window__INITIAL_STATE__ = window__INITIAL_STATE__[0]
  window__INITIAL_STATE__ = window__INITIAL_STATE__.replace(/<[\/]?script>/g, '')
  window__INITIAL_STATE__ = window__INITIAL_STATE__.replace(/window.__INITIAL_STATE__=/, '')
  window__INITIAL_STATE__ = window__INITIAL_STATE__.match(/[\s\S]*}(?=;)/)
  window__INITIAL_STATE__ = window__INITIAL_STATE__[0]
  window__INITIAL_STATE__ = JSON.parse(window__INITIAL_STATE__)
  var videoData = window__INITIAL_STATE__.videoData
  var title = videoData.title
  title = title.replace(/[&\|\\\*^%$#@\-,」 「。]/g, "");
  var cid = videoData.cid
  var info = {
    title: title,
    cid: cid
  }
  log('info')
  log(info)
  return info
}

function getWebPageDeflate(url) {
  var headers = {
    'Accept': 'text/html,APPlication/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Host': 'api.bilibili.com',
    'pragma': 'no-cache',
    'Upgrade-Insecure-requests': '1',
    'User-Agent': 'Mozilla/5.0 (windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
  }
  var res = http.get(
    url, {
      headers: headers
    })
  log("statusCode = " + res.statusCode);
  var deflateFilecontent = res.body.bytes()
  var 网页内容 = null;
  if (deflateFileContent) {
    var br = new BufferedReader(new InputStreamReader(new InflaterInputStream(new ByteArrayInputStream(deflateFileContent), new Inflater(true))));
    var lns = [],
      cl;
    while (cl = br.readLine()) lns.push(cl);
    网页内容 = lns.join("\n")
    // log('网页内容')
    // log(网页内容)
    return 网页内容
  } else {
    console.ERROR('下载失败')
    exit()
  }
  return false
}

function getWebPageGzip(url) {
  var headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Host': 'www.bilibili.com',
    'Pragma': 'no-cache',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
  }
  var res = http.get(
    url, {
      headers: headers
    })
  log("statusCode = " + res.statusCode);
  var gzipFileContent = res.body.bytes()
  var 网页内容 = null;
  if (gzipFileContent) {
    var 网页保存路径 = 保存zip文件(gzipFileContent)
    网页内容 = files.read(网页保存路径)
    // log('网页内容')
    // log(网页内容)
    return 网页内容
  } else {
    console.error('下载失败')
    exit()
  }
  return false
}

function 保存zip文件(zipFile) {
  var path = files.join(files.cwd(), "1下载bilibili弹幕专用/webPage.gzip.js")
  files.createWithDirs(path)
  log("path=", path)
  // path= /storage/emulated/0/脚本/zip文件专用/test.zip
  files.writeBytes(path, zipFile)
  var r = 解压zip文件(path)
  log(r)
  return r
}

function 解压zip文件(文件路径) {
  //同一目录下的同一文件名
  // unzipGzipFile(sourceGzipFilePath, targetPath)
  var fileName = files.getName(文件路径)
  var 解压后的文件路径 = 文件路径.replace(fileName, 'webPage.js')
  log('解压的解压后的文件路径=', 解压后的文件路径)
  files.createWithDirs(解压后的文件路径)
  // com.stardust.io.Zip.unzip(new java.io.File(文件路径), new java.io.File(解压后的文件路径))
  var sourceGzipFilePath = 文件路径
  var targetPath = 解压后的文件路径
  unzipGzipFile(sourceGzipFilePath, targetPath)
  return targetPath
}

function unzipGzipFile(sourceGzipFilePath, targetPath) {
  var sourceGzipFilePath = sourceGzipFilePath || '/sdcard/tempSourceGzipFilePath.js'
  var targetPath = targetPath || '/sdcard/tempTargetPath.js'
  log('sourceGzipFilePath')
  log(sourceGzipFilePath)
  log('targetPath')
  log(targetPath)
  var sChunk = 8192;
  var gzipFileInputStream = new FileInputStream(sourceGzipFilePath);
  var zipin = new GZIPInputStream(gzipFileInputStream);
  var buffer = util.java.array('byte', sChunk)
  var out = new FileOutputStream(targetPath);
  var length;
  while ((length = zipin.read(buffer, 0, sChunk)) != -1)
    out.write(buffer, 0, length);
  out.close();
  zipin.close();
}

function getBarrageUrl(oid) {
  var url = util.format('https://api.bilibili.com/x/v1/dm/list.so?oid=%s', oid)
  return url
}

function getBarrage(doc) {
  var d = doc.select("d");
  d = d.toArray()
  var barrage = []
  for (let i = 0; i < d.length; i++) {
    barrage.push(d[i].text())
  }
  return barrage
}

说明

本文提供的代码仅供参考。

可能有些地方在最新版本的Auto.js上面需要做修改,才能运行。

Auto.js简介

Auto.js是利用安卓系统的“辅助功能”实现类似于按键精灵一样,可以通过代码模拟一系列界面动作的辅助工作

与“按键精灵”不同的是,它的模拟动作并不是简单的使用在界面定坐标点来实现,而是类似与win一般,找窗口句柄来实现的。

Auto.js使用JavaScript作为脚本语言,目前使用Rhino 1.7.7.2作为脚本引擎,支持ES5与部分ES6特性。

开发文档

Auto.js Pro开发文档优化

文档尚在完善中,可能有文档描述和代码实际行为有出入的情况。

模板、样式、generator来自Node.js。

为什么要使用Auto.js Pro开发脚本,有什么特点?

吸引我使用Auto.js Pro的原因有很多。最主要的几个原因是:

  • Auto.js Pro能开发免ROOT的安卓脚本
  • Auto.js Pro基于节点操作,能开发全分辨率的脚本,自动适配各种安卓机型
  • Auto.js Pro丰富的UI组件,能自定义各种样式的安卓界面
  • Auto.js Pro使用的javascript的语法比较优雅,代码可读性强
  • Auto.js Pro的命令库非常的丰富,接口比较多
  • Auto.js Pro脚本文件体积比较小。1000行的代码,打包后的apk文件只有3-5M,还没有广告

相关教程

Auto.js Pro安卓全分辨率免ROOT引流脚本开发教程

相关阅读

【爬虫工具】哔哩哔哩插件姬(bilibili-plugin)

完整原文(含源码):http://exp-blog.com/2018/09/09/pid-2223/(转载请注明出处,仅供分享学习,严禁用于商业用途) 声明 写这个插件纯粹是

浅析视频网站用户:b站的弹幕和普通视频网站的弹幕有什

随着B站开放注册并降低注册门槛,越来越多其他用户进入,包括喜欢在其他视频网站看视频的用户也开始在B站看视频了。Q1、b站的弹幕和

弹幕电影是痛点需求,还是装X需求?

互联网+电影正成为一个洗牌级的变化。最近,有电影加入了弹幕技术,成为热议焦点。动画电影《秦时明月3D电影龙腾万里》在北京举办的

bilibili投稿上传视频能赚钱吗?哔哩哔哩up主怎么赚钱?b

bilibili投稿上传视频能赚钱吗?哔哩哔哩是一个视频软件,首发君最开始接触这个网站是从追吸血鬼日记开始的,那个时候更新视频不知道去

bilibili哔哩哔哩app怎么怎么举报弹幕?

大家在用手机看哔哩哔哩的时候老是看到一些恶意刷梗,引战和人身攻击等各种弹幕。而这些弹幕以前只能在PC端举报,而这一次哔哩哔哩更

分享到:

栏目导航

推荐阅读

热门阅读