luci-app-jd-dailybonus: Keep up to date from jerrykuku (#6296)

This commit is contained in:
Beginner 2021-01-31 14:48:32 +08:00 committed by GitHub
parent 7daf3edcec
commit 4244e635c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 190 additions and 418 deletions

View File

@ -1,71 +1,17 @@
#
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-jd-dailybonus
LUCI_PKGARCH:=all
PKG_VERSION:=1.0.3
PKG_RELEASE:=20210125
include $(INCLUDE_DIR)/package.mk
define Package/luci-app-jd-dailybonus
SECTION:=luci
CATEGORY:=LuCI
SUBMENU:=3. Applications
TITLE:=Luci for JD dailybonus Script
PKGARCH:=all
DEPENDS:=+node +wget +lua
endef
define Build/Prepare
endef
define Build/Compile
endef
define Package/$(PKG_NAME)/conffiles
/etc/config/jd-dailybonus
endef
define Package/luci-app-jd-dailybonus/install
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./root/etc/config/jd-dailybonus $(1)/etc/config/jd-dailybonus
LUCI_TITLE:=Luci for JD dailybonus Script
LUCI_PKGARCH:=all
LUCI_DEPENDS:=+node +wget +lua +libuci-lua
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./root/etc/init.d/* $(1)/etc/init.d/
include $(TOPDIR)/feeds/luci/luci.mk
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./root/etc/uci-defaults/* $(1)/etc/uci-defaults/
$(INSTALL_DIR) $(1)/usr/share/jd-dailybonus
$(INSTALL_BIN) ./root/usr/share/jd-dailybonus/*.sh $(1)/usr/share/jd-dailybonus/
$(INSTALL_DATA) ./root/usr/share/jd-dailybonus/*.js $(1)/usr/share/jd-dailybonus/
$(INSTALL_DATA) ./root/usr/share/jd-dailybonus/*.lua $(1)/usr/share/jd-dailybonus/
$(INSTALL_DIR) $(1)/usr/share/rpcd/acl.d
$(INSTALL_DATA) ./root/usr/share/rpcd/acl.d/* $(1)/usr/share/rpcd/acl.d
$(INSTALL_DIR) $(1)/usr/lib/node
cp -pR ./root/usr/lib/node/* $(1)/usr/lib/node
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
$(INSTALL_DATA) ./luasrc/controller/* $(1)/usr/lib/lua/luci/controller/
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/jd-dailybonus
$(INSTALL_DATA) ./luasrc/model/cbi/jd-dailybonus/* $(1)/usr/lib/lua/luci/model/cbi/jd-dailybonus/
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/jd-dailybonus
$(INSTALL_DATA) ./luasrc/view/jd-dailybonus/* $(1)/usr/lib/lua/luci/view/jd-dailybonus/
$(INSTALL_DIR) $(1)/lib/upgrade/keep.d
$(INSTALL_DATA) ./root/lib/upgrade/keep.d/* $(1)/lib/upgrade/keep.d/
endef
$(eval $(call BuildPackage,luci-app-jd-dailybonus))
# call BuildPackage - OpenWrt buildroot signature
# call BuildPackage - OpenWrt buildroot signature

View File

@ -20,18 +20,11 @@ end
-- 执行程序
function run()
local e = {}
local uci = luci.model.uci.cursor()
local data = luci.http.formvalue()
uci:tset('jd-dailybonus', '@global[0]', data)
uci:commit('jd-dailybonus')
luci.sys.call('lua /usr/share/jd-dailybonus/gen_cookieset.lua')
luci.sys.call('/usr/share/jd-dailybonus/newapp.sh -r')
luci.sys.call('/usr/share/jd-dailybonus/newapp.sh -a')
e.error = 0
luci.http.prepare_content('application/json')
luci.http.write_json(e)
local running = luci.sys.call("busybox ps -w | grep JD_DailyBonus.js | grep -v grep >/dev/null") == 0
if not running then
luci.sys.call('/usr/share/jd-dailybonus/newapp.sh -r')
end
luci.http.write('')
end
--检查更新
@ -127,6 +120,9 @@ end
function get_log()
local fs = require "nixio.fs"
local log = fs.readfile("/var/log/jd_dailybonus.log") or ""
luci.http.write(log)
local e = {}
e.running = luci.sys.call("busybox ps -w | grep JD_DailyBonus.js | grep -v grep >/dev/null") == 0
e.log = fs.readfile("/var/log/jd_dailybonus.log") or ""
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end

View File

@ -1,16 +1,9 @@
local fs = require "nixio.fs"
log = SimpleForm("logview")
log.submit = false
log.reset = false
-- [[ 日志显示 ]]--
t = log:field(TextValue, "1", nil)
t.rmempty = true
t.rows = 30
function t.cfgvalue()
return fs.readfile("/var/log/jd_dailybonus.log") or ""
end
t.readonly="readonly"
t = log:field(DummyValue, '', '')
t.rawhtml = true
t.template = 'jd-dailybonus/log'
return log

View File

@ -1,4 +1,70 @@
<%+cbi/valueheader%>
<script src="https://cdn.jsdelivr.net/npm/qrcode_js@1.0.0/qrcode.min.js"></script>
<style>
#qrcontainer {
position: fixed;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 5000;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, .8);
text-align: center;
transition: all 0.3s;
}
#qrcontainer.hidden{
opacity: 0;
visibility: hidden;
}
#qrcontainer .qframe {
background-color: #ffffff;
padding: 1rem;
border-radius: 0.5rem;
border: #6D8A88 1px solid;
-webkit-box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2);
position: relative;
}
#qrcontainer .qframe #refresh_qrcode{
width: 256px;
height: 256px;
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
left: 1rem;
top: 1rem;
color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
}
#qrcontainer .qframe #refresh_qrcode.hidden{
opacity: 0;
visibility: hidden;
}
#qrcontainer .qframe #refresh_qrcode h3{
font-weight: normal;
}
#qrcontainer .qframe #refresh_qrcode .refresh{
display: block;
background: #e4393c;
width: 80px;
height: 30px;
margin: 0 auto;
line-height: 30px;
opacity: 1;
z-index: 19;
color: #fbfbfb;
text-decoration: none;
cursor: pointer;
}
#qrcontainer .qframe .info {
padding: 1rem 0 0 0;
}
</style>
<label class="cbi-value-title"><%= translate("获取Cookie") %></label>
<div class="cbi-value-field">
@ -10,5 +76,78 @@
<%= translate("点击上面按钮使用京东手机app扫码获取Cookie")%>
</div>
</div>
<div id="qrcontainer" class="hidden">
<div class="qframe">
<div id="refresh_qrcode" class="hidden">
<div>
<h3>二维码已失效</h3>
<div class="refresh" onclick="get_code()">刷新</div>
</div>
</div>
<div id="qrcode"></div>
<div class="info">请使用京东手机APP扫码</div>
</div>
</div>
<script type="text/javascript">
const QRCODE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","qrcode")%>';
const CHECK_LOGIN_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","check_login")%>';
let ckid = 0;
//初始化二维码
let cookieBtn = Array.prototype.slice.call(document.getElementsByClassName("cookie-button"));
try {
qrcode = new QRCode(document.getElementById("qrcode"),
{
text: "sample",
correctLevel: QRCode.CorrectLevel.L
});
cookieBtn.forEach(e => {
e.onclick = () => {
ckid = e.getAttribute("data-rel");
get_code();
return false;
}
});
} catch (error) {
alert("网络离线状态无法使用二维码获取Cookie请刷新后重试")
cookieBtn.forEach(e => {
e.disabled = true;
});
}
//获取二维码
function get_code(){
XHR.get(QRCODE_URL, null, (x,d) => {
document.getElementById("qrcontainer").classList.remove("hidden");
document.getElementById("refresh_qrcode").classList.add("hidden");
qrcode.clear();
qrcode.makeCode(d.qrcode_url);
checkLogin(d.check_url);
});
return false;
}
function checkLogin(check_url){
let cname = ckid == 1?"cookie":"cookie2"
XHR.poll(3, CHECK_LOGIN_URL, { check_url: check_url, id: cname }, (x, d) => {
if (d.error == 0) {
XHR.halt();
XHR._q = [];
document.getElementById("qrcontainer").classList.add("hidden");
document.getElementById("refresh_qrcode").classList.add("hidden");
let prefix_array = document.getElementsByClassName("cbi-input-text")[0].getAttribute("id").split(".")
prefix_array.pop()
let id = `${prefix_array.join(".")}.${cname}`;
document.getElementById(id).value = d.cookie
} else if (d.error == 21 || d.error == 261) {
XHR.halt();
XHR._q = [];
document.getElementById("refresh_qrcode").classList.remove("hidden");
}
});
}
</script>
<%+cbi/valuefooter%>

View File

@ -0,0 +1,17 @@
<%+cbi/valueheader%>
<textarea id="logview" class="cbi-input-textarea" style="width: 100%" rows="30" readonly="readonly"></textarea>
<script type="text/javascript">
const LOG_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","realtime_log")%>';
//获取实时日志
XHR.poll(1, LOG_URL, null, (x, d) => {
let logview = document.getElementById("logview");
if (!d.running) {
XHR.halt();
}
logview.value = d.log;
logview.scrollTop = logview.scrollHeight;
});
</script>
<%+cbi/valuefooter%>

View File

@ -1,300 +1,34 @@
<%+cbi/valueheader%>
<script src="https://cdn.jsdelivr.net/npm/qrcode_js@1.0.0/qrcode.min.js"></script>
<style>
.modals-bg {
position: fixed;
z-index: 999;
width: 100%;
height: 100%;
left: 0;
top: 0;
background: rgba(255, 255, 255, 0.8);
transition: all 0.3s ease-in-out;
transform: scale(1);
}
.modals {
position: fixed;
z-index: 100;
width: 60%;
height: 500px;
background: #172b4d;
left: 20%;
top: 15%;
color: #fff;
border-radius: 10px;
padding: 20px;
box-sizing: border-box;
-moz-box-sizing: border-box;
/* Firefox */
-webkit-box-sizing: border-box;
/* Safari */
transition: all 0.3s ease-in-out;
transform: scale(1);
}
.modals-bg.hide {
visibility: hidden;
opacity: 0;
}
.modals.hide {
visibility: hidden;
opacity: 0;
transform: scale(0.5);
}
.modals h2 {
color: #fff;
background: transparent;
padding: 0 !important;
margin: 0;
}
.modals h3 {
font-size: 14px;
color: #f5365c !important;
background: transparent;
padding: 0 0 0.5em 0;
}
#log_content3 {
border: 0;
width: 99%;
height: calc(100% - 4rem);
font-family: 'Lucida Console';
font-size: 11px;
background: transparent;
color: #FFFFFF;
outline: none;
padding-left: 3px;
padding-right: 22px;
overflow: hidden;
resize: none;
}
.cbi-value-version {
word-wrap: break-word;
font-size: 0.875rem;
line-height: 1.6;
color: #5e72e4;
font-weight: bold;
padding: .7rem;
padding-left: 0;
width: 23rem;
float: left;
text-align: left;
display: table-cell;
}
#qrcontainer {
position: fixed;
width: 100%;
height: 100%;
left: 0;
top: 0;
z-index: 5000;
display: flex;
align-items: center;
justify-content: center;
background: rgba(255, 255, 255, .8);
text-align: center;
transition: all 0.3s;
}
#qrcontainer.hidden{
opacity: 0;
visibility: hidden;
}
#qrcontainer .qframe {
background-color: #ffffff;
padding: 1rem;
border-radius: 0.5rem;
border: #6D8A88 1px solid;
-webkit-box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 7px 3px rgba(0, 0, 0, 0.2);
position: relative;
}
#qrcontainer .qframe #refresh_qrcode{
width: 256px;
height: 256px;
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
left: 1rem;
top: 1rem;
color: #ffffff;
display: flex;
justify-content: center;
align-items: center;
}
#qrcontainer .qframe #refresh_qrcode.hidden{
opacity: 0;
visibility: hidden;
}
#qrcontainer .qframe #refresh_qrcode h3{
font-weight: normal;
}
#qrcontainer .qframe #refresh_qrcode .refresh{
display: block;
background: #e4393c;
width: 80px;
height: 30px;
margin: 0 auto;
line-height: 30px;
opacity: 1;
z-index: 19;
color: #fbfbfb;
text-decoration: none;
cursor: pointer;
}
#qrcontainer .qframe .info {
padding: 1rem 0 0 0;
}
@media screen and (max-width: 1024px) {
.modals {
position: fixed;
z-index: 100;
width: 80%;
height: 500px;
background: #172b4d;
left: 10%;
top: 15%;
color: #fff;
border-radius: 10px;
padding: 20px;
}
}
@media screen and (max-width: 700px) {
.modals-bg {
position: fixed;
z-index: 100000;
}
.modals {
width: 100%;
height: 100%;
left: 0;
top: 0;
}
}
</style>
<label class="cbi-value-title"><%= translate("执行") %></label>
<div class="cbi-value-field">
<input class="cbi-button cbi-button-reload" id="update_service" type="button" size="0"
value="<%= translate("保存Cookie,并马上进行签到") %>">
<input class="cbi-button cbi-button-reload" id="update_service" type="button" size="0" onclick="run()"
value="<%= translate("手动执行签到") %>">
</div>
<%+cbi/valuefooter%>
<%+cbi/valueheader%>
<label class="cbi-value-title"><%= translate("更新脚本") %></label>
<div class="cbi-value-field">
<input class="cbi-button cbi-button-reload" id="update_script" type="button" size="0" onclick="check_version()" data-version="<%= self.version %>"
value="<%= translate("手动检查脚本更新当前版本v")..self.version %>">
</div>
<%+cbi/valuefooter%>
<div id="qrcontainer" class="hidden">
<div class="qframe">
<div id="refresh_qrcode" class="hidden">
<div>
<h3>二维码已失效</h3>
<div class="refresh" onclick="get_code()">刷新</div>
</div>
</div>
<div id="qrcode"></div>
<div class="info">请使用京东手机APP扫码</div>
</div>
</div>
<script type="text/javascript">
const SAVE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","run")%>';
const RUN_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","run")%>';
const CHECK_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","check_update")%>';
const QRCODE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","qrcode")%>';
const CHECK_LOGIN_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","check_login")%>';
const UPDATE_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","update")%>';
const LOG_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","realtime_log")%>';
const LOG_URL = '<%=luci.dispatcher.build_url("admin", "services", "jd-dailybonus","log")%>';
const CHECKING_TEXT = '<%= translate("正在检查是否存在新的版本 ...") %>';
const UPDATING_TEXT = '<%= translate("正在更新脚本,请稍候 ...") %>';
const NEW_VERSION = '<%= translate("当前已是最新版本:") %>';
var noChange = 0;
var ckid = 0;
var modal = `<div class="modals-bg hide">
<div class="modals hide">
<h2>签到信息</h2>
<h3 style="margin-left:0;">服务正在执行中,请勿刷新!</h3>
<textarea cols="63" rows="28" wrap="on" readonly="readonly" id="log_content3" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"></textarea>
</div>
</div>`;
//显示并开始刷新订阅
function update_service() {
document.body.insertAdjacentHTML('beforeend', modal);
document.getElementsByClassName("modals-bg")[0].classList.remove("hide");
setTimeout(() => {
document.getElementsByClassName("modals")[0].classList.remove("hide");
}, 100);
setTimeout(get_realtime_log, 500);
}
function el(dom_el){
let prefix = document.getElementById("cbi-jd-dailybonus-global").getElementsByClassName("cbi-section-node")[0].id.split("-").pop();
return document.querySelector(`[name='cbid.jd-dailybonus.${prefix}.${dom_el}']`);
}
//保存订阅按钮
document.getElementById("update_service").onclick = () => {
if(el("cookie").value == ""){
alert("请至少填写cookie1");
return false;
}
let json = {
auto_update: el("auto_update").checked?"1":"0",
auto_update_time: el("auto_update").checked?el("auto_update_time").value:"0",
auto_run: el("auto_run").checked?"1":"0",
auto_run_time_h: el("auto_run").checked?el("auto_run_time_h").value:"0",
auto_run_time_m: el("auto_run").checked?el("auto_run_time_m").value:"0",
cookie: el("cookie").value,
cookie2: el("cookie2").value,
stop: el("stop").value,
out: el("out").value,
serverchan: el("serverchan").value,
tg_token: el("tg_token").value,
tg_userid: el("tg_userid").value,
serverurl: el("serverurl").value,
remote_url: el("remote_url").value
}
XHR.get(SAVE_URL, json, (x, d) => {
if (d.error == 0) {
update_service();
} else {
alert("请填写cookies");
}
//手动执行
function run() {
XHR.get(RUN_URL, null, () => {
setTimeout(() => { window.location = LOG_URL }, 500);
});
return false;
}
//获取实时日志
function get_realtime_log() {
XHR.poll(1, LOG_URL, null, x => {
let retArea = document.getElementById("log_content3");
if (x.response.search(" 秒") != -1) {
noChange++;
}
if (noChange > 5) {
location.reload();
}
retArea.value = x.response;
retArea.scrollTop = retArea.scrollHeight;
});
}
//更新脚本
function check_version() {
let btn = document.getElementById("update_script");
@ -326,59 +60,5 @@
return false
}
//初始化二维码
(function(){
let cookieBtn = Array.prototype.slice.call(document.getElementsByClassName("cookie-button"));
try {
qrcode = new QRCode(document.getElementById("qrcode"),
{
text: "sample",
correctLevel: QRCode.CorrectLevel.L
});
cookieBtn.forEach(e => {
e.onclick = () => {
ckid = e.getAttribute("data-rel");
get_code();
return false;
}
});
} catch (error) {
alert("网络离线状态无法使用二维码获取Cookie请刷新后重试")
cookieBtn.forEach(e => {
e.disabled = true;
});
}
}());
//获取二维码
function get_code(){
XHR.get(QRCODE_URL, null, (x,d) => {
document.getElementById("qrcontainer").classList.remove("hidden");
document.getElementById("refresh_qrcode").classList.add("hidden");
qrcode.clear();
qrcode.makeCode(d.qrcode_url);
checkLogin(d.check_url);
});
return false;
}
function checkLogin(check_url){
let cname = ckid == 1?"cookie":"cookie2"
XHR.poll(3, CHECK_LOGIN_URL, { check_url: check_url, id: cname }, (x, d) => {
if (d.error == 0) {
XHR.halt();
XHR._q = [];
document.getElementById("qrcontainer").classList.add("hidden");
document.getElementById("refresh_qrcode").classList.add("hidden");
let prefix_array = document.getElementsByClassName("cbi-input-text")[0].getAttribute("id").split(".")
prefix_array.pop()
let id = `${prefix_array.join(".")}.${cname}`;
document.getElementById(id).value = d.cookie
} else if (d.error == 21 || d.error == 261) {
XHR.halt();
XHR._q = [];
document.getElementById("refresh_qrcode").classList.remove("hidden");
}
});
}
</script>
</script>
<%+cbi/valuefooter%>

View File

@ -1 +1,2 @@
/usr/share/jd-dailybonus/CookieSet.json
/usr/share/jd-dailybonus/CookieSet.json
/usr/share/jd-dailybonus/JD_DailyBonus.js

View File

@ -2,7 +2,7 @@
京东多合一签到脚本
更新时间: 2021.01.20 20:00 v1.91
更新时间: 2021.01.28 18:40 v1.92
有效接口: 40+
脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
电报频道: @NobyDa
@ -908,7 +908,7 @@ function JDUserSign1(s, key, title, body) {
async function JDUserSign2(s, key, title, tid) {
await new Promise(resolve => {
$nobyda.get({
url: `https://jdjoy.jd.com/api/turncard/channel/detail?turnTableId=${tid}`,
url: `https://jdjoy.jd.com/api/turncard/channel/detail?turnTableId=${tid}&invokeKey=yPsq1PHN`,
headers: {
Cookie: KEY
}
@ -920,7 +920,7 @@ async function JDUserSign2(s, key, title, tid) {
return new Promise(resolve => {
setTimeout(() => {
const JDUrl = {
url: 'https://jdjoy.jd.com/api/turncard/channel/sign',
url: 'https://jdjoy.jd.com/api/turncard/channel/sign?invokeKey=yPsq1PHN',
headers: {
Cookie: KEY
},