update xlnetacc to v1.0.3.7

This commit is contained in:
coolsnowwolf 2018-04-09 17:10:28 +08:00
parent e427a0cb71
commit 6c91a2e106
12 changed files with 487 additions and 378 deletions

View File

@ -1,14 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-xlnetacc
PKG_VERSION:=1.0.0
PKG_RELEASE:=3
PKG_VERSION:=1.0.3
PKG_RELEASE:=7
PKG_LICENSE:=GPLv2
PKG_MAINTAINER:=Sense <sensec@gmail.com>
PKG_BUILD_PARALLEL:=1
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
@ -17,7 +15,7 @@ define Package/$(PKG_NAME)
SUBMENU:=3. Applications
TITLE:=LuCI Support for XLNetAcc
PKGARCH:=all
DEPENDS:=+wget +openssl-util
DEPENDS:=+jshn +wget +openssl-util
endef
define Package/$(PKG_NAME)/description
@ -56,12 +54,12 @@ define Package/$(PKG_NAME)/install
$(INSTALL_DATA) ./files/luci/model/cbi/*.lua $(1)/usr/lib/lua/luci/model/cbi/
$(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/xlnetacc
$(INSTALL_DATA) ./files/luci/view/xlnetacc/*.htm $(1)/usr/lib/lua/luci/view/xlnetacc/
$(INSTALL_DIR) $(1)/www/luci-static/resources/xlnetacc
$(INSTALL_DATA) ./files/luci/luci-static/resources/xlnetacc/*.js $(1)/www/luci-static/resources/xlnetacc/
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/root/etc/config/xlnetacc $(1)/etc/config/xlnetacc
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/root/etc/init.d/xlnetacc $(1)/etc/init.d/xlnetacc
$(INSTALL_DIR) $(1)/etc/hotplug.d/iface
$(INSTALL_BIN) ./files/root/etc/hotplug.d/iface/95-xlnetacc $(1)/etc/hotplug.d/iface/95-xlnetacc
$(INSTALL_DIR) $(1)/etc/uci-defaults
$(INSTALL_BIN) ./files/root/etc/uci-defaults/luci-xlnetacc $(1)/etc/uci-defaults/luci-xlnetacc
$(INSTALL_DIR) $(1)/usr/bin

View File

@ -5,7 +5,7 @@ msgid "XLNetAcc"
msgstr "迅雷快鸟"
msgid "XLNetAcc is a Thunder joint broadband operators launched a commitment to help users solve the low broadband, slow Internet access, poor Internet experience of professional-grade broadband upgrade software."
msgstr "迅雷快鸟是迅雷联合宽带运营商推出的一款致力于帮助用户解决宽带低、网速慢、上网体验差的专业级宽带速软件。"
msgstr "迅雷快鸟是迅雷联合宽带运营商推出的一款致力于帮助用户解决宽带低、网速慢、上网体验差的专业级宽带速软件。"
msgid "Settings"
msgstr "设置"

View File

@ -1,9 +0,0 @@
/*
* A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for more info.
*/
var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(c%32)}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(c%32))&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<((k)%32);p[(((k+64)>>>9)<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn((f&k)|((~f)&j),g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn((f&j)|(k&(~j)),g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|(~j)),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};

File diff suppressed because one or more lines are too long

View File

@ -1,9 +0,0 @@
/*
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
* in FIPS 180-1
* Version 2.2 Copyright Paul Johnston 2000 - 2009.
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
* Distributed under the BSD License
* See http://pajhome.org.uk/crypt/md5 for details.
*/
var hexcase=0;var b64pad="";function hex_sha1(a){return rstr2hex(rstr_sha1(str2rstr_utf8(a)))}function hex_hmac_sha1(a,b){return rstr2hex(rstr_hmac_sha1(str2rstr_utf8(a),str2rstr_utf8(b)))}function sha1_vm_test(){return hex_sha1("abc").toLowerCase()=="a9993e364706816aba3e25717850c26c9cd0d89d"}function rstr_sha1(a){return binb2rstr(binb_sha1(rstr2binb(a),a.length*8))}function rstr_hmac_sha1(c,f){var e=rstr2binb(c);if(e.length>16){e=binb_sha1(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binb_sha1(a.concat(rstr2binb(f)),512+f.length*8);return binb2rstr(binb_sha1(d.concat(g),512+160))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt((a>>>4)&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|((a>>>6)&31),128|(a&63))}else{if(a<=65535){b+=String.fromCharCode(224|((a>>>12)&15),128|((a>>>6)&63),128|(a&63))}else{if(a<=2097151){b+=String.fromCharCode(240|((a>>>18)&7),128|((a>>>12)&63),128|((a>>>6)&63),128|(a&63))}}}}}return b}function rstr2binb(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<(24-c%32)}return a}function binb2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode((b[c>>5]>>>(24-c%32))&255)}return a}function binb_sha1(v,o){v[o>>5]|=128<<(24-o%32);v[((o+64>>9)<<4)+15]=o;var y=Array(80);var u=1732584193;var s=-271733879;var r=-1732584194;var q=271733878;var p=-1009589776;for(var l=0;l<v.length;l+=16){var n=u;var m=s;var k=r;var h=q;var f=p;for(var g=0;g<80;g++){if(g<16){y[g]=v[l+g]}else{y[g]=bit_rol(y[g-3]^y[g-8]^y[g-14]^y[g-16],1)}var z=safe_add(safe_add(bit_rol(u,5),sha1_ft(g,s,r,q)),safe_add(safe_add(p,y[g]),sha1_kt(g)));p=q;q=r;r=bit_rol(s,30);s=u;u=z}u=safe_add(u,n);s=safe_add(s,m);r=safe_add(r,k);q=safe_add(q,h);p=safe_add(p,f)}return Array(u,s,r,q,p)}function sha1_ft(e,a,g,f){if(e<20){return(a&g)|((~a)&f)}if(e<40){return a^g^f}if(e<60){return(a&g)|(a&f)|(g&f)}return a^g^f}function sha1_kt(a){return(a<20)?1518500249:(a<40)?1859775393:(a<60)?-1894007588:-899497514}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return(b<<16)|(c&65535)}function bit_rol(a,b){return(a<<b)|(a>>>(32-b))};

View File

@ -23,18 +23,14 @@ o:depends("logging", "1")
o = s:option(ListValue, "network", translate("Upgrade interface"))
uci:foreach("network", "interface", function(section)
if section[".name"] ~= "loopback" and section[".name"] ~= "lan" then
if section[".name"] ~= "loopback" then
o:value(section[".name"])
end
end)
o = s:option(Value, "account", translate("XLNetAcc account"))
o = s:option(Value, "password", translate("XLNetAcc password"), translate("Does not store the plaintext password, automatically emptied after start."))
o = s:option(Value, "password", translate("XLNetAcc password"))
o.password = true
o.template = "xlnetacc/rsa"
o = s:option(Value, "encrypt", translate("Encrypted password"), translate("Auto-generate in accordance with the plaintext password, do not modify it!"))
--o.readonly = true
return m

View File

@ -1,41 +0,0 @@
<script type="text/javascript" src="<%=resource%>/xlnetacc/md5-min.js"></script>
<!-- <script type="text/javascript" src="<%=resource%>/xlnetacc/sha1-min.js"></script> -->
<script type="text/javascript" src="<%=resource%>/xlnetacc/rsa.js"></script>
<script type="text/javascript">
function onchange_rsa(id) {
cbi_d_update(id);
var password = document.getElementById('cbid.xlnetacc.general.password').value;
if ( password == "" ) {
document.getElementById('cbid.xlnetacc.general.encrypt').value = "";
} else {
var kn = 'AC69F5CCC8BDE47CD3D371603748378C9CFAD2938A6B021E0E191013975AD683F5CBF9ADE8BD7D46B4D2EC2D78AF146F1DD2D50DC51446BB8880B8CE88D476694DFC60594393BEEFAA16F5DBCEBE22F89D640F5336E42F587DC4AFEDEFEAC36CF007009CCCE5C1ACB4FF06FBA69802A8085C2C54BADD0597FC83E6870F1E36FD';
var ke = '010001';
var rsa = new RSAKey();
rsa.setPublic(kn, ke);
var cryptpwd = rsa.encrypt(hex_md5(password));
document.getElementById('cbid.xlnetacc.general.encrypt').value = cryptpwd.toUpperCase();
}
}
</script>
<%+cbi/valueheader%>
<input data-update="change"<%=
attr("id", cbid) ..
attr("name", cbid) ..
attr("type", self.password and "password" or "text") ..
attr("class", self.password and "cbi-input-password" or "cbi-input-text") ..
attr("value", self:cfgvalue(section) or self.default) ..
ifattr(self.size, "size") ..
ifattr(self.placeholder, "placeholder") ..
ifattr(self.readonly, "readonly") ..
ifattr(self.maxlength, "maxlength") ..
ifattr(self.datatype, "data-type", self.datatype) ..
ifattr(self.datatype, "data-optional", self.optional or self.rmempty) ..
ifattr(self.combobox_manual, "data-manual", self.combobox_manual) ..
ifattr(#self.keylist > 0, "data-choices", { self.keylist, self.vallist })
%> onchange="onchange_rsa(this.id)" />
<% if self.password then %><img src="<%=resource%>/cbi/reload.gif" style="vertical-align:middle" title="<%:Reveal/hide password%>" onclick="var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';" /><% end %>
<%+cbi/valuefooter%>

View File

@ -0,0 +1,13 @@
#!/bin/sh
/etc/init.d/xlnetacc enabled || exit 0
[ "$INTERFACE" != "$(uci get xlnetacc.general.network)" ] && exit 0
case "$ACTION" in
ifup)
/etc/init.d/xlnetacc start
;;
ifdown)
/etc/init.d/xlnetacc stop
;;
esac

View File

@ -7,38 +7,42 @@ SERVICE_DAEMONIZE=1
NAME=xlnetacc
start() {
pidof "${NAME}.sh" >/dev/null 2>&1 && return
local retry=1
while pidof "${NAME}.sh" >/dev/null 2>&1; do
[ $retry -ge 10 ] && return 1 || let retry++
sleep 1
done
config_load "$NAME"
config_get_bool enabled "general" "enabled" 0
config_get_bool down_acc "general" "down_acc" 0
config_get_bool up_acc "general" "up_acc" 0
config_get network "general" "network"
config_get account "general" "account"
config_get encrypt "general" "encrypt"
( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$account" -o -z "$encrypt" -o -z "$network" ] ) && return
config_get username "general" "account"
config_get password "general" "password"
( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$username" -o -z "$password" -o -z "$network" ] ) && return 2
logger -p "daemon.notice" -t "$NAME" "XLNetAcc is starting ..."
service_start /usr/bin/${NAME}.sh --start
}
stop() {
pidof "${NAME}.sh" >/dev/null 2>&1 || return
pidof "${NAME}.sh" >/dev/null 2>&1 || return 1
local pid spid
for pid in $(pidof "${NAME}.sh"); do
kill $pid >/dev/null 2>&1
echo "Stop XLNetAcc process PID: $pid"
kill $pid >/dev/null 2>&1
for spid in $(pgrep -P $pid "sleep"); do
kill $spid >/dev/null 2>&1
echo "Stop XLNetAcc process SPID: $spid"
kill $spid >/dev/null 2>&1
done
done
logger -p "daemon.notice" -t "$NAME" "XLNetAcc has stoped."
return 0
}
restart() {
stop
sleep 1
stop && sleep 1
start
}

View File

@ -1,34 +1,36 @@
#!/bin/sh
# 声明常量
readonly appName='com.xunlei.vip.swjsq'
readonly protocolVersion=108
readonly sdkVersion=17550
readonly agentVersion='1.6.1.177600'
readonly packageName='com.xunlei.vip.swjsq'
readonly protocolVersion=200
readonly businessType=68
readonly sdkVersion='2.1.1.177662'
readonly clientVersion='2.4.1.3'
readonly agent_xl="android-async-http/xl-acc-sdk/version-$sdkVersion"
readonly agent_down='okhttp/3.4.1'
readonly agent_up='android-async-http/xl-acc-sdk/version-1.0.0.1'
readonly client_type_down='android-swjsq'
readonly client_version_down='2.0.3.4'
readonly client_type_up='android-uplink'
readonly client_version_up='2.3.3.9'
readonly client_os='android-7.0.24DUK-AL20'
# 声明全局变量
_bind_ip=
_http_cmd=
_http_args=
_devicesign=
_peerid=
_devicesign=
_userid=
_loginkey=
_sessionid=
_api_url_down=
_api_url_up=
_dial_account_down=
_dial_account_up=
_cur_down=
_max_down=
_cur_up=
_max_up=
_portal_down=
_portal_up=
_dial_account=
access_url=
msg_to_en=
msg_to_cn=
http_args=
user_agent=
link_cn=
lasterr=
sequence_xl=1000000
sequence_down=$(( $(date +%s) / 6 ))
sequence_up=$sequence_down
# 包含用于解析 JSON 格式返回值的函数
. /usr/share/libubox/jshn.sh
@ -82,38 +84,34 @@ _log() {
# 清理日志
clean_log() {
[ $logging -eq 1 -a -f "$LOGFILE" ] || return
if [ $(wc -l "$LOGFILE" | awk '{print $1}') -gt 500 ]; then
_log "清理日志文件"
local logdata=$(tail -n 300 "$LOGFILE")
echo "$logdata" > $LOGFILE 2> /dev/null
unset logdata
fi
[ $(wc -l "$LOGFILE" | awk '{print $1}') -le 800 ] && return
_log "清理日志文件"
local logdata=$(tail -n 500 "$LOGFILE")
echo "$logdata" > $LOGFILE 2> /dev/null
unset logdata
}
# 获取接口IP地址
get_acc_ip() {
local acc_ipaddr
get_bind_ip() {
json_cleanup; json_load "$(ubus call network.interface.$network status 2> /dev/null)" >/dev/null 2>&1
json_select "ipv4-address" >/dev/null 2>&1; json_select 1 >/dev/null 2>&1
json_get_var acc_ipaddr "address"
[ -z "$acc_ipaddr" ] && { _log "获取网络 $network IP地址出错"; return; }
_log "acc_ipaddr is $acc_ipaddr" $(( 1 | 4 ))
if [ "$acc_ipaddr" != "0.0.0.0" ]; then
_log "绑定IP地址: $acc_ipaddr"
echo -n "$acc_ipaddr"
json_get_var _bind_ip "address"
if [ -z "$_bind_ip" -o "$_bind_ip"x == "0.0.0.0"x ]; then
_log "获取网络 $network IP地址失败"
return 1
else
_log "绑定IP地址: $_bind_ip"
return 0
fi
}
# 定义基本 HTTP 命令和参数
gen_http_cmd() {
_http_cmd="wget-ssl -nv -t 1 -O - --no-check-certificate"
_http_cmd="$_http_cmd --bind-address=$1"
_http_cmd="$_http_cmd --user-agent=android-async-http/xl-acc-sdk/version-$agentVersion"
_log "_http_cmd is $_http_cmd" $(( 1 | 4 ))
_http_cmd="wget-ssl -nv -t 1 -T 5 -O - --no-check-certificate"
_http_cmd="$_http_cmd --bind-address=$_bind_ip"
}
# 生成设备签名
# 生成设备标识
gen_device_sign() {
local ifname macaddr
while : ; do
@ -126,275 +124,439 @@ gen_device_sign() {
[ -z "$macaddr" ] && { _log "获取网络 $network MAC地址出错"; return; }
macaddr=$(echo -n "$macaddr" | awk '{print toupper($0)}')
# 根据MAC地址生成peerid
readonly _peerid="${macaddr//:/}004V"
# 计算peerID
local fake_peerid=$(awk -F- '{print toupper($5)}' '/proc/sys/kernel/random/uuid')
readonly _peerid="${fake_peerid}004V"
_log "_peerid is $_peerid" $(( 1 | 4 ))
# 根据MAC地址生成devicesign
local xlnetacc_vip="${appName}68700d1872b772946a6940e4b51827e8af"
local fake_device_id_md5=$(echo -n "$macaddr" | md5sum | awk '{print $1}')
local fake_device_id_sha1=$(echo -n "$fake_device_id_md5$xlnetacc_vip" | openssl sha1 -hmac | awk '{print $2}')
readonly _devicesign="div100.$fake_device_id_md5"$(echo -n "$fake_device_id_sha1" | md5sum | awk '{print $1}')
# 计算devicesign
# sign = div.10?.device_id + md5(sha1(packageName + businessType + md5(a protocolVersion specific GUID)))
local fake_device_id=$(echo -n "${macaddr//:/}" | openssl dgst -md5 | awk '{print $2}')
local fake_device_sign=$(echo -n "${fake_device_id}${packageName}${businessType}c7f21687eed3cdb400ca11fc2263c998" \
| openssl dgst -sha1 | awk '{print $2}')
readonly _devicesign="div101.${fake_device_id}"$(echo -n "$fake_device_sign" | openssl dgst -md5 | awk '{print $2}')
_log "_devicesign is $_devicesign" $(( 1 | 4 ))
}
# 帐号登录
xlnetacc_login() {
# 快鸟帐号通用参数
swjsq_json() {
let sequence_xl++
# 生成POST数据
json_init
json_add_string userName "$account"
json_add_int businessType 68
json_add_string clientVersion "$client_version_down"
json_add_string appName "ANDROID-$appName"
json_add_int isCompressed 0
json_add_int sequenceNo 1000001
json_add_string sessionID
json_add_int loginType 0
json_add_object rsaKey
json_add_string e '010001'
json_add_string n 'AC69F5CCC8BDE47CD3D371603748378C9CFAD2938A6B021E0E191013975AD683F5CBF9ADE8BD7D46B4D2EC2D78AF146F1DD2D50DC51446BB8880B8CE88D476694DFC60594393BEEFAA16F5DBCEBE22F89D640F5336E42F587DC4AFEDEFEAC36CF007009CCCE5C1ACB4FF06FBA69802A8085C2C54BADD0597FC83E6870F1E36FD'
json_close_object
json_add_int cmdID 1
json_add_string verifyCode
json_add_string protocolVersion "$protocolVersion"
json_add_string sequenceNo "$sequence_xl"
json_add_string platformVersion '2'
json_add_string isCompressed '0'
json_add_string businessType "$businessType"
json_add_string clientVersion "$clientVersion"
json_add_string peerID "$_peerid"
json_add_int protocolVersion $protocolVersion
json_add_int platformVersion 1
json_add_string passWord "$encrypt"
json_add_string extensionList
json_add_string verifyKey
json_add_int sdkVersion $sdkVersion
json_add_string appName "ANDROID-$packageName"
json_add_string sdkVersion "${sdkVersion##*.}"
json_add_string devicesign "$_devicesign"
json_close_object
local ret=$($_http_cmd 'https://login.mobile.reg2t.sandai.net:443/' --post-data="$(json_dump)")
_log "ret is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno
json_get_var errno "errorCode"
json_get_var _userid "userID"
_log "_userid is $_userid" $(( 1 | 4 ))
json_get_var _sessionid "sessionID"
_log "_sessionid is $_sessionid" $(( 1 | 4 ))
if [ ${errno:=-1} -ne 0 ] || [ -z "$_userid" -o -z "$_sessionid" ]; then
local errorDesc
json_get_var errorDesc "errorDesc"
local outmsg="帐号登录失败。错误代码: ${errno}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 16 | 32 ))
else
local outmsg="帐号登录成功"; _log "$outmsg" $(( 1 | 8 | 16 ))
fi
return $errno
json_add_string deviceModel 'MI'
json_add_string deviceName 'Xiaomi Mi'
json_add_string OSVersion "7.1.1"
}
# 获取提速API
xlnetacc_portal() {
# 帐号登录
swjsq_login() {
swjsq_json
if [ -z "$_userid" -o -z "$_loginkey" ]; then
access_url='https://mobile-login.xunlei.com/login'
json_add_string userName "$username"
json_add_string passWord "$password"
json_add_string verifyKey
json_add_string verifyCode
else
access_url='https://mobile-login.xunlei.com/loginkey'
json_add_string userName "$_userid"
json_add_string loginKey "$_loginkey"
fi
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" "$access_url" --post-data="$(json_dump)")
case $? in
0)
_log "login is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
;;
2) lasterr=-2;;
4) lasterr=-3;;
*) lasterr=-1;;
esac
case ${lasterr:=-1} in
0)
json_get_var _userid "userID"
json_get_var _loginkey "loginKey"
json_get_var _sessionid "sessionID"
_log "_sessionid is $_sessionid" $(( 1 | 4 ))
local outmsg="帐号登录成功"; _log "$outmsg" $(( 1 | 8 ))
;;
15) # 身份信息已失效
_userid=; _loginkey=;;
-1)
local outmsg="帐号登录失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
-2)
local outmsg="Wget 参数解析错误,请更新 GNU Wget"; _log "$outmsg" $(( 1 | 8 | 32 ));;
-3)
local outmsg="Wget 网络通信失败,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
local outmsg="帐号登录失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 帐号注销
swjsq_logout() {
swjsq_json
json_add_string userID "$_userid"
json_add_string sessionID "$_sessionid"
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/logout' --post-data="$(json_dump)")
_log "logout is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
case ${lasterr:=-1} in
0)
_sessionid=
local outmsg="帐号注销成功"; _log "$outmsg" $(( 1 | 8 ));;
-1)
local outmsg="帐号注销失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
local outmsg="帐号注销失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取用户信息
swjsq_getuserinfo() {
[ $1 -eq 1 ] && local _vasid=14 || local _vasid=33
swjsq_json
json_add_string userID "$_userid"
json_add_string sessionID "$_sessionid"
json_add_string vasid "$_vasid"
json_close_object
local ret=$($_http_cmd --user-agent="$agent_xl" 'https://mobile-login.xunlei.com/getuserinfo' --post-data="$(json_dump)")
_log "getuserinfo $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
json_get_var lasterr "errorCode"
[ $1 -eq 1 ] && local outmsg="下行提速会员" || local outmsg="上行提速会员"
case ${lasterr:=-1} in
0)
local index vasid isVip isYear expireDate can_upgrade
json_select "vipList" >/dev/null 2>&1
while : ; do
json_select ${index:=1} >/dev/null 2>&1
[ $? -ne 0 ] && break
json_get_var vasid "vasid"
json_get_var isVip "isVip"
json_get_var isYear "isYear"
json_get_var expireDate "expireDate"
json_select ".." >/dev/null 2>&1
let index++
([ $1 -eq 1 -a ${vasid:-0} -eq 2 ] || [ ${vasid:-0} -eq $_vasid ]) && \
[ ${isVip:-0} -eq 1 -o ${isYear:-0} -eq 1 ] && { can_upgrade=1; break; }
done
if [ ${can_upgrade:-0} -eq 1 ]; then
outmsg="获取${outmsg}信息成功。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}"; \
_log "$outmsg" $(( 1 | $1 * 8 ))
else
if [ ${#expireDate} -ge 8 ]; then
outmsg="${outmsg}已到期。会员到期时间:${expireDate:0:4}-${expireDate:4:2}-${expireDate:6:2}"
else
outmsg="${outmsg}无效"
fi
_log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
fi
;;
-1)
outmsg="获取${outmsg}信息失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local errorDesc; json_get_var errorDesc "errorDesc"
outmsg="获取${outmsg}信息失败。错误代码: ${lasterr}"; \
[ -n "$errorDesc" ] && outmsg="${outmsg},原因: $errorDesc"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取提速入口
swjsq_portal() {
xlnetacc_var $1
[ $1 -eq 1 ] && access_url='http://api.portal.swjsq.vip.xunlei.com:81/v2/queryportal' || \
access_url='http://api.upportal.swjsq.vip.xunlei.com/v2/queryportal'
local ret=$($_http_cmd "$access_url")
_log "$msg_to_en portal is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url")
_log "portal $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno portal_ip portal_port
json_get_var errno "errno"
json_get_var portal_ip "interface_ip"
json_get_var portal_port "interface_port"
json_get_var lasterr "errno"
if [ ${errno:=-1} -ne 0 ] || [ -z "$portal_ip" -o -z "$portal_port" ]; then
local message
json_get_var message "message"
local outmsg="获取${msg_to_cn}API失败。错误代码: ${errno}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
else
local outmsg="获取${msg_to_cn}API成功"; _log "$outmsg" $(( 1 | $1 * 8 ))
if [ $1 -eq 1 ]; then
_api_url_down="http://$portal_ip:$portal_port/v2"
_log "_api_url_down is $_api_url_down" $(( 1 | 4 ))
else
_api_url_up="http://$portal_ip:$portal_port/v2"
_log "_api_url_up is $_api_url_up" $(( 1 | 4 ))
fi
fi
case ${lasterr:=-1} in
0)
local interface_ip interface_port province sp
json_get_var interface_ip "interface_ip"
json_get_var interface_port "interface_port"
json_get_var province "province_name"
json_get_var sp "sp_name"
if [ $1 -eq 1 ]; then
_portal_down="http://$interface_ip:$interface_port/v2"
_log "_portal_down is $_portal_down" $(( 1 | 4 ))
else
_portal_up="http://$interface_ip:$interface_port/v2"
_log "_portal_up is $_portal_up" $(( 1 | 4 ))
fi
local outmsg="获取${link_cn}提速入口成功"; \
[ -n "$province" -a -n "$sp" ] && outmsg="${outmsg}。运营商:${province}${sp}"; _log "$outmsg" $(( 1 | $1 * 8 ))
;;
-1)
local outmsg="获取${link_cn}提速入口失败。迅雷服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "message"
local outmsg="获取${link_cn}提速入口失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
return $errno
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 获取网络带宽信息
xlnetacc_bandwidth() {
isp_bandwidth() {
xlnetacc_var $1
local ret=$($_http_cmd "$access_url/bandwidth?${_http_args}&time_and=$(date +%s)000")
_log "$msg_to_en bandwidth is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/bandwidth?${http_args%&dial_account=*}")
_log "bandwidth $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno can_upgrade dial_account richmessage
json_get_var errno "errno"
json_get_var can_upgrade "can_upgrade"
json_get_var dial_account "dial_account"
json_get_var richmessage "richmessage"
json_get_var lasterr "errno"
# 获取带宽数据
local cur_bandwidth max_bandwidth flag
[ $1 -eq 1 ] && flag="downstream" || flag="upstream"
json_select "bandwidth" >/dev/null 2>&1
json_get_var cur_bandwidth "$flag"
json_select; json_select "max_bandwidth" >/dev/null 2>&1
json_get_var max_bandwidth "$flag"
cur_bandwidth=$(expr $cur_bandwidth / 1024 2> /dev/null)
max_bandwidth=$(expr $max_bandwidth / 1024 2> /dev/null)
case ${lasterr:=-1} in
0)
# 获取带宽数据
local can_upgrade bind_dial_account dial_account stream cur_bandwidth max_bandwidth
[ $1 -eq 1 ] && stream="downstream" || stream="upstream"
json_get_var can_upgrade "can_upgrade"
json_get_var bind_dial_account "bind_dial_account"
json_get_var dial_account "dial_account"
json_select; json_select "bandwidth" >/dev/null 2>&1
json_get_var cur_bandwidth "$stream"
json_select; json_select "max_bandwidth" >/dev/null 2>&1
json_get_var max_bandwidth "$stream"
json_select
cur_bandwidth=$(expr ${cur_bandwidth:-0} / 1024)
max_bandwidth=$(expr ${max_bandwidth:-0} / 1024)
if [ ${errno:=-1} -ne 0 ]; then
local outmsg="获取${msg_to_cn}带宽信息失败。错误代码: ${errno}"; \
[ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
elif [ "$can_upgrade" -eq 0 ]; then
local outmsg="${msg_to_cn}无法提速"; \
[ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
errno=-2
elif [ "$cur_bandwidth" -ge "$max_bandwidth" ]; then
local outmsg="${msg_to_cn}无需提速。当前带宽 ${cur_bandwidth}M超过最大可提升带宽 ${max_bandwidth}M"; \
_log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
errno=-3
else
local outmsg="${msg_to_cn}可以提速。当前带宽 ${cur_bandwidth}M可提升至 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
if [ $1 -eq 1 ]; then
_dial_account_down=$dial_account
_log "_dial_account_down is $_dial_account_down" $(( 1 | 4 ))
_cur_down=$cur_bandwidth
_log "_cur_down is $_cur_down" $(( 1 | 4 ))
_max_down=$max_bandwidth
_log "_max_down is $_max_down" $(( 1 | 4 ))
else
_dial_account_up=$dial_account
_log "_dial_account_up is $_dial_account_up" $(( 1 | 4 ))
_cur_up=$cur_bandwidth
_log "_cur_up is $_cur_up" $(( 1 | 4 ))
_max_up=$max_bandwidth
_log "_max_up is $_max_up" $(( 1 | 4 ))
fi
fi
if [ -n "$bind_dial_account" -a "$bind_dial_account" != "$dial_account" ]; then
local outmsg="绑定宽带账号 $bind_dial_account 与当前宽带账号 $dial_account 不一致,请联系迅雷客服解绑(每月仅一次)"; \
_log "$outmsg" $(( 1 | 8 | 32 ))
down_acc=0; up_acc=0
elif [ $can_upgrade -eq 0 ]; then
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}无法提速"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
elif [ $cur_bandwidth -ge $max_bandwidth ]; then
local outmsg="${link_cn}无需提速。当前带宽 ${cur_bandwidth}M超过最大可提升带宽 ${max_bandwidth}M"; \
_log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
else
if [ -z "$_dial_account" -a -n "$dial_account" ]; then
_dial_account=$dial_account
_log "_dial_account is $_dial_account" $(( 1 | 4 ))
fi
local outmsg="${link_cn}可以提速。当前带宽 ${cur_bandwidth}M可提升至 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
fi
;;
724) # 724 账号存在异常
lasterr=-2
local outmsg="获取${link_cn}网络带宽信息失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
3103) # 3103 线路暂不支持
lasterr=0
local province sp
json_get_var province "province_name"; json_get_var sp "sp_name"
local outmsg="${link_cn}无法提速。原因: ${province}${sp}线路暂不支持"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=0 || up_acc=0
;;
-1)
local outmsg="获取${link_cn}网络带宽信息失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="获取${link_cn}网络带宽信息失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
return $errno
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送带宽提速信号
xlnetacc_upgrade() {
isp_upgrade() {
xlnetacc_var $1
local ret=$($_http_cmd "$access_url/upgrade?${_http_args}&time_and=$(date +%s)000")
_log "$msg_to_en upgrade is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/upgrade?$http_args")
_log "upgrade $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno
json_get_var errno "errno"
json_get_var lasterr "errno"
if [ ${errno:=-1} -ne 0 ]; then
local richmessage
json_get_var richmessage "richmessage"
local outmsg="${msg_to_cn}提速失败。错误代码: ${errno}"; \
[ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $errno -ne -1 ] && { [ $1 -eq 1 ] && down_acc=0 || up_acc=0; }
else
[ $1 -eq 1 ] && local cur_bandwidth=$_cur_down || local cur_bandwidth=$_cur_up
[ $1 -eq 1 ] && local max_bandwidth=$_max_down || local max_bandwidth=$_max_up
local outmsg="${msg_to_cn}提速成功,带宽已从 ${cur_bandwidth}M 提升到 ${max_bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=2 || up_acc=2
fi
case ${lasterr:=-1} in
0)
local bandwidth
json_select "bandwidth" >/dev/null 2>&1
json_get_var bandwidth "downstream"
bandwidth=$(expr ${bandwidth:-0} / 1024)
local outmsg="${link_cn}提速成功,带宽已提升到 ${bandwidth}M"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=2 || up_acc=2
;;
812) # 812 已处于提速状态
lasterr=0
local outmsg="${link_cn}提速成功,当前宽带已处于提速状态"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=2 || up_acc=2
;;
724) # 724 账号存在异常
lasterr=-2
local outmsg="${link_cn}提速失败。原因: 您的账号存在异常,请联系迅雷客服反馈"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
-1)
local outmsg="${link_cn}提速失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}提速失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
return $errno
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送提速心跳信号
xlnetacc_keepalive() {
isp_keepalive() {
xlnetacc_var $1
local ret=$($_http_cmd "$access_url/keepalive?${_http_args}&time_and=$(date +%s)000")
_log "$msg_to_en keepalive is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/keepalive?$http_args")
_log "keepalive $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno
json_get_var errno "errno"
json_get_var lasterr "errno"
if [ ${errno:=-1} -ne 0 ]; then
local richmessage
json_get_var richmessage "richmessage"
local outmsg="${msg_to_cn}提速失效。错误代码: ${errno}"; \
[ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
[ $1 -eq 1 ] && down_acc=1 || up_acc=1
else
_log "${msg_to_cn}心跳信号返回正常"
fi
case ${lasterr:=-1} in
0)
local outmsg="${link_cn}心跳信号返回正常"; _log "$outmsg";;
513) # 513 提速通道不存在
lasterr=-2
local outmsg="${link_cn}提速超时,提速通道不存在"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
-1)
local outmsg="${link_cn}心跳信号发送失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}提速失效。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
return $errno
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 发送带宽恢复信号
xlnetacc_recover() {
isp_recover() {
xlnetacc_var $1
local ret=$($_http_cmd "$access_url/recover?${_http_args}&time_and=$(date +%s)000")
_log "$msg_to_en recover is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/recover?$http_args")
_log "recover $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno
json_get_var errno "errno"
json_get_var lasterr "errno"
if [ ${errno:=-1} -ne 0 ]; then
local richmessage
json_get_var richmessage "richmessage"
local outmsg="${msg_to_cn}带宽恢复失败。错误代码: ${errno}"; \
[ -n "$richmessage" ] && outmsg="${outmsg},原因: $richmessage"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ))
else
_log "${msg_to_cn}带宽已恢复"
[ $1 -eq 1 ] && down_acc=1 || up_acc=1
fi
case ${lasterr:=-1} in
0)
local outmsg="${link_cn}带宽已恢复"; _log "$outmsg" $(( 1 | $1 * 8 ))
[ $1 -eq 1 ] && down_acc=1 || up_acc=1;;
-1)
local outmsg="${link_cn}带宽恢复失败。运营商服务器未响应,请稍候"; _log "$outmsg";;
*)
local message; json_get_var message "richmessage"; [ -z "$message" ] && json_get_var message "message"
local outmsg="${link_cn}带宽恢复失败。错误代码: ${lasterr}"; \
[ -n "$message" ] && outmsg="${outmsg},原因: $message"; _log "$outmsg" $(( 1 | $1 * 8 | 32 ));;
esac
return $errno
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 查询提速信息,未使用
xlnetacc_query() {
isp_query() {
xlnetacc_var $1
local ret=$($_http_cmd "$access_url/query_try_info?${_http_args}&time_and=$(date +%s)000")
_log "$msg_to_en query_try_info is $ret" $(( 1 | 4 ))
local ret=$($_http_cmd --user-agent="$user_agent" "$access_url/query_try_info?$http_args")
_log "query_try_info $1 is $ret" $(( 1 | 4 ))
json_cleanup; json_load "$ret" >/dev/null 2>&1
local errno
json_get_var errno "errno"
json_get_var lasterr "errno"
return $errno
}
# 带宽提速处理
xlnetacc_acc() {
_api_url_down=; _api_url_up=
_dial_account_down=; _dial_account_up=
_cur_down=0; _max_down=0; _cur_up=0; _max_up=0
xlnetacc_portal $1 || return
xlnetacc_bandwidth $1 || return
xlnetacc_upgrade $1
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 设置参数变量
xlnetacc_var() {
if [ $1 -eq 1 ]; then
access_url=$_api_url_down
_http_args="peerid=${_peerid}&userid=${_userid}&user_type=1&sessionid=${_sessionid}&dial_account=${_dial_account_down}&client_type=${client_type_down}-${client_version_down}&client_version=${client_type_down//-/}-${client_version_down}&os=${client_os}"
msg_to_en="DownLink"
msg_to_cn="下行"
let sequence_down++
access_url=$_portal_down
http_args="sequence=${sequence_down}&client_type=${client_type_down}-${clientVersion}&client_version=${client_type_down//-/}-${clientVersion}&chanel=umeng-10900011&time_and=$(date +%s)000"
user_agent=$agent_down
link_cn="下行"
else
access_url=$_api_url_up
_http_args="peerid=${_peerid}&userid=${_userid}&user_type=1&sessionid=${_sessionid}&dial_account=${_dial_account_up}&client_type=${client_type_up}-${client_version_up}&client_version=${client_type_up//-/}-${client_version_up}&os=${client_os}"
msg_to_en="UpLink"
msg_to_cn="上行"
let sequence_up++
access_url=$_portal_up
http_args="sequence=${sequence_up}&client_type=${client_type_up}-${clientVersion}&client_version=${client_type_up//-/}-${clientVersion}"
user_agent=$agent_up
link_cn="上行"
fi
http_args="${http_args}&peerid=${_peerid}&userid=${_userid}&sessionid=${_sessionid}&user_type=1&os=android-7.1.1"
[ -n "$_dial_account" ] && http_args="${http_args}&dial_account=${_dial_account}"
}
# 重试循环
xlnetacc_retry() {
if [ $# -ge 3 -a $3 -ne 0 ]; then
[ $2 -eq 1 -a $down_acc -ne $3 ] && return 0
[ $2 -eq 2 -a $up_acc -ne $3 ] && return 0
fi
local retry=1
while : ; do
lasterr=
eval $1 $2 && break # 成功
[ $# -ge 4 -a $retry -ge $4 ] && break || let retry++ # 重试超时
case $lasterr in
-1) sleep 5s;; # 服务器未响应
-2) break;; # 严重错误
*) sleep 3s;; # 其它错误
esac
done
[ ${lasterr:-0} -eq 0 ] && return 0 || return 1
}
# 注销已登录帐号
xlnetacc_logout() {
[ -z "$_sessionid" ] && return 2
[ $# -ge 1 ] && local retry=$1 || local retry=1
xlnetacc_retry 'isp_recover' 1 2 $retry
xlnetacc_retry 'isp_recover' 2 2 $retry
xlnetacc_retry 'swjsq_logout' 0 0 $retry
[ $down_acc -ne 0 ] && down_acc=1; [ $up_acc -ne 0 ] && up_acc=1
_sessionid=; _dial_account=
[ $lasterr -eq 0 ] && return 0 || return 1
}
# 中止信号处理
sigterm() {
_log "trap sigterm, exit" $(( 1 | 4 ))
[ $down_acc -eq 2 ] && xlnetacc_recover 1
[ $up_acc -eq 2 ] && xlnetacc_recover 2
xlnetacc_logout
rm -f "$down_state_file" "$up_state_file"
exit 0
}
@ -418,41 +580,29 @@ xlnetacc_init() {
up_acc=$(uci_get_by_bool "general" "up_acc" 0)
readonly logging=$(uci_get_by_bool "general" "logging" 1)
readonly verbose=$(uci_get_by_bool "general" "verbose" 0)
readonly network=$(uci_get_by_name "general" "network" "wan")
readonly account=$(uci_get_by_name "general" "account")
readonly encrypt=$(uci_get_by_name "general" "encrypt")
network=$(uci_get_by_name "general" "network" "wan")
readonly username=$(uci_get_by_name "general" "account")
readonly password=$(uci_get_by_name "general" "password")
local enabled=$(uci_get_by_bool "general" "enabled" 0)
local password=$(uci_get_by_name "general" "password")
( [ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$account" -o -z "$encrypt" -o -z "$network" ] ) && return 2
([ $enabled -eq 0 ] || [ $down_acc -eq 0 -a $up_acc -eq 0 ] || [ -z "$username" -o -z "$password" -o -z "$network" ]) && return 2
[ $logging -eq 1 ] && [ ! -d /var/log ] && mkdir -p /var/log
_log "------------------------------"
[ -f "$LOGFILE" ] && _log "------------------------------"
_log "迅雷快鸟正在启动..."
_log "down_acc is $down_acc" $(( 1 | 4 ))
_log "up_acc is $up_acc" $(( 1 | 4 ))
_log "network is $network" $(( 1 | 4 ))
_log "account is $account" $(( 1 | 4 ))
_log "encrypt is $encrypt" $(( 1 | 4 ))
# 检查外部调用工具
command -v wget-ssl >/dev/null || { _log "GNU Wget 工具不存在"; return 3; }
command -v md5sum >/dev/null || { _log "md5sum 工具不存在"; return 3; }
command -v openssl >/dev/null || { _log "openssl 工具不存在"; return 3; }
# 检查明文密码
if [ -n "$password" ]; then
_log "移除已保存的明文密码"
uci delete "${NAME}.general.password"
uci commit "$NAME"
fi
command -v wget-ssl >/dev/null || { _log "GNU Wget 未安装"; return 3; }
local opensslchk=$(echo -n 'openssl' | openssl dgst -sha1 | awk '{print $2}')
[ "$opensslchk" != 'c898fa1e7226427010e329971e82c669f8d8abb4' ] && { _log "openssl-util 未安装或计算错误"; return 3; }
# 捕获中止信号
trap "sigterm" INT
trap "sigterm" TERM
trap 'sigterm' INT # Ctrl-C
trap 'sigterm' QUIT # Ctrl-\
trap 'sigterm' TERM # kill
# 生成设备签名
# 生成设备标识
gen_device_sign
[ -z "$_peerid" -o -z "$_devicesign" ] && return 4
[ ${#_peerid} -ne 16 -o ${#_devicesign} -ne 71 ] && return 4
clean_log
[ -d /var/state ] || mkdir -p /var/state
@ -463,50 +613,58 @@ xlnetacc_init() {
xlnetacc_main() {
while : ; do
# 获取外网IP地址
while : ; do
local bind_ip=$(get_acc_ip)
if [ -z "$bind_ip" ]; then
sleep 5s # 获取失败
else
gen_http_cmd "$bind_ip"
break
fi
done
xlnetacc_retry 'get_bind_ip'
gen_http_cmd
# 帐号登录
# 注销快鸟帐号
xlnetacc_logout 3 && sleep 3s
# 登录快鸟帐号
while : ; do
xlnetacc_login
case $? in
lasterr=
swjsq_login
case $lasterr in
0) break;; # 登录成功
6) sleep 30m;; # 需要输入验证码等待30分钟后重试
-1) sleep 3m;; # 未返回有效数据等待3分钟后重试
-1) sleep 5s;; # 服务器未响应
-2) return 7;; # Wget 参数解析错误
-3) sleep 3s;; # Wget 网络通信失败
6) sleep 130m;; # 需要输入验证码
8) sleep 3m;; # 服务器系统维护
15) sleep 1s;; # 身份信息已失效
*) return 5;; # 登录失败
esac
done
# 10秒检查提速状态300秒发送心跳包
local timer_begin=$(date +%s); local timer_count=
# 获取用户信息
xlnetacc_retry 'swjsq_getuserinfo' 1 1
xlnetacc_retry 'swjsq_getuserinfo' 2 1
[ $down_acc -eq 0 -a $up_acc -eq 0 ] && break
# 获取提速入口
xlnetacc_retry 'swjsq_portal' 1 1
xlnetacc_retry 'swjsq_portal' 2 1
# 获取带宽信息
xlnetacc_retry 'isp_bandwidth' 1 1 10 || { sleep 3m; continue; }
xlnetacc_retry 'isp_bandwidth' 2 1 10 || { sleep 3m; continue; }
[ $down_acc -eq 0 -a $up_acc -eq 0 ] && break
# 带宽提速
xlnetacc_retry 'isp_upgrade' 1 1 10 || { sleep 3m; continue; }
xlnetacc_retry 'isp_upgrade' 2 1 10 || { sleep 3m; continue; }
# 心跳保持
# local retry=1
while : ; do
[ $down_acc -eq 0 -a $up_acc -eq 0 ] && break 2
[ $down_acc -eq 1 ] && xlnetacc_acc 1
[ $up_acc -eq 1 ] && xlnetacc_acc 2
sleep 10s
timer_count=$(( $(date +%s) - $timer_begin ))
[ $timer_count -lt 300 ] && continue
timer_begin=$(date +%s)
clean_log # 清理日志
[ $down_acc -eq 2 ] && { xlnetacc_keepalive 1; [ $? -eq -1 ] && break; }
[ $up_acc -eq 2 ] && { xlnetacc_keepalive 2; [ $? -eq -1 ] && break; }
sleep 10m
# [ $retry -ge 144 ] && break || let retry++ # 心跳最多保持24小时144=24*60/10
xlnetacc_retry 'isp_keepalive' 1 2 5 || break
xlnetacc_retry 'isp_keepalive' 2 2 5 || break
done
[ $down_acc -eq 2 ] && { xlnetacc_recover 1; down_acc=1; }
[ $up_acc -eq 2 ] && { xlnetacc_recover 2; up_acc=1; }
done
_log "程序异常,迅雷快鸟已停止。"
xlnetacc_logout
_log "无法提速,迅雷快鸟已停止。"
return 6
}
# 程序入口
xlnetacc_init $*
[ $? -eq 0 ] && xlnetacc_main
xlnetacc_init "$@" && xlnetacc_main
exit $?