2020-07-02 11:50:39 +08:00
const $ = new Env ( '百度签到' )
$ . VAL _cookies = $ . getdata ( 'chavy_cookie_tieba' ) || $ . getdata ( 'CookieTB' )
$ . CFG _isOrderBars = $ . getdata ( 'CFG_tieba_isOrderBars' ) || 'false' // 1: 经验排序, 2: 连签排序
$ . CFG _maxShowBars = $ . getdata ( 'CFG_tieba_maxShowBars' ) * 1 || 15 //每次通知数量
$ . CFG _maxSignBars = $ . getdata ( 'CFG_tieba_maxSignBars' ) * 1 || 5 // 每次并发执行多少个任务
$ . CFG _signWaitTime = $ . getdata ( 'CFG_tieba_signWaitTime' ) * 1 || 2000 // 每次并发间隔时间 (毫秒)
! ( async ( ) => {
2020-07-02 11:52:57 +08:00
await tieba ( )
await zhidao ( )
await showmsg ( )
2020-07-02 11:50:39 +08:00
} ) ( )
2020-07-02 11:52:57 +08:00
. catch ( ( e ) => $ . logErr ( e ) )
. finally ( ( ) => $ . done ( ) )
2020-07-02 11:50:39 +08:00
// 贴吧
function tieba ( ) {
2020-07-02 11:52:57 +08:00
return new Promise ( ( resove ) => {
const url = { url : 'https://tieba.baidu.com/mo/q/newmoindex' , headers : { Cookie : $ . VAL _cookies } }
$ . get ( url , async ( err , resp , data ) => {
try {
const _data = JSON . parse ( data )
// 处理异常
if ( _data . no !== 0 ) {
throw new Error ( ` 获取清单失败! 原因: ${ _data . error } ` )
}
// 组装数据
$ . bars = [ ]
$ . tieba = { tbs : _data . data . tbs }
_data . data . like _forum . forEach ( ( bar ) => $ . bars . push ( barWrapper ( bar ) ) )
$ . bars = $ . bars . sort ( ( a , b ) => b . exp - a . exp )
// 开始签到
await signbars ( $ . bars )
await getbars ( $ . bars )
} catch ( e ) {
$ . logErr ( e , resp )
} finally {
resove ( )
}
} )
2020-07-02 11:50:39 +08:00
} )
}
async function signbars ( bars ) {
2020-07-02 11:52:57 +08:00
let signbarActs = [ ]
// 处理`已签`数据
bars . filter ( ( bar ) => bar . isSign ) . forEach ( ( bar ) => ( bar . iscurSign = false ) )
// 处理`未签`数据
let _curbarIdx = 1
let _signbarCnt = 0
bars . filter ( ( bar ) => ! bar . isSign ) . forEach ( ( bar ) => _signbarCnt ++ )
for ( let bar of bars . filter ( ( bar ) => ! bar . isSign ) ) {
const signbarAct = ( resove ) => {
const url = { url : 'https://tieba.baidu.com/sign/add' , headers : { Cookie : $ . VAL _cookies } }
url . body = ` ie=utf-8&kw= ${ encodeURIComponent ( bar . name ) } &tbs= ${ $ . tieba . tbs } `
url . headers [ 'Host' ] = 'tieba.baidu.com'
url . headers [ 'User-Agent' ] = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1'
$ . post ( url , ( err , resp , data ) => {
try {
const _data = JSON . parse ( data )
bar . iscurSign = true
bar . issignSuc = _data . no === 0 || _data . no === 1101
bar . signNo = _data . no
bar . signMsg = _data . no === 1102 ? '签得太快!' : _data . error
bar . signMsg = _data . no === 2150040 ? '需要验证码!' : _data . error
} catch ( e ) {
bar . iscurSign = true
bar . issignSuc = false
bar . signNo = null
bar . signMsg = error !== null ? error : e
$ . logErr ( e , resp )
} finally {
$ . log ( ` ❕ 贴吧:【 ${ bar . name } 】签到完成! ` )
resove ( )
}
} )
}
signbarActs . push ( new Promise ( signbarAct ) )
if ( signbarActs . length === $ . CFG _maxSignBars || _signbarCnt === _curbarIdx ) {
$ . log ( '' , ` ⏳ 正在发起 ${ signbarActs . length } 个签到任务! ` )
await Promise . all ( signbarActs )
await $ . wait ( $ . CFG _signWaitTime )
signbarActs = [ ]
}
_curbarIdx ++
2020-07-02 11:50:39 +08:00
}
}
function getbars ( bars ) {
2020-07-02 11:52:57 +08:00
const getBarActs = [ ]
for ( let bar of bars ) {
const getBarAct = ( resove ) => {
const url = {
url : ` http://tieba.baidu.com/sign/loadmonth?kw= ${ encodeURIComponent ( bar . name ) } &ie=utf-8 ` ,
headers : { Cookie : $ . VAL _cookies }
}
url . headers [ 'Host' ] = 'tieba.baidu.com'
url . headers [ 'User-Agent' ] = 'User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1 Mobile/15E148 Safari/604.1'
$ . get ( url , ( err , resp , data ) => {
try {
const _signinfo = JSON . parse ( data ) . data . sign _user _info
bar . signRank = _signinfo . rank
bar . contsignCnt = _signinfo . sign _keep
bar . totalsignCnt = _signinfo . sign _total
} catch ( e ) {
bar . contsignCnt = '❓'
$ . logErr ( e , response )
} finally {
resove ( )
}
} )
}
getBarActs . push ( new Promise ( getBarAct ) )
2020-07-02 11:50:39 +08:00
}
2020-07-02 11:52:57 +08:00
return Promise . all ( getBarActs )
2020-07-02 11:50:39 +08:00
}
async function zhidao ( ) {
2020-07-02 11:52:57 +08:00
await loginZhidao ( )
await signZhidao ( )
2020-07-02 11:50:39 +08:00
}
function loginZhidao ( ) {
2020-07-02 11:52:57 +08:00
return new Promise ( ( resove ) => {
const url = { url : 'https://zhidao.baidu.com/' , headers : { Cookie : $ . VAL _cookies } }
url . headers [ 'Host' ] = 'zhidao.baidu.com'
url . headers [ 'User-Agent' ] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15'
$ . zhidao = { }
$ . post ( url , ( err , resp , data ) => {
try {
$ . zhidao . stoken = data . match ( /"stoken"[^"]*"([^"]*)"/ ) [ 1 ]
if ( ! $ . zhidao . stoken ) {
throw new Error ( ` 获取 stoken 失败! stoken: ${ $ . zhidao . stoken } ` )
}
$ . zhidao . isloginSuc = true
$ . zhidao . loginMsg = '登录成功'
} catch ( e ) {
$ . zhidao . isloginSuc = false
$ . zhidao . loginMsg = '登录失败'
$ . logErr ( e , resp )
} finally {
resove ( )
}
} )
2020-07-02 11:50:39 +08:00
} )
}
function signZhidao ( ) {
2020-07-02 11:52:57 +08:00
// 登录失败, 直接跳出
if ( ! $ . zhidao . isloginSuc ) {
return null
}
return new Promise ( ( resove ) => {
const url = { url : 'https://zhidao.baidu.com/submit/user' , headers : { Cookie : $ . VAL _cookies } }
url . headers [ 'Host' ] = 'zhidao.baidu.com'
url . headers [ 'User-Agent' ] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15'
const timestamp = Date . parse ( new Date ( ) )
const utdata = ` 61,61,7,0,0,0,12,61,5,2,12,4,24,5,4,1,4, ${ timestamp } `
url . body = ` cm=100509&utdata= ${ utdata } &stoken= ${ $ . zhidao . stoken } `
$ . post ( url , ( err , resp , data ) => {
try {
const _data = JSON . parse ( data )
$ . zhidao . isSignSuc = true
$ . zhidao . signNo = _data . errorNo
$ . zhidao . signMsg = _data . errorMsg
} catch ( e ) {
$ . zhidao . isSignSuc = false
$ . zhidao . signNo = null
$ . zhidao . signMsg = e
$ . logErr ( e , resp )
} finally {
resove ( )
}
} )
2020-07-02 11:50:39 +08:00
} )
}
function barWrapper ( bar ) {
2020-07-02 11:52:57 +08:00
return { id : bar . forum _id , name : bar . forum _name , exp : bar . user _exp , level : bar . user _level , isSign : bar . is _sign === 1 }
2020-07-02 11:50:39 +08:00
}
function showmsg ( ) {
2020-07-02 11:52:57 +08:00
return new Promise ( ( resolve ) => {
// 数据: 签到数量
const allbarCnt = $ . bars . length
let allsignCnt = 0
let cursignCnt = 0
let curfailCnt = 0
$ . bars . filter ( ( bar ) => bar . isSign ) . forEach ( ( bar ) => ( allsignCnt += 1 ) )
$ . bars . filter ( ( bar ) => bar . iscurSign && bar . issignSuc ) . forEach ( ( bar ) => ( cursignCnt += 1 ) )
$ . bars . filter ( ( bar ) => bar . iscurSign && ! bar . issignSuc ) . forEach ( ( bar ) => ( curfailCnt += 1 ) )
$ . bars = [ true , 'true' ] . includes ( $ . CFG _isOrderBars ) ? $ . bars . sort ( ( a , b ) => b . contsignCnt - a . contsignCnt ) : $ . bars
allsignCnt += cursignCnt
// 通知: 副标题
let tiebasubt = '贴吧: '
if ( allbarCnt == allsignCnt ) tiebasubt += '成功'
else if ( allbarCnt == curfailCnt ) tiebasubt += '失败'
else tiebasubt += '部分'
let zhidaosubt = '知道: '
if ( $ . zhidao . isSignSuc && $ . zhidao . signNo === 0 ) zhidaosubt += '成功'
else if ( $ . zhidao . isSignSuc && $ . zhidao . signNo === 2 ) zhidaosubt += '重复'
else zhidaosubt += '失败'
// 通知: 详情
let _curPage = 1
const _totalPage = Math . ceil ( allbarCnt / $ . CFG _maxShowBars )
2020-07-02 11:50:39 +08:00
$ . desc = [ ]
2020-07-02 11:52:57 +08:00
$ . bars . forEach ( ( bar , index ) => {
const barno = index + 1
const signbar = ` ${ bar . isSign || bar . issignSuc ? '🟢' : '🔴' } [ ${ barno } ]【 ${ bar . name } 】排名: ${ bar . signRank } `
const signlevel = ` 等级: ${ bar . level } `
const signexp = ` 经验: ${ bar . exp } `
const signcnt = ` 连签: ${ bar . contsignCnt } / ${ bar . totalsignCnt } 天 `
const signmsg = ` ${ bar . isSign || bar . issignSuc ? '' : ` 失败原因: ${ bar . signMsg } \n ` } `
$ . desc . push ( ` ${ signbar } ` )
$ . desc . push ( ` ${ signlevel } , ${ signexp } , ${ signcnt } ` )
$ . desc . push ( ` ${ signmsg } ` )
if ( barno % $ . CFG _maxShowBars === 0 || barno === allbarCnt ) {
const _descinfo = [ ]
_descinfo . push ( ` 共签: ${ allsignCnt } / ${ allbarCnt } , 本次成功: ${ cursignCnt } , 本次失败: ${ curfailCnt } ` )
_descinfo . push ( ` 点击查看详情, 第 ${ _curPage ++ } / ${ _totalPage } 页 ` )
$ . subt = ` ${ tiebasubt } , ${ zhidaosubt } `
$ . desc = [ ... _descinfo , '' , ... $ . desc ] . join ( '\n' )
$ . msg ( $ . name , $ . subt , $ . desc )
$ . desc = [ ]
}
} )
resolve ( )
2020-07-02 11:50:39 +08:00
} )
}
// prettier-ignore
2020-07-02 11:52:57 +08:00
function Env ( t , s ) {
return new class {
constructor ( t , s ) {
this . name = t , this . data = null , this . dataFile = "box.dat" , this . logs = [ ] , this . logSeparator = "\n" , this . startTime = ( new Date ) . getTime ( ) , Object . assign ( this , s ) , this . log ( "" , ` \u d83d \u dd14 ${ this . name } , \u 5f00 \u 59cb! ` )
}
isNode ( ) {
return "undefined" != typeof module && ! ! module . exports
}
isQuanX ( ) {
return "undefined" != typeof $task
}
isSurge ( ) {
return "undefined" != typeof $httpClient
}
isLoon ( ) {
return "undefined" != typeof $loon
}
loaddata ( ) {
if ( ! this . isNode ) return { } ;
{
this . fs = this . fs ? this . fs : require ( "fs" ) , this . path = this . path ? this . path : require ( "path" ) ;
const t = this . path . resolve ( this . dataFile ) , s = this . path . resolve ( process . cwd ( ) , this . dataFile ) ,
e = this . fs . existsSync ( t ) , i = ! e && this . fs . existsSync ( s ) ;
if ( ! e && ! i ) return { } ;
{
const i = e ? t : s ;
try {
return JSON . parse ( this . fs . readFileSync ( i ) )
} catch {
return { }
}
}
}
}
writedata ( ) {
if ( this . isNode ) {
this . fs = this . fs ? this . fs : require ( "fs" ) , this . path = this . path ? this . path : require ( "path" ) ;
const t = this . path . resolve ( this . dataFile ) , s = this . path . resolve ( process . cwd ( ) , this . dataFile ) ,
e = this . fs . existsSync ( t ) , i = ! e && this . fs . existsSync ( s ) , h = JSON . stringify ( this . data ) ;
e ? this . fs . writeFileSync ( t , h ) : i ? this . fs . writeFileSync ( s , h ) : this . fs . writeFileSync ( t , h )
}
}
getdata ( t ) {
return this . isSurge ( ) || this . isLoon ( ) ? $persistentStore . read ( t ) : this . isQuanX ( ) ? $prefs . valueForKey ( t ) : this . isNode ( ) ? ( this . data = this . loaddata ( ) , this . data [ t ] ) : this . data && this . data [ t ] || null
}
setdata ( t , s ) {
return this . isSurge ( ) || this . isLoon ( ) ? $persistentStore . write ( t , s ) : this . isQuanX ( ) ? $prefs . setValueForKey ( t , s ) : this . isNode ( ) ? ( this . data = this . loaddata ( ) , this . data [ s ] = t , this . writedata ( ) , ! 0 ) : this . data && this . data [ s ] || null
}
get ( t , s = ( ( ) => {
} ) ) {
t . headers && ( delete t . headers [ "Content-Type" ] , delete t . headers [ "Content-Length" ] ) , this . isSurge ( ) || this . isLoon ( ) ? $httpClient . get ( t , ( t , e , i ) => {
! t && e && ( e . body = i , e . statusCode = e . status , s ( t , e , i ) )
} ) : this . isQuanX ( ) ? $task . fetch ( t ) . then ( t => {
const { statusCode : e , statusCode : i , headers : h , body : o } = t ;
s ( null , { status : e , statusCode : i , headers : h , body : o } , o )
} , t => s ( t ) ) : this . isNode ( ) && ( this . got = this . got ? this . got : require ( "got" ) , this . got ( t ) . then ( t => {
const { statusCode : e , statusCode : i , headers : h , body : o } = t ;
s ( null , { status : e , statusCode : i , headers : h , body : o } , o )
} , t => s ( t ) ) )
}
post ( t , s = ( ( ) => {
} ) ) {
if ( t . body && t . headers && ! t . headers [ "Content-Type" ] && ( t . headers [ "Content-Type" ] = "application/x-www-form-urlencoded" ) , delete t . headers [ "Content-Length" ] , this . isSurge ( ) || this . isLoon ( ) ) $httpClient . post ( t , ( t , e , i ) => {
! t && e && ( e . body = i , e . statusCode = e . status , s ( t , e , i ) )
} ) ; else if ( this . isQuanX ( ) ) t . method = "POST" , $task . fetch ( t ) . then ( t => {
const { statusCode : e , statusCode : i , headers : h , body : o } = t ;
s ( null , { status : e , statusCode : i , headers : h , body : o } , o )
} , t => s ( t ) ) ; else if ( this . isNode ( ) ) {
this . got = this . got ? this . got : require ( "got" ) ;
const { url : e , ... i } = t ;
this . got . post ( e , i ) . then ( t => {
const { statusCode : e , statusCode : i , headers : h , body : o } = t ;
s ( null , { status : e , statusCode : i , headers : h , body : o } , o )
} , t => s ( t ) )
}
}
msg ( s = t , e = "" , i = "" , h ) {
this . isSurge ( ) || this . isLoon ( ) ? $notification . post ( s , e , i ) : this . isQuanX ( ) && $notify ( s , e , i ) , this . logs . push ( "" , "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3==============" ) , this . logs . push ( s ) , e && this . logs . push ( e ) , i && this . logs . push ( i )
}
log ( ... t ) {
t . length > 0 ? this . logs = [ ... this . logs , ... t ] : console . log ( this . logs . join ( this . logSeparator ) )
}
logErr ( t , s ) {
const e = ! this . isSurge ( ) && ! this . isQuanX ( ) && ! this . isLoon ( ) ;
e ? $ . log ( "" , ` \u 2757 \u fe0f ${ this . name } , \u 9519 \u 8bef! ` , t . stack ) : $ . log ( "" , ` \u 2757 \u fe0f ${ this . name } , \u 9519 \u 8bef! ` , t . message )
}
wait ( t ) {
return new Promise ( s => setTimeout ( s , t ) )
}
done ( t = null ) {
const s = ( new Date ) . getTime ( ) , e = ( s - this . startTime ) / 1e3 ;
this . log ( "" , ` \u d83d \u dd14 ${ this . name } , \u 7ed3 \u 675f! \u d83d \u dd5b ${ e } \u 79d2 ` ) , this . log ( ) , ( this . isSurge ( ) || this . isQuanX ( ) || this . isLoon ( ) ) && $done ( t )
}
} ( t , s )
}