oneKeySign

一些论坛的自动签到脚本,目前支持网站:sstm,2djgame,acfun,lightnovel,gn00,xiami(虾米音乐),tsdm(天使动漫)

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name        oneKeySign
// @namespace   https://greasyfork.org/users/14059
// @icon        http://pic.ffsky.net/images/2015/12/11/884d0d09a577cb062eb51a0c67e5a4ca.jpg
// @author      setycyas
// @homepage    http://blog.sina.com.cn/u/1365265583
// @description 一些论坛的自动签到脚本,目前支持网站:sstm,2djgame,acfun,lightnovel,gn00,xiami(虾米音乐),tsdm(天使动漫)
// @include     https://sstmlt.net/*
// @include     http://www.gn00.com/*
// @include     http://www.acfun.tv/*
// @include     http://www.tsdm.net/*
// @include     http://www.lightnovel.cn/*
// @include     https://bbs4.2djgame.net/*
// @include     http://www.xiami.com/*
// @version     1
// @grant       GM_setValue
// @grant       GM_getValue
// @grant       GM_xmlhttpRequest
// @grant       GM_registerMenuCommand
// @grant       GM_xmlhttpRequest
// @run-at      document-start
// @license     MIT
// ==/UserScript==

//设置每个请求的最大等待时间(毫秒)
var waitTime=60000;
//是否处于自动签到中,若进行自动签到时,所有签到网站并非都已经响应或超时,则running=1
var running=0;
/*所有需要签到的网站的资料
sType代表网站类型,目前只有simple和formhash两种.simple只要直接签到,formhash的比较复杂,要先访问主页获取formhash
webName是网站简称,必须是签到链接signURL中的字符,否则无法知道签到响应是哪个网站的
successText是网站成功签到后返回消息中包含的关键字,如果响应中有对应的字符则认为签到成功
另外留意,formhash类的网站模版中,提示签到结果等消息的div标签是<div class="c">XXX签到成功XXX</div>的形式,
非formhash类的论坛则是<div class="alert_info"><p>恭喜XXX</p></div>*/
var webSite = [
  {
    sType: 'formhash',
    webName:'sstmlt',
    data: 'qdxq=kx',
    signURL: 'https://sstmlt.net/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&inajax=1',
    homeURL: 'https://sstmlt.net',
    successText:'签到成功'
  },
  {
    sType: 'formhash',
    webName:'gn00',
    data: 'qdxq=kx&qdmode=3&todaysay=&fastreply=0',
    signURL: 'http://www.gn00.com/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&inajax=1',
    homeURL: 'http://www.gn00.com',
    successText:'签到成功'
  },
  {
    sType: 'formhash',
    webName:'tsdm',
    data: 'qdxq=kx&qdmode=1&todaysay=天气真好呀开心开心&fastreply=1',
    signURL: 'http://www.tsdm.net/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1',
    homeURL: 'http://www.tsdm.net/plugin.php?id=dsu_paulsign:sign',
    successText:'签到成功'
  },
  {
    sType: 'simple',
    webName:'lightnovel',
    signURL: 'http://www.lightnovel.cn/home.php?mod=task&do=apply&id=98',
    successText:'恭喜'
  },
  {
    sType: 'simple',
    webName:'xiami',
    signURL: 'http://www.xiami.com/task/signin',
    successText:''
  },
  {
    sType: 'simple',
    webName:'2djgame',
    signURL: 'http://bbs4.2djgame.net/home/home.php?mod=task&do=apply&id=1',
    successText:'恭喜'
  },
  {
    sType: 'simple',
    webName:'acfun',
    signURL: 'http://www.acfun.tv/member/checkin.aspx',
    successText:'true'
  }
];
//响应标志.0表示未响应,签到后只有全部标志为1才会显示签到结果列表以及允许再次签到
var resFlag=new Array();
//签到成功标志.0表示不成功
var successFlag=new Array();

//注册油猴菜单
GM_registerMenuCommand('一键签到', SimpleSign);

//一键签到命令
function SimpleSign() {
  //若上次签到没有全部响应,不作新的签到
  if(running>0){
    alert('上次签到还未全部响应,请耐心等待');
    return;
  }
  //读取上次签到日期
  var lastSign = new Date();
  var lastSignStr;
  var vTemp = GM_getValue('lastSign');
  if (vTemp) {
    lastSign.setFullYear(vTemp.match(/(\d+)y/) [1],vTemp.match(/(\d+)m/) [1], vTemp.match(/(\d+)d/) [1]);
  } else {
    lastSign.setFullYear(1970, 0, 1);
  }
  lastSignStr = lastSign.getFullYear() + 'y' + lastSign.getMonth() + 'm' + lastSign.getDate() + 'd';
  //今天的日期
  var today = new Date();
  var todayStr = today.getFullYear() + 'y' + today.getMonth() + 'm' + today.getDate() + 'd';
  if (lastSignStr == todayStr) {
    if (!confirm('今天已经运行过一键签到,一定要再运行吗?')) {
      return;
    }
  }
  //清空响应标志与成功标志
  for(var i=0;i<webSite.length;i++){
   resFlag[i]=0;
   successFlag[i]=0;
  }
  //开始运行
  running=1;
  for (var i = 0; i < webSite.length; i++) {
    if (webSite[i].sType == 'simple') {
      console.log('已发送simple类签到: '+ webSite[i].webName);
      GM_xmlhttpRequest({
        method: 'GET',
        url: webSite[i].signURL,
        headers: {
          'User-Agent': 'Mozilla/5.0',
          'Accept': 'text/xml',
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        timeout:waitTime,
        ontimeout: function(response){
          console.log('接到超时信息: '+response.finalUrl);
          HandleTimeOut(response.finalUrl);
        },
        onload: function (response) {
          console.log('simple类签到接收响应: '+response.finalUrl);
          HandleRes(response.finalUrl,response.responseText);
        }
      });
       //针对没有响应的网站,无法接收响应后再处理,直接当作有响应算了,发送消息后马上处理
      if(webSite[i].successText.length<1){
        resFlag[i]=1;
        successFlag[i]=1;
      }
    }
    if (webSite[i].sType == 'formhash') {
      console.log('已发送获取formhash消息: '+ webSite[i].webName);
      GM_xmlhttpRequest({
        method: 'GET',
        url: webSite[i].homeURL,
        headers: {
          'User-Agent': 'Mozilla/5.0',
          'Accept': 'text/xml',
          'Content-Type': 'application/x-www-form-urlencoded'
        },
        timeout:waitTime,
        ontimeout: function(response){
          console.log('获取formhash消息超时: '+ response.finalUrl);
          HandleTimeOut(response.finalUrl);
        },
        onload: function (response) {
          var w_index=getWebIndexFromURL(response.finalUrl);
          var sp_html = '';
          if (response) {
            sp_html = response.responseText;
          }
          var formhash = sp_html.match(/formhash=([^"]*)"/) [1];
          console.log('获取formhash得到响应: '+ response.finalUrl + '  formhash='+formhash);
          if(formhash.length<1){
            console.log('获取formhash得到失败:' + response.finalUrl);
            resFlag[w_index]=1;
            successFlag[w_index]=0;
            return;
          }
          GM_xmlhttpRequest({
            method: 'POST',
            url: webSite[w_index].signURL,
            data: 'formhash=' + formhash + '&'+webSite[w_index].data,
            headers: {
              'User-Agent': 'Mozilla/5.0',
              'Accept': 'text/xml',           
              'Content-Type': 'application/x-www-form-urlencoded'
            },
            timeout:waitTime,
            ontimeout: function(response){
              console.log('接到超时信息: '+response.finalUrl);
              HandleTimeOut(response.finalUrl);
            },
            onload: function (response) {
              console.log('formhash类签到接收响应: '+response.finalUrl);
              HandleRes(response.finalUrl,response.responseText);
            }
          });          
        }
      });
    }
  }
  alert("已发送签到信息,请耐心等待响应.响应前不要关闭网页");
}

//超时处理
function HandleTimeOut(rURL){
  var w_index=getWebIndexFromURL(rURL);
  if(w_index<0){
    console.log(rURL+'没有对应资料');
    return;
  }
  //找到超时的网站编号,记录响应状态与签到是否成功.没有成功消息的前面已经假定了成功,不修改successFlag
  resFlag[w_index]=1;
  if(webSite[w_index].successText.length>0){
    successFlag[w_index]=-1;
  }
  //看看是否全部网站都响应完毕
  CheckAndHandle();
}

//响应处理
function HandleRes(rURL,rText){
  var w_index=getWebIndexFromURL(rURL);
  if(w_index<0){
    console.log(rURL+'没有对应资料');
    return;
  }
  //找到响应的网站编号,记录响应状态与签到是否成功
  resFlag[w_index]=1;
  if(rText.indexOf(webSite[w_index].successText)>-1){
    successFlag[w_index]=1;
  }
  //看看是否全部网站都响应完毕
  CheckAndHandle();
}

//查看是否响应完毕,完毕则进行余下处理
function CheckAndHandle(){
  //非运行状态,跳过
  if(running<1){
    return;
  }
  for(var i=0;i<webSite.length;i++){
    if(resFlag[i]<1){
      console.log('查看是否全部响应完毕,发现至少'+webSite[i].webName+'尚未响应');
      return;
    }
  }
  //都响应完毕,显示结果, 取消running状态,记录签到日期
  console.log('全部签到响应完毕');
  var lastSign = new Date();
  var lastSignStr = lastSign.getFullYear() + 'y' + lastSign.getMonth() + 'm' + lastSign.getDate() + 'd';
  var showTxt='['+lastSign.getFullYear() + '年' + (lastSign.getMonth() + 1)+'月' + lastSign.getDate() + '日'+'签到结果]\n';
  for(var i=0;i<webSite.length;i++){
    var temp=(successFlag[i]>0)?'签到成功':'签到失败';
    if(successFlag[i]<0){
      temp='超时';
    }
    showTxt+=webSite[i].webName+': '+temp+'\n';
  }
  running=0;
  GM_setValue('lastSign', lastSignStr);
  alert(showTxt);
}

//从网站URL检测签到网站数组中的编号,-1表示检测失败
function getWebIndexFromURL(srcURL){
  var w_index=-1;
  for(var i=0;i<webSite.length;i++){
    if(srcURL.indexOf(webSite[i].webName)>-1){
      w_index=i;
      break;
    }
  }
  return w_index;
}