Twitter - Auto Refresh List Page

Twitter - Auto Refresh List Page.

  1. // ==UserScript==
  2. // @name Twitter - Auto Refresh List Page
  3. // @description Twitter - Auto Refresh List Page.
  4. // @version 0.1
  5. // @author to
  6. // @namespace https://github.com/to
  7. // @license MIT
  8. //
  9. // @match https://twitter.com/i/lists/*
  10. // @match https://twitter.com/search*
  11. // @icon https://www.google.com/s2/favicons?sz=64&domain=twitter.com
  12. //
  13. // @grant unsafeWindow
  14. // ==/UserScript==
  15.  
  16. const TOP_RANGE = 300;
  17. const REFRESH_INTERVAL = 10 * 1000;
  18.  
  19. var onFrame;
  20. var scrollEvent;
  21.  
  22. addBefore(unsafeWindow, 'requestAnimationFrame', (callback) => {
  23. onFrame = callback;
  24. });
  25.  
  26. window.addEventListener("scroll", (event) => {
  27. scrollEvent = event;
  28. }, false);
  29.  
  30. document.addEventListener("visibilitychange", (event) => {
  31. if(!document.hidden)
  32. refresh();
  33. }, false);
  34.  
  35. setInterval(refresh, REFRESH_INTERVAL);
  36.  
  37. function refresh(){
  38. // ページの途中まで スクロールされている場合 返る
  39. if(window.scrollY > TOP_RANGE)
  40. return;
  41.  
  42. // 下方向に疑似的にスクロールする
  43. // 実際に発生したイベントをコピーしたものを再利用する
  44. // 疑似的な再描画も発生させる
  45. window.scrollTo(window.scrollX, 1000);
  46. document.dispatchEvent(scrollEvent || new Event('scroll'));
  47. onFrame();
  48.  
  49. window.scrollTo(window.scrollX, 0);
  50. }
  51.  
  52. function addBefore(target, name, before) {
  53. var original = target[name];
  54. target[name] = function() {
  55. before.apply(target, arguments);
  56. return original.apply(target, arguments);
  57. }
  58. }