Greasy Fork is available in English.

oneKeySign

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

// ==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;
}