nhentai_endless

nhentai automate next page

As of 2020-02-13. See the latest version.

  1. // ==UserScript==
  2. // @name nhentai_endless
  3. // @namespace nhentai_endless
  4. // @supportURL https://github.com/zhuzemin
  5. // @description nhentai automate next page
  6. // @include https://nhentai.net/*
  7. // @include https://en.nyahentai3.com/*
  8. // @include https://zh.nyahentai.co/*
  9. // @include https://ja.nyahentai.net/*
  10. // @include https://zh.nyahentai.pro/*
  11. // @include https://nhentai.net/
  12. // @include https://en.nyahentai3.com/
  13. // @include https://zh.nyahentai.co/
  14. // @include https://ja.nyahentai.net/
  15. // @include https://zh.nyahentai.pro/
  16. // @version 1.12
  17. // @grant GM_xmlhttpRequest
  18. // @grant GM_registerMenuCommand
  19. // @grant GM_setValue
  20. // @grant GM_getValue
  21. // @run-at document-start
  22. // @author zhuzemin
  23. // @license Mozilla Public License 2.0; http://www.mozilla.org/MPL/2.0/
  24. // @license CC Attribution-ShareAlike 4.0 International; http://creativecommons.org/licenses/by-sa/4.0/
  25. // ==/UserScript==
  26. var config = {
  27. 'debug': false
  28. }
  29. var debug = config.debug ? console.log.bind(console) : function () {
  30. };
  31.  
  32. var old_scrollY = 0;
  33. var request_pct = 0.05; // percentage of window height left on document to request next page, value must be between 0-1
  34.  
  35. var scroll_events = 0;
  36. var event_type = "scroll"; // or "wheel"
  37.  
  38. function onScroll(e) {
  39. var y = window.scrollY;
  40. // if (scroll_events === 0) old_scrollY = y; // stops only if scroll position was on 2. page
  41. var delta = e.deltaY || y - old_scrollY; // NOTE: e.deltaY for "wheel" event
  42. if (delta > 0 && (window.innerHeight + y) >= (document.body.clientHeight - (window.innerHeight * request_pct))) {
  43. debug("scroll end");
  44. window.removeEventListener(event_type, onScroll, false);
  45.  
  46. try {
  47. requestNextPage();
  48. } catch (err) {
  49. debug(err.name + ": " + err.message);
  50. // NOTE: recovery unnecessary, input event handles it with reset on new search
  51. }
  52. }
  53. old_scrollY = y;
  54. scroll_events += 1;
  55. }
  56.  
  57.  
  58. class Content{
  59. constructor(href) {
  60. this.method = 'GET';
  61. this.url = href;
  62. this.headers = {
  63. 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
  64. 'Accept': 'application/atom+xml,application/xml,text/xml',
  65. 'Referer': window.location.href,
  66. };
  67. this.charset = 'text/plain;charset=utf8';
  68. }
  69. }
  70.  
  71.  
  72. function requestNextPage() {
  73. var nexts=document.querySelectorAll("span.next");
  74. var next=nexts[nexts.length-1];
  75. var a=next.querySelector("a");
  76. debug("href: "+a.href);
  77. var content=new Content(a.href);
  78. var parentNode=document.querySelector('#content');
  79. request(content,parentNode);
  80. }
  81.  
  82. var init = function () {
  83. setInterval(function(){
  84. window.addEventListener(event_type, onScroll, false);
  85. window.addEventListener("beforeunload", function () {
  86. window.scrollTo(0, 0);
  87. }, false);
  88. }, 3000);
  89. }
  90.  
  91.  
  92. function request(object,parentNode) {
  93. var retries = 10;
  94. GM_xmlhttpRequest({
  95. method: object.method,
  96. url: object.url,
  97. headers: object.headers,
  98. overrideMimeType: object.charset,
  99. //synchronous: true
  100. onload: function (responseDetails) {
  101. if (responseDetails.status != 200) {
  102. // retry
  103. if (retries--) { // *** Recurse if we still have retries
  104. setTimeout(request(),2000);
  105. return;
  106. }
  107. }
  108. debug(responseDetails);
  109. var html = new DOMParser().parseFromString(responseDetails.responseText, "text/html");
  110. //debug(galleryHtml);
  111. //Dowork
  112. var content = html.querySelector('#content');
  113. parentNode.insertBefore(content,null);
  114. }
  115. });
  116. }
  117.  
  118.  
  119. window.addEventListener('DOMContentLoaded', init);