Greasy Fork

Greasy Fork is available in English.

使 colab 保持活跃

让 colab 保存活跃

当前为 2024-01-13 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         colab 保持活跃自动重连 / make colab keep alive
// @name:zh      colab 保持活跃自动重连
// @name:en      colab keep alive
// @name:zh-CN   使 colab 保持活跃
// @name:ja      colab アクティブに保存
// @namespace    https://colab.research.google.com
// @version      1.0
// @description:zh  让colab保持活跃,自动检查是否掉线,掉线后自动重连,去掉谷歌人机校验
// @description:en  make colab keep alive
// @description:zh-CN   让 colab 保存活跃
// @description:ja   Google colab アクティブに保存
// @author       木木(mumu)
// @match        *://colab.research.google.com/*
// @grant        none
// @license       MIT
// @description make colab keep alive
// ==/UserScript==
var nameSpace = 'mumu-'

// 是否开启保持活跃功能,默认开启
var isActive = true;
var timeout = 1000 * 60 * 5  // 默认5分钟检查一次连接状态
var timer = null

// 向页面添加功能按钮,默认开启保持活跃功能
function setButton () {
  // 创建 button 元素
  var button = document.createElement('button');
  button.id = nameSpace + 'floating-button';
  button.innerText = '保持活跃';
  button.className = nameSpace + 'active'

  // 创建 style 标签,设置样式
  var style = document.createElement('style');
  style.innerHTML = `
    #${nameSpace}floating-button {
      position: fixed;
      bottom: 20px;
      right: 20px;
      width: 75px;
      height: 35px;
      background-color: #e07171;
      color: #fff;
      border-radius: 8px;
      text-align: center;
      line-height: 20px;
      cursor: pointer;
      border: none;
      z-index: 999;
    }

    #${nameSpace}floating-button.${nameSpace}active {
      background-color: #007bff;
    }
  `;

  document.body.appendChild(button);
  document.head.appendChild(style);
  console.log("添加完成")

  button.addEventListener('mousedown', function(event) {
    var offsetX = event.clientX - button.offsetLeft;
    var offsetY = event.clientY - button.offsetTop;

    function moveButton(event) {
        button.style.left = (event.clientX - offsetX) + 'px';
        button.style.top = (event.clientY - offsetY) + 'px';
    }

    document.addEventListener('mousemove', moveButton);

    button.addEventListener('mouseup', function() {
        document.removeEventListener('mousemove', moveButton);
    });
  });

  button.addEventListener('click', function() {
    isActive = !isActive;
    if (isActive) {
        button.classList.add(nameSpace+'active');
    } else {
        button.classList.remove(nameSpace+'active');
    }
    checkRunningTimerHandle()
  });

  checkRunningTimerHandle()
}

// 去掉谷歌验证
function removeGoogleRecaptcha () {
  document.querySelectorAll('script[src*="recaptcha"]').forEach(el=> {
    el.remove()
  })
  var el = document.querySelector('.grecaptcha-badge')
  if(el) {
    el.remove()
  }
  console.log('去掉谷歌验证')
}

// 检查是否运行中
function checkRunning () {
  var els = document.querySelectorAll('.running')
  if(els.length > 0) {
    return true
  } else {
    console.log('连接已中断')
    return false
  }
}

// 定时运行检查处理函数
function checkRunningTimerHandle () {
  console.log(isActive,timer)
  if(isActive && !timer) {
    timer = setInterval(() => {
      if(!checkRunning()) {
        setActive()
      }
    },timeout)
    setActive()
  } else {
    timer && clearInterval(timer)
  }
}

// 设置事件
function setHandle () {
  document.querySelector('.'+nameSpace+'dialog-close').addEventListener('click',function() {
    document.querySelector('#'+nameSpace+'dialog').style.display = 'none'
  })

  document.querySelector('#'+nameSpace+'add-input').onkeydown=function(ev){
    if(ev.keyCode==13){
      var val = ev.target.value
      addKeyword(val)
      ev.target.value = ''
    }
  }

  document.querySelector('#'+nameSpace+'add-btn').addEventListener('click',function() {
    var textel = document.querySelector('#'+nameSpace+'add-input')
    var val = textel.value
    textel.value = ''
    addKeyword(val)
  })

  var list = document.querySelectorAll('.'+nameSpace+'keyword-del')
  for(let i=0;i<list.length;i++) {
    var el = list[i]
    el.addEventListener('click',function(e) {
      delKeyword(e)
    })
  }
}


// 重新连接
function setActive() {
  // 如果有提示弹窗就关闭
  if(document.querySelector('mwc-button')) {
    document.querySelector('mwc-button').click()
  }
  document.querySelectorAll('colab-run-button').forEach((el) => {
    el.click()
  })
}

window.addEventListener('load', () => {
  if(isActive) {
    setButton()
    // 1分钟后去掉谷歌验证
    setTimeout(() => {
      removeGoogleRecaptcha()
    },1000 * 10)
  }
})