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