// ==UserScript==
// @name 贴吧自动签到&一键签到&慢速自动签到
// @version 0.6
// @description ’一键签到‘支持的贴吧数量有限,除非开会员,因为是直接用贴吧电脑端的api,和电脑端贴吧主页那里点击一键签到一个效果(每日北京时间0:00至1:00无法使用)。慢速自动签到目前还没什么用。
// @author shitianshiwa
// @include http*://tieba.baidu.com/p/*
// @include http*://tieba.baidu.com/f?*
// @include http*://tieba.baidu.com/f/good?kw=*
// @grant GM_registerMenuCommand
// @run-at document-idle
// @license MIT
// @namespace https://greasyfork.org/users/466700
// ==/UserScript==
//慢速自动签到目前还没什么用
(function() {
var $ = unsafeWindow.jQuery; // @grant 不能为none,否则不能用
var PageData = unsafeWindow.PageData;
'use strict';
const IE = "utf-8";
const css1 = `
/*固定到网页右边*/
.miaoqiandaocss1
{
width:140px;
height:120px;
position: fixed;
left:30px;
bottom:420px;
z-index: 1005;
color:#f00;
font-size:10px;
font-weight:bold;
}
`;
const style = document.createElement('style'); //创建新样式节点
style.textContent = css1; //添加样式内容
document.head.appendChild(style); //给head头添加新样式节点
var t;
//捕捉class用.,id对象用#?,$=document.getElementById?
//alert("233");
//自动签到
//localStorage.removeItem("miaoerror");//报错后使用,使用完要再注释掉,用来防止频繁发生命令的标识,清空浏览器数据也可以
var t1;
var errorx = "";
function resetx() {
try {
localStorage.removeItem("miaoerror");
alert("已经恢复自动签到");
} catch (error) {
alert(error);
}
}
try {
errorx = localStorage.getItem("miaoerror");
//alert(errorx);
if ($("a.j_signbtn")[0] == null || $('#j_head_focus_btn')[0] == null) {
return;
}
if ($("a.j_signbtn")[0].title == "签到" && $('#j_head_focus_btn')[0].className == "focus_btn cancel_focus" && $('span.userlike_prisoned')[0] == undefined) //未签到和已经关注该吧及未被封禁才能条件通过
{
t = setTimeout(qiandao, 1000); //延迟1s签到
//qiandao();
//alert($(".j_signbtn")[0].title);
} else {
//alert("233");
}
} catch (error) {
alert(error);
}
function qiandao() //自动签到对超级会员,会员,年费会员似乎一次不能成功,超会签到class="sign_box_member_bright,又可以一次签到成功了?"除了网络问题导致的签到失败外,就只有签到后外观不是会员样式的问题了。
{
clearTimeout(t);
var url = "/sign/add";
try {
if ($("a.j_signbtn")[0] == null) {
return;
}
var TBS = PageData.tbs || PageData.user.tbs;
var KW = PageData.forum.name || PageData.forum.forum_name;
var c = { 'tbs': TBS, 'kw': KW, 'ie': "utf-8" }; //加个''2019-8-24,个别情况下只有PageData.forum.forum_name可以得到贴吧名
if ($("a.j_signbtn")[0].className == "j_signbtn sign_btn_bright j_cansign" && errorx == null && TBS != null && KW != null) //第二次判断是否未签到。。!及未被记录过出错误
{
$.post(url, c, function(o) {
if (o.no != 0) {
let s = "no:" + o.no + ",nerr_code:" + o.err_code + ",nerror:" + o.error;
alert(s + ",出现错误请关闭插件!频繁发送命令可能很危险,贴吧正常情况下不会有连续签到的命令出现"); //频繁发送命令可能很危险,贴吧正常情况下不会有连续签到的命令出现
localStorage.setItem("miaoerror", s);
} else {
//alert(PageData.forum.name+"吧签到成功,"+o.data.sign_version);
$("#signstar_wrapper")[0].className = "j_sign_box sign_box_bright sign_box_bright_signed"; //改签到为已签到 j_sign_box sign_box_bright sign_box_member_bright sign_box_member_bright_signed sign_box_bright_signed
$("a.j_signbtn")[0].setAttribute('id', 'j_signbtn'); //添加节点需要id,所以先捕捉class,再添加id
$("a.j_signbtn")[0].title = "签到完成"
$("a.j_signbtn")[0].classList.add("signstar_signed"); //signstar_signed来自 https://github.com/shitianshiwa/baidu-tieba-userscript/tree/master/%E8%B4%B4%E5%90%A7%E5%85%A8%E8%83%BD%E5%8A%A9%E6%89%8B 贴吧全能脚本的已签到样式。需要有安装这个脚本才会有效果
let a1 = document.getElementById("j_signbtn"); //捕捉id
let a2 = document.createElement("span"); //创建节点<span></span>
let day1 = o.data.uinfo.cont_sign_num; //获取连续签到天数
a2.setAttribute('class', 'sign_keep_span'); //为span添加属性<span class="sign_keep_span"></span>
a2.innerHTML = "连续" + day1 + "天"; //已连续签到天数 <span class="sign_keep_span">连续天数</span>
//alert(o.data.uinfo.cont_sign_num);
a1.appendChild(a2); //添加节点显示天数
let c3 = { 'kw': PageData.forum.name, 'ie': "utf-8" };
$.post("/sign/loadmonth", c3, function(o) {
if (o.no != 0) {
let s = "no:" + o.no + ",nerr_code:" + o.err_code + ",nerror:" + o.error;
alert(s + ",出现错误请关闭插件!频繁发送命令可能很危险"); //频繁发送命令可能很危险
localStorage.setItem("miaoerror", s);
} else {
$("span.j_sign_month_lack_days")[0].innerHTML = o.data.resign_info.mon_miss_sign_num; //修改漏签天数标签
//alert(o.data.resign_info.mon_miss_sign_num);
}
}, "json");
//window.location.reload();//刷新网页显示已签到,为了节省流量注释掉了
}
}, "json");
} else {
alert("得到的参数不完整或未恢复自动签到,tbs=" + TBS + ",kw=" + KW);
}
} catch (error) {
alert(error);
}
}
function HH() //一键签到,一键签到有时间段限制,每日0:00至1:00无法使用
{
try {
if (localStorage.getItem("miaoerror") != null) {
alert("已经启动慢速自动签到或者出现其它错误了!点‘报错后重启’");
return;
}
let s = "/tbmall/onekeySignin1";
let c = { 'tbs': PageData.tbs || PageData.user.tbs, 'ie': IE };
postpost(s, c);
} catch (error) {
alert(error);
}
}
var tt1, tt2, failtemp = "";
function HH2() //慢速自动签到(目前电脑端贴吧有单位时间内签到贴吧数量上限限制)
{
try {
if (localStorage.getItem("miaoerror") != null) {
alert("已经启动慢速自动签到或者出错了!点‘报错后重启’");
return;
}
//$("div.miaoqiandaocss1").remove();
localStorage.setItem("miaoerror", "suo");
alert("开始自动签到贴吧!刷新可中断");
var c = { 'tn': "bdFBW", 'tab': "favorite" };
var u = "/mo/q-----1-1-0----/m";
$.get(u, c, function(data) {
sessionStorage.setItem("HH2temp", $(data.body)[0].innerText.split("."));
}, "xml");
var temp2 = new Array(),
ii = 0,
time = 0;
function xianshi() {
clearTimeout(tt1);
var temp = sessionStorage.getItem("HH2temp").split(",");
for (var i = 1; i < temp.length; i++) {
temp2[ii] = temp[i].split("等级")[0];
//console.log(temp[i].split("等级")[0]);
ii++;
}
$.post("/dc/common/tbs", "", function(o) { sessionStorage.setItem("miaousertbs", o.tbs); }, "json"); //获取用户tbs口令号并储存在sessionStorage中,待使用
$("body").append('<div class="miaoqiandaocss1"><span id="miaoqiandaocount1">签到中(刷新可中断)</span></div>');
time = 2000 + parseInt(Math.random() * 1000); //至少延迟1s以上,否则会被贴吧系统要求输入验证码,停止很长一段时间后大概能解除限制
tt2 = setTimeout(xianshi2, time);
//alert(temp2);
}
tt1 = setTimeout(xianshi, 1000);
var url = "/sign/add";
function xianshi2() {
clearTimeout(tt2);
if (localStorage.getItem("miaoerror") == null) {
$("div.miaoqiandaocss1").remove();
failtemp = "";
alert("意外结束自动签到贴吧!");
return;
}
$("#miaoqiandaocount1").html("签到中(刷新可中断)<br/>剩余贴吧数:" + (ii) + "<br/>签到失败的贴吧:<br/>" + failtemp);
if (ii > 0) {
//console.log(ii);
ii--;
} else {
failtemp = "";
localStorage.removeItem("miaoerror");
alert("结束自动签到贴吧!");
return;
}
//console.log(temp2[ii]);
var c = { 'tbs': sessionStorage.getItem("miaousertbs"), 'kw': temp2[ii], 'ie': "utf-8" };
$.post(url, c, function(o) {
if (o.no == 0) //签到成功
{
console.log(temp2[ii] + ",OK," + time + "s");
//return;
} else if (o.no == 1010) //贴吧目录出问题啦,请到贴吧签到吧反馈
{
console.log(temp2[ii] + ",贴吧目录出问题啦,请到贴吧签到吧反馈," + time + "s");
failtemp += temp2[ii] + "<br/>";
} else if (o.no == 1101) //亲,你之前已经签过了
{
console.log(temp2[ii] + ",亲,你之前已经签过了," + time + "s");
} else {
console.log(temp2[ii] + ",no:" + o.no + "nerr_code:" + o.err_code + "nerror:" + o.error + "," + time + "s");
failtemp += temp2[ii] + "<br/>";
}
}, "json");
$.get("/dc/common/tbs", "", function(o) { sessionStorage.setItem("miaousertbs", o.tbs); }, "json"); //获取用户tbs口令号并储存在sessionStorage中,待使用
time = 2000 + parseInt(Math.random() * 1000);
tt2 = setTimeout(xianshi2, time);
}
} catch (error) {
alert(error);
}
}
function postpost(a, b) {
$.post(a, b, function(o) {
if (o.no != 0) {
alert("no:" + o.no + "nerr_code:" + o.err_code + "nerror:" + o.error);
} else {
alert("OK");
}
}, "json");
}
GM_registerMenuCommand("一键签到", HH);
//GM_registerMenuCommand("慢速自动签到(获取贴吧名,逐个自动签到)", HH2);//不可用。因为单位时间内有签到数量限制,超过一定数量后需要输入验证码
GM_registerMenuCommand("报错后重启", resetx); // @grant GM_registerMenuCommand
//http://tieba.baidu.com/mo/q-----1-1-0----/sign?tbs=xxxxx&fid=xxxxxx&kw=xxxxx wap贴吧签到可能能绕开系统验证码处罚
//注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。
//下面未使用
//JavaScript 时间戳转日期
//作者: 王And木 时间: 2018-08-08 分类: Web 阅读:1216次
function timestampToTime(timestamp) {
var time_var = timestamp;
if (String(time_var).length === 10) {
time_var = time_var * 1000;
}
var date = new Date(Number(time_var));
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':';
var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ' ';
var v_time = Y + M + D + h + m;
var date_n = new Date();
Y = date_n.getFullYear() + '-';
M = (date_n.getMonth() + 1 < 10 ? '0' + (date_n.getMonth() + 1) : date_n.getMonth() + 1) + '-';
D = (date_n.getDate() < 10 ? '0' + (date_n.getDate()) : date_n.getDate()) + ' ';
return D; //返回日数
}
//JavaScript 时间戳转换时间的代码,如果是当前日期,只会返回小时与分钟。
//本站如无特别说明即为原创,转而告知:(http://www.iwonmo.com/archives/1355.html)
})();
/*
https://www.cnblogs.com/polk6/p/5512979.html
sessionStorage 是HTML5新增的一个会话存储对象
1) 同源策略限制。若想在不同页面之间对同一个sessionStorage进行操作,这些页面必须在同一协议、同一主机名和同一端口下。(IE 8和9存储数据仅基于同一主机名,忽略协议(HTTP和HTTPS)和端口号的要求)
2) 单标签页限制。sessionStorage操作限制在单个标签页中,在此标签页进行同源页面访问都可以共享sessionStorage数据。
3) 只在本地存储。seesionStorage的数据不会跟随HTTP请求一起发送到服务器,只会在本地生效,并在关闭标签页后清除数据。(若使用Chrome的恢复标签页功能,seesionStorage的数据也会恢复)。
4) 存储方式。seesionStorage的存储方式采用key、value的方式。value的值必须为字符串类型(传入非字符串,也会在存储时转换为字符串。true值会转换为"true")。
5) 存储上限限制:不同的浏览器存储的上限也不一样,但大多数浏览器把上限限制在5MB以下。
可访问 http://dev-test.nemikor.com/web-storage/support-test/ 测试浏览器的存储上限。
1.3 浏览器最小版本支持
支持sessionStorage的浏览器最小版本:IE8、Chrome 5。
1.4 适合场景
sessionStorage 非常适合SPA(单页应用程序),可以方便在各业务模块进行传值。
web storage和cookie的区别
Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生(来自@otakustay 的纠正)
https://www.cnblogs.com/yuzhongwusan/archive/2011/12/19/2293347.html
https://www.runoob.com/jsref/prop-win-sessionstorage.html
localStorage 和 sessionStorage 属性允许在浏览器中存储 key/value 对的数据。
sessionStorage 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。
localStorage 用于长久保存整个网站的数据,保存的数据没有过期时间,直到手动去删除。
localStorage 属性是只读的。
提示: 如果你只想将数据保存在当前会话中,可以使用 sessionStorage 属性, 改数据对象临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据。
语法
window.localStorage
保存数据语法:
localStorage.setItem("key", "value");
读取数据语法:
var lastname = localStorage.getItem("key");
删除数据语法:
localStorage.removeItem("key");
*/