oneKeySign

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

  1. // ==UserScript==
  2. // @name oneKeySign
  3. // @namespace https://greasyfork.org/users/14059
  4. // @icon http://pic.ffsky.net/images/2015/12/11/884d0d09a577cb062eb51a0c67e5a4ca.jpg
  5. // @author setycyas
  6. // @homepage http://blog.sina.com.cn/u/1365265583
  7. // @description 一些论坛的自动签到脚本,目前支持网站:sstm,2djgame,acfun,lightnovel,gn00,xiami(虾米音乐),tsdm(天使动漫)
  8. // @include https://sstmlt.net/*
  9. // @include http://www.gn00.com/*
  10. // @include http://www.acfun.tv/*
  11. // @include http://www.tsdm.net/*
  12. // @include http://www.lightnovel.cn/*
  13. // @include https://bbs4.2djgame.net/*
  14. // @include http://www.xiami.com/*
  15. // @version 1
  16. // @grant GM_setValue
  17. // @grant GM_getValue
  18. // @grant GM_xmlhttpRequest
  19. // @grant GM_registerMenuCommand
  20. // @grant GM_xmlhttpRequest
  21. // @run-at document-start
  22. // @license MIT
  23. // ==/UserScript==
  24.  
  25. //设置每个请求的最大等待时间(毫秒)
  26. var waitTime=60000;
  27. //是否处于自动签到中,若进行自动签到时,所有签到网站并非都已经响应或超时,则running=1
  28. var running=0;
  29. /*所有需要签到的网站的资料
  30. sType代表网站类型,目前只有simple和formhash两种.simple只要直接签到,formhash的比较复杂,要先访问主页获取formhash
  31. webName是网站简称,必须是签到链接signURL中的字符,否则无法知道签到响应是哪个网站的
  32. successText是网站成功签到后返回消息中包含的关键字,如果响应中有对应的字符则认为签到成功
  33. 另外留意,formhash类的网站模版中,提示签到结果等消息的div标签是<div class="c">XXX签到成功XXX</div>的形式,
  34. 非formhash类的论坛则是<div class="alert_info"><p>恭喜XXX</p></div>*/
  35. var webSite = [
  36. {
  37. sType: 'formhash',
  38. webName:'sstmlt',
  39. data: 'qdxq=kx',
  40. signURL: 'https://sstmlt.net/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&inajax=1',
  41. homeURL: 'https://sstmlt.net',
  42. successText:'签到成功'
  43. },
  44. {
  45. sType: 'formhash',
  46. webName:'gn00',
  47. data: 'qdxq=kx&qdmode=3&todaysay=&fastreply=0',
  48. signURL: 'http://www.gn00.com/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&sign_as=1&inajax=1',
  49. homeURL: 'http://www.gn00.com',
  50. successText:'签到成功'
  51. },
  52. {
  53. sType: 'formhash',
  54. webName:'tsdm',
  55. data: 'qdxq=kx&qdmode=1&todaysay=天气真好呀开心开心&fastreply=1',
  56. signURL: 'http://www.tsdm.net/plugin.php?id=dsu_paulsign:sign&operation=qiandao&infloat=1&inajax=1',
  57. homeURL: 'http://www.tsdm.net/plugin.php?id=dsu_paulsign:sign',
  58. successText:'签到成功'
  59. },
  60. {
  61. sType: 'simple',
  62. webName:'lightnovel',
  63. signURL: 'http://www.lightnovel.cn/home.php?mod=task&do=apply&id=98',
  64. successText:'恭喜'
  65. },
  66. {
  67. sType: 'simple',
  68. webName:'xiami',
  69. signURL: 'http://www.xiami.com/task/signin',
  70. successText:''
  71. },
  72. {
  73. sType: 'simple',
  74. webName:'2djgame',
  75. signURL: 'http://bbs4.2djgame.net/home/home.php?mod=task&do=apply&id=1',
  76. successText:'恭喜'
  77. },
  78. {
  79. sType: 'simple',
  80. webName:'acfun',
  81. signURL: 'http://www.acfun.tv/member/checkin.aspx',
  82. successText:'true'
  83. }
  84. ];
  85. //响应标志.0表示未响应,签到后只有全部标志为1才会显示签到结果列表以及允许再次签到
  86. var resFlag=new Array();
  87. //签到成功标志.0表示不成功
  88. var successFlag=new Array();
  89.  
  90. //注册油猴菜单
  91. GM_registerMenuCommand('一键签到', SimpleSign);
  92.  
  93. //一键签到命令
  94. function SimpleSign() {
  95. //若上次签到没有全部响应,不作新的签到
  96. if(running>0){
  97. alert('上次签到还未全部响应,请耐心等待');
  98. return;
  99. }
  100. //读取上次签到日期
  101. var lastSign = new Date();
  102. var lastSignStr;
  103. var vTemp = GM_getValue('lastSign');
  104. if (vTemp) {
  105. lastSign.setFullYear(vTemp.match(/(\d+)y/) [1],vTemp.match(/(\d+)m/) [1], vTemp.match(/(\d+)d/) [1]);
  106. } else {
  107. lastSign.setFullYear(1970, 0, 1);
  108. }
  109. lastSignStr = lastSign.getFullYear() + 'y' + lastSign.getMonth() + 'm' + lastSign.getDate() + 'd';
  110. //今天的日期
  111. var today = new Date();
  112. var todayStr = today.getFullYear() + 'y' + today.getMonth() + 'm' + today.getDate() + 'd';
  113. if (lastSignStr == todayStr) {
  114. if (!confirm('今天已经运行过一键签到,一定要再运行吗?')) {
  115. return;
  116. }
  117. }
  118. //清空响应标志与成功标志
  119. for(var i=0;i<webSite.length;i++){
  120. resFlag[i]=0;
  121. successFlag[i]=0;
  122. }
  123. //开始运行
  124. running=1;
  125. for (var i = 0; i < webSite.length; i++) {
  126. if (webSite[i].sType == 'simple') {
  127. console.log('已发送simple类签到: '+ webSite[i].webName);
  128. GM_xmlhttpRequest({
  129. method: 'GET',
  130. url: webSite[i].signURL,
  131. headers: {
  132. 'User-Agent': 'Mozilla/5.0',
  133. 'Accept': 'text/xml',
  134. 'Content-Type': 'application/x-www-form-urlencoded'
  135. },
  136. timeout:waitTime,
  137. ontimeout: function(response){
  138. console.log('接到超时信息: '+response.finalUrl);
  139. HandleTimeOut(response.finalUrl);
  140. },
  141. onload: function (response) {
  142. console.log('simple类签到接收响应: '+response.finalUrl);
  143. HandleRes(response.finalUrl,response.responseText);
  144. }
  145. });
  146. //针对没有响应的网站,无法接收响应后再处理,直接当作有响应算了,发送消息后马上处理
  147. if(webSite[i].successText.length<1){
  148. resFlag[i]=1;
  149. successFlag[i]=1;
  150. }
  151. }
  152. if (webSite[i].sType == 'formhash') {
  153. console.log('已发送获取formhash消息: '+ webSite[i].webName);
  154. GM_xmlhttpRequest({
  155. method: 'GET',
  156. url: webSite[i].homeURL,
  157. headers: {
  158. 'User-Agent': 'Mozilla/5.0',
  159. 'Accept': 'text/xml',
  160. 'Content-Type': 'application/x-www-form-urlencoded'
  161. },
  162. timeout:waitTime,
  163. ontimeout: function(response){
  164. console.log('获取formhash消息超时: '+ response.finalUrl);
  165. HandleTimeOut(response.finalUrl);
  166. },
  167. onload: function (response) {
  168. var w_index=getWebIndexFromURL(response.finalUrl);
  169. var sp_html = '';
  170. if (response) {
  171. sp_html = response.responseText;
  172. }
  173. var formhash = sp_html.match(/formhash=([^"]*)"/) [1];
  174. console.log('获取formhash得到响应: '+ response.finalUrl + ' formhash='+formhash);
  175. if(formhash.length<1){
  176. console.log('获取formhash得到失败:' + response.finalUrl);
  177. resFlag[w_index]=1;
  178. successFlag[w_index]=0;
  179. return;
  180. }
  181. GM_xmlhttpRequest({
  182. method: 'POST',
  183. url: webSite[w_index].signURL,
  184. data: 'formhash=' + formhash + '&'+webSite[w_index].data,
  185. headers: {
  186. 'User-Agent': 'Mozilla/5.0',
  187. 'Accept': 'text/xml',
  188. 'Content-Type': 'application/x-www-form-urlencoded'
  189. },
  190. timeout:waitTime,
  191. ontimeout: function(response){
  192. console.log('接到超时信息: '+response.finalUrl);
  193. HandleTimeOut(response.finalUrl);
  194. },
  195. onload: function (response) {
  196. console.log('formhash类签到接收响应: '+response.finalUrl);
  197. HandleRes(response.finalUrl,response.responseText);
  198. }
  199. });
  200. }
  201. });
  202. }
  203. }
  204. alert("已发送签到信息,请耐心等待响应.响应前不要关闭网页");
  205. }
  206.  
  207. //超时处理
  208. function HandleTimeOut(rURL){
  209. var w_index=getWebIndexFromURL(rURL);
  210. if(w_index<0){
  211. console.log(rURL+'没有对应资料');
  212. return;
  213. }
  214. //找到超时的网站编号,记录响应状态与签到是否成功.没有成功消息的前面已经假定了成功,不修改successFlag
  215. resFlag[w_index]=1;
  216. if(webSite[w_index].successText.length>0){
  217. successFlag[w_index]=-1;
  218. }
  219. //看看是否全部网站都响应完毕
  220. CheckAndHandle();
  221. }
  222.  
  223. //响应处理
  224. function HandleRes(rURL,rText){
  225. var w_index=getWebIndexFromURL(rURL);
  226. if(w_index<0){
  227. console.log(rURL+'没有对应资料');
  228. return;
  229. }
  230. //找到响应的网站编号,记录响应状态与签到是否成功
  231. resFlag[w_index]=1;
  232. if(rText.indexOf(webSite[w_index].successText)>-1){
  233. successFlag[w_index]=1;
  234. }
  235. //看看是否全部网站都响应完毕
  236. CheckAndHandle();
  237. }
  238.  
  239. //查看是否响应完毕,完毕则进行余下处理
  240. function CheckAndHandle(){
  241. //非运行状态,跳过
  242. if(running<1){
  243. return;
  244. }
  245. for(var i=0;i<webSite.length;i++){
  246. if(resFlag[i]<1){
  247. console.log('查看是否全部响应完毕,发现至少'+webSite[i].webName+'尚未响应');
  248. return;
  249. }
  250. }
  251. //都响应完毕,显示结果, 取消running状态,记录签到日期
  252. console.log('全部签到响应完毕');
  253. var lastSign = new Date();
  254. var lastSignStr = lastSign.getFullYear() + 'y' + lastSign.getMonth() + 'm' + lastSign.getDate() + 'd';
  255. var showTxt='['+lastSign.getFullYear() + '年' + (lastSign.getMonth() + 1)+'月' + lastSign.getDate() + '日'+'签到结果]\n';
  256. for(var i=0;i<webSite.length;i++){
  257. var temp=(successFlag[i]>0)?'签到成功':'签到失败';
  258. if(successFlag[i]<0){
  259. temp='超时';
  260. }
  261. showTxt+=webSite[i].webName+': '+temp+'\n';
  262. }
  263. running=0;
  264. GM_setValue('lastSign', lastSignStr);
  265. alert(showTxt);
  266. }
  267.  
  268. //从网站URL检测签到网站数组中的编号,-1表示检测失败
  269. function getWebIndexFromURL(srcURL){
  270. var w_index=-1;
  271. for(var i=0;i<webSite.length;i++){
  272. if(srcURL.indexOf(webSite[i].webName)>-1){
  273. w_index=i;
  274. break;
  275. }
  276. }
  277. return w_index;
  278. }