274 lines
9.8 KiB
Lua
274 lines
9.8 KiB
Lua
![]() |
-- Copyright (C) 2020 jerrykuku <jerrykuku@gmail.com>
|
|||
|
-- Licensed to the public under the GNU General Public License v3.
|
|||
|
package.path = package.path .. ';/usr/share/ttnode/?.lua'
|
|||
|
local uci = require 'luci.model.uci'.cursor()
|
|||
|
local config = 'ttnode'
|
|||
|
local requests = require('requests')
|
|||
|
local BASE_URL = 'http://tiantang.mogencloud.com/web/api/'
|
|||
|
local BASE_API = 'http://tiantang.mogencloud.com/api/v1/'
|
|||
|
local xformHeaders = {['Content-Type'] = 'application/x-www-form-urlencoded'}
|
|||
|
|
|||
|
local sckey = uci:get_first(config, 'global', 'serverchan')
|
|||
|
local tg_token = uci:get_first(config, 'global', 'tg_token')
|
|||
|
local tg_userid = uci:get_first(config, 'global', 'tg_userid')
|
|||
|
local token = uci:get_first(config, 'global', 'token')
|
|||
|
|
|||
|
local auto_cash = uci:get_first(config, 'global', 'auto_cash')
|
|||
|
local week = uci:get_first(config, 'global', 'week')
|
|||
|
local ttnode = {}
|
|||
|
local msg = ''
|
|||
|
local total = 0
|
|||
|
local msgTitle = '[甜糖星愿]星愿日结详细'
|
|||
|
|
|||
|
-- BASE Function --
|
|||
|
|
|||
|
function print_r(t)
|
|||
|
local print_r_cache = {}
|
|||
|
local function sub_print_r(t, indent)
|
|||
|
if (print_r_cache[tostring(t)]) then
|
|||
|
print(indent .. '*' .. tostring(t))
|
|||
|
else
|
|||
|
print_r_cache[tostring(t)] = true
|
|||
|
if (type(t) == 'table') then
|
|||
|
for pos, val in pairs(t) do
|
|||
|
if (type(val) == 'table') then
|
|||
|
print(indent .. '[' .. pos .. '] => ' .. tostring(t) .. ' {')
|
|||
|
sub_print_r(val, indent .. string.rep(' ', string.len(pos) + 8))
|
|||
|
print(indent .. string.rep(' ', string.len(pos) + 6) .. '}')
|
|||
|
elseif (type(val) == 'string') then
|
|||
|
print(indent .. '[' .. pos .. '] => "' .. val .. '"')
|
|||
|
else
|
|||
|
print(indent .. '[' .. pos .. '] => ' .. tostring(val))
|
|||
|
end
|
|||
|
end
|
|||
|
else
|
|||
|
print(indent .. tostring(t))
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
if (type(t) == 'table') then
|
|||
|
print(tostring(t) .. ' {')
|
|||
|
sub_print_r(t, ' ')
|
|||
|
print('}')
|
|||
|
else
|
|||
|
sub_print_r(t, ' ')
|
|||
|
end
|
|||
|
print()
|
|||
|
end
|
|||
|
|
|||
|
function sleep(n)
|
|||
|
os.execute('sleep ' .. n)
|
|||
|
end
|
|||
|
|
|||
|
--APIS--
|
|||
|
|
|||
|
--发送消息到Server酱 和 Telegram
|
|||
|
function ttnode.sendMsg(text, desp)
|
|||
|
if sckey:len() > 0 then
|
|||
|
local url = 'https://sc.ftqq.com/' .. sckey .. '.send'
|
|||
|
local data = 'text=' .. text .. '&desp=' .. desp
|
|||
|
response = requests.post {url, data = data, headers = xformHeaders}
|
|||
|
end
|
|||
|
if tg_token:len() > 0 and tg_userid:len() > 0 then
|
|||
|
local tg_url = 'https://api.telegram.org/bot' .. tg_token .. '/sendMessage'
|
|||
|
local tg_msg = "<b>"..text.."</b>"..desp
|
|||
|
local tg_data = 'chat_id='.. tg_userid ..'&text=' .. tg_msg .. '&parse_mode=html'
|
|||
|
response = requests.post {tg_url, data = tg_data, headers = xformHeaders}
|
|||
|
end
|
|||
|
return 1
|
|||
|
end
|
|||
|
|
|||
|
--获取验证码
|
|||
|
function ttnode.getCode(phone)
|
|||
|
url = BASE_URL .. 'login/code'
|
|||
|
data = 'phone=' .. phone
|
|||
|
response = requests.post {url, data = data, headers = xformHeaders}
|
|||
|
json_body, error = response.json()
|
|||
|
return json_body
|
|||
|
end
|
|||
|
|
|||
|
-- 登录
|
|||
|
function ttnode.login(phone, authCode)
|
|||
|
url = BASE_URL .. 'login'
|
|||
|
data = 'phone=' .. phone .. '&authCode=' .. authCode
|
|||
|
response = requests.post {url, data = data, headers = xformHeaders}
|
|||
|
json_body, error = response.json()
|
|||
|
if json_body.errCode == 0 then
|
|||
|
token = json_body.data.token
|
|||
|
uci:set('ttnode', '@global[0]', 'token', token)
|
|||
|
uci:commit('ttnode')
|
|||
|
return true
|
|||
|
else
|
|||
|
return false
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--甜糖用户初始化信息,可以获取待收取的推广信息数,可以获取账户星星数
|
|||
|
function ttnode.getInitInfo()
|
|||
|
url = BASE_URL .. 'account/message/loading'
|
|||
|
headers = {['Content-Type'] = 'application/json', ['authorization'] = token}
|
|||
|
response = requests.post {url, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
return json_body
|
|||
|
end
|
|||
|
|
|||
|
--获取当前设备列表,可以获取待收的星星数
|
|||
|
function ttnode.getDevices()
|
|||
|
url = BASE_API .. 'devices?page=1&type=2&per_page=200'
|
|||
|
headers = {['Content-Type'] = 'application/json', ['authorization'] = token}
|
|||
|
response = requests.get {url, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
return json_body
|
|||
|
end
|
|||
|
|
|||
|
--收取推广奖励星星
|
|||
|
function ttnode.promote_score_logs(score)
|
|||
|
if score == 0 then
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[推广奖励]0-🌟\n'
|
|||
|
return
|
|||
|
end
|
|||
|
url = BASE_API .. 'promote/score_logs'
|
|||
|
headers = {['Content-Type'] = 'application/json', ['authorization'] = token}
|
|||
|
data = {score = score}
|
|||
|
response = requests.post {url, data = data, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
if json_body.errCode ~= 0 then
|
|||
|
msg = msg .. '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. ' [推广奖励]0-🌟\n'
|
|||
|
return
|
|||
|
end
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[推广奖励]"..score.."-🌟\n'
|
|||
|
total = total + score
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--收取设备奖励
|
|||
|
function ttnode.score_logs(device_id, score, name)
|
|||
|
if score == 0 then
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[' .. name .. ']0-🌟\n'
|
|||
|
return
|
|||
|
end
|
|||
|
url = BASE_API .. 'score_logs'
|
|||
|
headers = {['Content-Type'] = 'application/json', ['authorization'] = token}
|
|||
|
data = {device_id = device_id, score = score}
|
|||
|
response = requests.post {url, data = data, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
if json_body.errCode ~= 0 then
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[' .. name .. ']0-🌟\n'
|
|||
|
return
|
|||
|
end
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[' .. name .. ']' .. score .. '-🌟\n'
|
|||
|
total = total + tonumber(score)
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--签到功能
|
|||
|
function ttnode.sign_in()
|
|||
|
url = BASE_URL .. 'account/sign_in'
|
|||
|
headers = {['Content-Type'] = 'application/json', ['authorization'] = token}
|
|||
|
response = requests.post {url, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
|
|||
|
if json_body.errCode ~= 0 then
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[签到奖励]0-🌟(失败:' .. json_body.msg .. ')\n'
|
|||
|
return
|
|||
|
end
|
|||
|
msg = msg .. '\n ' .. os.date('%Y-%m-%d %H:%M:%S') .. '[签到奖励]1-🌟 \n'
|
|||
|
total = total + 1
|
|||
|
return
|
|||
|
end
|
|||
|
|
|||
|
--支付宝提现
|
|||
|
function ttnode.withdraw_logs(bean)
|
|||
|
local logStr = ''
|
|||
|
url = BASE_API .. 'withdraw_logs'
|
|||
|
score = bean.score
|
|||
|
score = score - score % 100
|
|||
|
real_name = bean.real_name
|
|||
|
card_id = bean.card_id
|
|||
|
bank_name = '支付宝'
|
|||
|
sub_bank_name = ''
|
|||
|
ztype = 'zfb'
|
|||
|
if score < 1000 then
|
|||
|
logStr = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[自动提现]星愿不足1000无法提现\n'
|
|||
|
return logStr
|
|||
|
end
|
|||
|
data = 'score=' .. score .. '&real_name=' .. real_name .. '&card_id=' .. card_id .. '&bank_name=' .. bank_name .. '&sub_bank_name=' .. sub_bank_name .. '&type=' .. ztype
|
|||
|
print(data)
|
|||
|
headers = {['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8', ['authorization'] = token}
|
|||
|
response = requests.post {url, data = data, headers = headers}
|
|||
|
json_body, error = response.json()
|
|||
|
if json_body.errCode ~= 0 then
|
|||
|
print(json_body.msg .. score)
|
|||
|
logStr = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[自动提现]提现失败,请关闭自动提现等待更新\n'
|
|||
|
return logStr
|
|||
|
end
|
|||
|
local data = json_body.data
|
|||
|
zfbID = data.card_id
|
|||
|
pre = string.sub(zfbID, 1, 5)
|
|||
|
ends = string.sub(zfbID, -5)
|
|||
|
zfbID = pre .. '***' .. ends
|
|||
|
logStr = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[自动提现]扣除' .. score .. '-🌟(' .. zfbID .. ')\n'
|
|||
|
return logStr
|
|||
|
end
|
|||
|
|
|||
|
--逻辑处理
|
|||
|
|
|||
|
function ttnode.startProcess()
|
|||
|
local resObj = {}
|
|||
|
|
|||
|
--获取用户信息
|
|||
|
local userData = ttnode.getInitInfo()
|
|||
|
if userData.errCode ~= 0 then
|
|||
|
resObj.code = 1
|
|||
|
resObj.msg = os.date('%Y-%m-%d %H:%M:%S') .. ' authorization已经失效,请重新抓包填写!'
|
|||
|
ttnode.sendMsg(os.date('%Y-%m-%d %H:%M:%S') .. '[甜糖星愿]-Auth失效通知', resObj.msg)
|
|||
|
return resObj
|
|||
|
end
|
|||
|
local inactivedPromoteScore = userData.data.inactivedPromoteScore
|
|||
|
local accountScore = userData.data.score
|
|||
|
|
|||
|
--获取设备列表信息
|
|||
|
local devices = ttnode.getDevices().data.data
|
|||
|
msg = msg .. '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[收益详细]:\n```lua'
|
|||
|
--收取签到收益
|
|||
|
ttnode.sign_in()
|
|||
|
--收取推广收益
|
|||
|
ttnode.promote_score_logs(inactivedPromoteScore)
|
|||
|
--收取设备收益
|
|||
|
for _, device in pairs(devices) do
|
|||
|
ttnode.score_logs(device.hardware_id, device.inactived_score, device.alias)
|
|||
|
end
|
|||
|
|
|||
|
--自动提现
|
|||
|
local now_week = os.date('%A')
|
|||
|
local withdraw = ''
|
|||
|
if week == now_week and auto_cash == '1' then
|
|||
|
local userInfo = userData.data
|
|||
|
local zfbList = userInfo.zfbList
|
|||
|
if next(zfbList) == nil then
|
|||
|
withdraw = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[自动提现]提现失败,请绑定支付宝账户\n'
|
|||
|
else
|
|||
|
local bean = {}
|
|||
|
bean.score = userInfo.score
|
|||
|
bean.real_name = zfbList[1].name
|
|||
|
bean.card_id = zfbList[1].account
|
|||
|
withdraw = ttnode.withdraw_logs(bean)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--收益统计并发送微信消息
|
|||
|
local total_str = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[总共收取]' .. total .. '-🌟\n'
|
|||
|
local nowdata = ttnode.getInitInfo()
|
|||
|
local accountScore = nowdata.data.score
|
|||
|
local accountScore_str = '\n' .. os.date('%Y-%m-%d %H:%M:%S') .. '[账户星星]' .. accountScore .. '-🌟\n'
|
|||
|
local ends = '\n```\n***\n注意:以上统计仅供参考,一切请以甜糖客户端APP为准'
|
|||
|
msg = accountScore_str .. total_str .. withdraw .. msg .. ends
|
|||
|
msgRes = ttnode.sendMsg(msgTitle, msg)
|
|||
|
resObj.code = 0
|
|||
|
resObj.msg = msg
|
|||
|
resObj.msgres = msgRes
|
|||
|
return resObj
|
|||
|
end
|
|||
|
|
|||
|
return ttnode
|