kfReader.class

kf帖子阅读类

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/397230/777262/kfReaderclass.js

  1. /* kf帖子阅读器,阅读与编辑kf帖子的类.
  2.  
  3. 需要给定url进行初始化.
  4. 公有变量,方法:
  5. this.pid:帖子pid
  6. this.page:页数
  7. this.floors:楼层表,如[0,1,2,3]
  8. this.floorContent:楼层内容,关键的量,收集的信息都在这里,一个{},
  9. key是楼层数,内容有3项:{'author':作者,'text':帖子内容,
  10. 'a':引用帖子的html元素}
  11. this.show():显示收集内容的情况
  12. */
  13. class kfReader{
  14. /* 以阅读的帖子的url进行初始化 */
  15. constructor(url){
  16. this.RECORDS_PER_PAGE = 10; // 每一页的主题数,常量
  17. this.url = url;
  18. // 从url找出帖子的pid与页数
  19. var pidAndPage = this._getPidAndPage(url);
  20. this.pid = pidAndPage['pid'];
  21. this.page = pidAndPage['page'];
  22. // 有效楼层表
  23. this.floors = [];
  24. for(var i = 0;i < this.RECORDS_PER_PAGE;i++){
  25. var floor = i+(this.page-1)*this.RECORDS_PER_PAGE; // 楼层
  26. if (!document.getElementById('floor'+floor)){
  27. break; // 楼层结束
  28. }else{
  29. this.floors.push(floor);
  30. }
  31. }
  32. // 各层的内容,包括作者,文本,引用的a元素,格式为:
  33. // {楼层:{'author'(字符串),'text'(字符串), 'a'(html元素)}}
  34. this.floorContent = {};
  35. for(var i = 0;i < this.floors.length;i++){
  36. var floor = this.floors[i]; // 楼层
  37. this.floorContent[floor] = {}
  38. this.floorContent[floor]['author'] = this._getAuthor(floor);
  39. this.floorContent[floor]['text'] = this._getText(floor);
  40. this.floorContent[floor]['a'] = this._getQuoteA(floor);
  41. }
  42. }
  43. /* 在控制台显示阅读结果 */
  44. show(){
  45. var log = console.log;
  46. log('kfReader本页面阅读结果显示:');
  47. log('pid =', this.pid);
  48. log('page =', this.page);
  49. log('楼层信息:');
  50. for(var i = 0;i < this.floors.length;i++){
  51. var floor = this.floors[i];
  52. log('--- 第'+floor+'楼信息: ---');
  53. log('作者:', this.floorContent[floor]['author']);
  54. log('内容前20字:', this.floorContent[floor]['text'].substr(0,20));
  55. if (this.floorContent[floor]['a']){
  56. log('是否找到了引用的a标签:', '是');
  57. }else{
  58. log('是否找到了引用的a标签:', '否');
  59. }
  60. }
  61. }
  62. /* 获取当前url的pid(帖子唯一标识号码)与页数. */
  63. _getPidAndPage(url){
  64. // 指定返回对象,设定默认值
  65. var result = {'pid':null, 'page':1};
  66. // 匹配pid
  67. var pidReg = /\?tid\=(\d+)/;
  68. var matchPid = url.match(pidReg);
  69. if (matchPid){
  70. result['pid'] = matchPid[1];
  71. }
  72. // 匹配page
  73. var pageReg = /&page\=(\d+)/;
  74. var matchPage = url.match(pageReg);
  75. if (matchPage){
  76. result['page'] = parseInt(matchPage[1]);
  77. }
  78. // 返回
  79. return result;
  80. }
  81. /* 获取第floor层的作者,查找失败返回null */
  82. _getAuthor(floor){
  83. var n = floor%10;
  84. var authorsA = document.getElementsByClassName('readidmsbottom_n');
  85. if (authorsA.length <= n){return null;}
  86. return authorsA[n].innerText;
  87. }
  88. /* 获取第floor层的文本,查找失败返回null */
  89. _getText(floor){
  90. // 首先获取楼层标识div,同时测试该楼层是否存在
  91. var floorFlagDiv = document.getElementById('floor'+floor);
  92. if (!floorFlagDiv){
  93. console.log('找不到楼层'+floor);
  94. return null;
  95. }
  96. // 获取文本相关的div,并处理其中文本
  97. var textDiv = floorFlagDiv.parentElement;
  98. var textSplit = (textDiv.innerText+" ").split('TOP\n看TA\n回复\n菜单')[1].split('关键词');
  99. textSplit[0] = textSplit[0].replace(/^\n/, '');
  100. var text = '';
  101. if (textSplit.length == 1){
  102. text = textSplit[0];
  103. }else{
  104. for(var i = 0;i < textSplit.length-1;i++){
  105. if (i > 0){text = text+'关键词';}
  106. text = text + textSplit[i];
  107. }
  108. }
  109. return text;
  110. }
  111. /* 查找第floor楼的引用帖子a标签,查找失败返回null */
  112. _getQuoteA(floor){
  113. //第floor层
  114. var div = document.getElementById('floor'+floor);
  115. if (!div){return null;}
  116. //查找所有的a,直到内部文本为包含'引用'
  117. var a = div.getElementsByTagName('a');
  118. for(var i = 0;i < a.length;i++){
  119. if(a[i].innerText.indexOf('引用') > -1){
  120. return a[i];
  121. }
  122. }
  123. return null;
  124. }
  125. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址