请教一个问题,腾讯云服务器被封

经大量用户举报,然后服务器被封停,域名前两天被微信封禁了,解封一天后,服务器被封了 这会是啥问题 一个普通 erp 系统,没有什么违法东西

CEBBCAT 1
CEBBCAT 2019-05-28 20:22:53 +08:00
……什么细节都不说等 V 友帮你 debug 啊?
brust 2
brust 2019-05-28 20:27:58 +08:00
@CEBBCAT 1
就是网址被举报
然后腾讯云说被大量用户举报
然后我服务器就被封停了
不过现在解封,所以我很纳闷为什么会被封
opengps 3
opengps 2019-05-28 20:36:38 +08:00
这似乎不是服务器被封,而是网站域名
关于举报,未必是大量用户举报,有些分享特征明显的网站可能有自动识别逻辑,一个人投诉很快就封了
andylsr 4
andylsr 2019-05-28 20:48:23 +08:00 via Android
网站是不是运营性质的,然后用了个人资质?
brust 5
brust 2019-05-28 20:51:02 +08:00
腾讯回我了,网址被跳转到赌博网站了
okwork 6
okwork 2019-05-28 21:07:41 +08:00 via Android
@brust 你的域名怎么会跳赌博网站?你自己没发现吗?是 dns 跳?还是服务器被背后转发了?
brust 7
brust 2019-05-28 21:30:33 +08:00
@okwork 6
dns 跳了
okwork 8
okwork 2019-05-28 21:31:51 +08:00 via Android
@brust dns 哪家服务商解析的?你的登录密码被人破解了吗
brust 9
brust 2019-05-28 21:48:39 +08:00
@okwork 阿里云 dns9.hichina.com
Windelight 10
Windelight 2019-05-28 21:52:30 +08:00 via Android
hichina 是原始回复还是抢答?你自己设置了相关内容否?删除之后用 chinaz 之类的 dns 轮询一下

okwork 11
okwork 2019-05-28 22:54:45 +08:00 via Android
@brust 阿里云的 dns 解析修改,都有操作日志记录的。你可以看到有没有修改日志,这个日志谁都抹不掉的。如果别人改了 dns 解析,只能说明你阿里云的登录账号被盗了。
ningfeng 12
ningfeng 2019-05-28 22:56:12 +08:00
你这不能怪腾讯,他们没做错,要怪只能怪你的“域名解析商”
xiaoz 13
xiaoz 2019-05-28 23:26:29 +08:00 via Android
我觉得可能是你网站被挂马了
brust 14
brust 2019-05-29 09:04:55 +08:00
@okwork 不太清除,对这方面的知识不太懂,那个二级域名我们没有使用的,但是一封就封整个域名,可能是域名解析的问题
brust 15
brust 2019-05-29 09:05:23 +08:00
@ningfeng 12
我很好奇是怎么劫持 DNS 的
brust 16
brust 2019-05-29 09:17:11 +08:00
@Windelight 这个不清楚,我连这个域名解析都是*次上去看,以前是公司有个运维在弄
emeab 17
emeab 2019-05-29 09:38:30 +08:00
没解析一级域名?
brust 18
brust 2019-05-29 10:51:16 +08:00
@emeab 17
没有,我临时删除了
这个域名只用了邮箱和一个二级域名
brust 19
brust 2019-05-29 11:47:25 +08:00
排查到了问题,是 php 背的锅

线程共享全局变量出错

线程共享全局变量出错

解决办法
多任务编程
线程同步: 保证同一时刻只能有一个线程去操作全局变量 。
同步: 就是协同步调,按预定的先后次序进行运行。
线程同步的两种方式:
1、线程等待(join)
2、互斥锁

线程共享全局变量出错的两种解决办法:

方法一:线程等待(join)
利用线程等待,即子线程.join()的方法让当前线程(主线程)等待添加数据的线程执行完成后代码在继续执行

import threading

# 定义一个全局变量
g_num = 0

def first_data():
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1

print(‘*个:’, g_num)

def second_data():
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1

print(‘第二个:’, g_num)

if __name__ == ‘__main__’:
# 创建*个子线程
first_thread = threading.Thread(target=first_data)

# 创建第二个子线程
second_thread = threading.Thread(target=second_data)

first_thread.start()

# 让当前线程(主线程)等待添加数据的线程执行完成后代码再继续执行
first_thread.join()
second_thread.start()

*个: 1000000
第二个: 2000000

方法二:互斥锁
import threading

# 创建锁, Lock 本质上是一个函数,通过调用这个函数可以获取一把互斥锁
lock = threading.Lock()
# 定义一个全局变量
g_num = 0

def first_data():
# 上锁
lock.acquire()
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1

print(‘*个:’, g_num)
# 释放锁
lock.release()

def second_data():
# 上锁
lock.acquire()
for i in range(1000000):
# 声明全局变量
global g_num
g_num += 1

print(‘第二个:’, g_num)
# 释放锁
lock.release()

if __name__ == ‘__main__’:
# 创建*个子线程
first_thread = threading.Thread(target=first_data)
# 创建第二个子线程
second_thread = threading.Thread(target=second_data)

first_thread.start()
second_thread.start()

# 线程等待和互斥锁都是把多任务改成单任务去执行,保证了数据的准确性,但是执行性能会下降.

拓展:使用互斥锁的时候要注意死锁问题。
死锁:等待对方释放锁的状态称为死锁。后面的代码无法正常执行。
下面举个例子:

# 目的: 根据下标在列表中取值, 保证同一时刻只能有一个线程去取值
import threading

# 创建锁
lock = threading.Lock()

def get_value(index):
# 上锁
lock.acquire()
list1 = [1, 3, 5]
# 判断下标是否越界
if index >= len(list1):
print(‘下标越界’, index)
# return 会退出当前函数, 退出前需要释放锁
# lock.release() # 注意要释放锁
return
value = list1[index]
print(value)
# 释放锁
lock.release()

if __name__ == ‘__main__’:
# 循环创建多个子线程
for i in range(10):
sub_thread = threading.Thread(target=get_value, args=(i,))
sub_thread.start()

return前未释放锁:

下标越界 3
return前释放锁:

下标越界 3
下标越界 4
下标越界 5
下标越界 6
下标越界 7
下标越界 8
下标越界 9

python计算运行时间和使用内存

python计算运行时间和使用内存
python计算运行时间
from time import time

start_time = time()
algorithm#需要计算的算法步骤
end_time=time()
elapsed=end_time-start_time
print(elapsed)

python计算运行内存
import os
import psutil

def show_info(self):
#计算消耗内存
pid = os.getpid()
# 模块名比较容易理解:获得当前进程的pid
p = psutil.Process(pid)
# 根据pid找到进程,进而找到占用的内存值
info = p.memory_full_info()
memory = info.uss / 1024 / 1024
return memory
# print(f'{start} 一共占用{memory:.2f}MB’)

start_memory=l.show_info()
algorithm#需要计算的算法步骤
end_memory=l.show_info()
print(f’一共占用{end_memory – start_memory}MB’)

python之闭包函数

python之闭包函数

一、大前提
闭包函数 = 名称空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系是以函数定义阶段为准

二、什么是闭包函数
‘闭’函数指的是该函数是内嵌函数
‘包’函数指的是该函数包含对外层作用域名称的引用(不是对全局作用域)

闭包函数之名称空间与作用域的应用+函数嵌套

def f1():
def f2():
pass
1
2
3
#闭包函数之名称空间与作用域的应用+函数嵌套
def f1():
x = 3333
def f2():
print(x)
f2()

x = 111
def bar():
x = 4444
f1()

def foo():
x = 2222
bar()

foo() # 结果为3333,名称空间!!要一眼看出答案
#该函数仅做到了‘闭’

闭包函数之函数对象

def f1():
x = 333
def f2():
print(‘函数f2’,x)
return f2

f = f1()
print(f)
f()

def foo():
x = 555
f()

foo()

三、闭包函数的应用场景
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参

def f2(x):
print(x)

f2(1)
f2(2)
f2(3)

方式二:

def f1(x):
#x = 3
def f2():
print(x)

return f2
x = f1(1)
print(x)
x()

当今互联网架构流行“微”,“云”

当前互联网流行“微”,“云”两个字。

“微“=小,轻。微内核开发架构。框架更多考虑的是接口标准,采用插件机制实现,平等的对待所有第三那方插件或应用。不易将框架做的太过庞大。

”云“=广。分布式,云计算,云存储等。当今互联网访问量*大。那么我们的应用需要负载均衡,这个就需要集群部署。集群部署的机器可以分布在任何物理地点。这样就形成的一张网,这就是传说中的”云“。其次,对于计算要求高的应用,同样需要多台机器同时计算(这里面有策略的)。

 

提到这里,顺便提一下目前流行的互联网架构。

iaas,(Infrastructure as a Service)基础即服务:如阿里云,提供网络机器(内存,cpu,带宽,硬盘等)可认为是买硬件服务的。

saas,(Software as a Service)软件即服务;如阿里云,提供mysql服务,mysql运行状态无需自己管理,又阿里管理;

paas,(platform as a Service)平台即服务;为第三方应用开发提供部署,发布平台。此平台第三方注册,部署与发布自己的应用;可以监控自己的应用。也就是靠平台赚钱的。

 

作为软件开发者,互联网开发可以底层使用saas,上层应用采用paas平台。中间还有一层资源聚集层。

 

 

以上均为各人从事互联网开发一个多月的愚见!也自我总结一下吧!
————————————————

原文链接:https://blog.csdn.net/weilai201/article/details/84735177

云上架构和传统IT架构的区别在哪里?(企业CIO、CTO必读)

在云计算走向成熟之前,我们更应该关注系统云计算架构的细节,从传统的架构到云上大数据,实现了很多的转变。传统的大数据平台计算和数据一般都在一起,到云上之后计算有可能是虚拟机、有可能是容器,存储和计算是分离的。任何计算节点访问存储时都是通过高速互联网络把数据迁移到本地来。实现的优势也就是大数据的服务化,灵活配置。因此,借助强大的计算性能,结合云计算平台的优势,从传统架构的大数据平台向云上数据的转变,将给用户提供更高的灵活性和管理性,并能够为用户节省大量的成本。

%title插图%num

传统IT架构

传统的IT环境构建是比较复杂的过程。从安装硬件,配置网络,安装软件,应用,配置存储等,许多环节都需要一定的技术力量储备。当环境发生改变时,整个过程需要重复进行。我们都知道,不同的人安装配置的环境会又很大差异。放在复杂的企业环境来考虑,即使有说明,仍然无法保证环境的一致性

云上架构

众所周知,传统服务器包含处理器、存储、网络、电源、风扇等模块设备。与传统服务器相比,云服务器关注的是高性能吞吐量计算能力,关注的是在某段时间内的工作量总和。因此,云服务器在架构上和传统的服务器有着很大的区别。

一般来说,企业的云架构建设主要从6个方面来看,混合云构建、企业级云服务、合规性、安全性、创新性、业务的连续性。以下是阿里云的3个云上经典架构组成供参考
%title插图%num

云上网络基础架构

·
自定义私有网络:子网划分,路由规划

·
网络逻辑隔离:网络虚拟化,VPC之间完全隔离

·
公网访问:弹性IP接入、SNAT/DNAT网关

·
混合云构建:物理专线/*网关实现云上与数据中心互联

·
访问控制:安全组实现不同安全域网络隔离
%title插图%num

云上安全基础架构
·DDos防护
·WEB应用防护
·授权与访问控制
·审计日志记录威胁检测系统
· 安全评测和托管服务
%title插图%num
云上同城异地容灾架构

同城高可用:

自动切换

同城容灾

无需额外成本

异地容灾:

多地域分布

应用和数据级别容灾

优势

云服务器体系架构包含云处理器模块、网络处理模块、存储处理模块与系统模块等。这种架构的优势使得云服务器可以大幅提高利用率。采用多个云处理器完成系统设计,引入低功耗管理方案完成对系统的集中冗余管理,同时优化系统设计,祛除重复硬件。经过高效的资源整合,提高利用率,从而使得性价比得以提升,引起网站服务器租用价格的降低。

云服务器凭借其合理的网站服务器租用价格,为各类企业节省大量的业务成本,从而赢得不少企业的青睐。

但是传统IT架构向云上架构过渡时仍免不了面临许许多多的挑战,IT系统的复杂性、总体拥有的成本问题、业务的连续性、现有应用如何改造、遗留系统与资产等等,都是企业要考虑的问题,值此之际,阿里云河南服务中心面向客户举办阿里云中原行·分享沙龙(郑州站)第二期,邀请阿里云资深技术工程师现场答疑,解构阿里云上技术架构解决方案,帮助企业平滑迁云,业务优化。
————————————————

原文链接:https://blog.csdn.net/aliyunhn/article/details/77480583

基础语法练习2

基础语法练习2

实验3-1
编写程序,输入一个大于2的自然数,输出小于该数字的所有素数组成的集合。
(素数,即质数,指除了1和它本身以外不再有其他因数的自然数。)

import math
n = int(input())
a = set()
for i in range(2, n):
flag = 0
for j in range(2, int(math.sqrt(i)+1)):
if i % j == 0:
flag = 1
break
if flag == 0:
a.add(i)
print(a)

可以使用大括号 { } 或者 set() 函数创建集合。注意k:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
range(2,n),左闭右开,默认步长为1。
判断一个数n是否为素数,只需找因数到√n即可,无需全部遍历。
运行结果
20
{2, 3, 5, 7, 11, 13, 17, 19}

实验3-2
编写程序,输入一个字符串,输出其中出现次数*大的字符及其出现的次数。

s = input()
result = []
mark = {}
for i in s:
if i not in mark:
mark[i] = 1
else:
mark[i] += 1
for key,value in mark.items():
if value == max(mark.values()):
result.append(key)
print(‘出现次数*多的字符 :’,result)
print(‘出现次数 :’,max(mark.values()))

可能存在多个字符出现的*大次数相同,于是用列表result[]存储结果。
用字典mark{}记录出现次数,键为字符,值为出现次数。
items() 方法以列表返回可遍历的(键, 值) 元组数组。values()方法以列表返回字典中的所有值,keys()方法以列表返回字典中的所有键。
运行结果
hello python
出现次数*多的字符 : [‘h’, ‘l’, ‘o’]
出现次数 : 2

实验3-3
制作一个“通讯簿”,其可以存储姓名、电话、邮箱,请编写程序完成这个“通讯簿”的增删改查功能,并且实现文件存储功能。
(仅实现了基础的增删改查功能,未进行输入判断等具体功能)

import json
import os
#用json文件存储字典数据
#以姓名作为键,列表([电话,邮箱])作为值
print(‘>>>添加-1 删除-2 修改-3 查询-4’)
while True:
x = input(‘>>>请输入要进行的操作:’)
#没有文件则新建
if not os.path.exists(‘phonebook.json’):
with open(‘phonebook.json’, ‘w’, encoding=’utf-8′) as file:
phonebook = {}
json.dump(phonebook, file, indent=4, ensure_ascii=False)
#将文件中的数据读到字典phonebook中
with open(‘phonebook.json’, ‘r’, encoding=’utf-8′) as file:
phonebook = dict(json.load(file))
#添加
if x == ‘1’:
name = input(‘姓名:’)
tel = input(‘电话:’)
email = input(‘邮箱:’)
phonebook[name] = [tel, email]
print(‘添加成功!’)
#删除
elif x == ‘2’:
name = input(‘请输入要删除的联系人:’)
if name in phonebook.keys():
del phonebook[name]
print(‘删除成功!’)
else:
print(‘查无此人!’)
#修改
elif x == ‘3’:
name = input(‘请输入要修改的联系人:’)
if name in phonebook.keys():
tel = input(‘电话:’)
email = input(‘邮箱:’)
phonebook[name] = [tel, email]
print(‘修改成功!’)
else:
print(‘查无此人!’)
#查找
elif x == ‘4’:
name = input(‘请输入要查找的联系人:’)
if name in phonebook.keys():
print(‘电话:’ + phonebook[name][0])
print(‘邮箱:’ + phonebook[name][1])
else:
print(‘查无此人!’)
else:
print(‘命令错误!请重新输入’)
print(‘>>>添加-1 删除-2 修改-3 查询-4’)
#将phonebook中的数据写入文件中
with open(‘phonebook.json’, ‘w’, encoding=’utf-8′) as file:
json.dump(phonebook, file, indent=4, ensure_ascii=False)

indent = 4:对json进行数据格式化输出。
json.dumps序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False。
运行数据
1
张三
1321234567
13212345678@qq.com
3
张三
1321234555
13212345555@qq.com
4
张三
2
张三
4
张三
5

运行结果
>>>添加-1 删除-2 修改-3 查询-4
>>>请输入要进行的操作:1
姓名:张三
电话:1321234567
邮箱:13212345678@qq.com
添加成功!
>>>请输入要进行的操作:3
请输入要修改的联系人:张三
电话:1321234555
邮箱:13212345555@qq.com
修改成功!
>>>请输入要进行的操作:4
请输入要查找的联系人:张三
电话:1321234555
邮箱:13212345555@qq.com
>>>请输入要进行的操作:2
请输入要删除的联系人:张三
删除成功!
>>>请输入要进行的操作:4
请输入要查找的联系人:张三
查无此人!
>>>请输入要进行的操作:5
命令错误!请重新输入
>>>添加-1 删除-2 修改-3 查询-4
>>>请输入要进行的操作:

字符串中不同整数的数目

字符串中不同整数的数目

原题指路

字符串中不同整数的数目

题目描述
给你一个字符串 word ,该字符串由数字和小写英文字母组成。

请你用空格替换每个不是数字的字符。例如,”a123bc34d8ef34″ 将会变成 ” 123 34 8 34″ 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):”123″、”34″、”8″ 和 “34” 。

返回对 word 完成替换后形成的 不同 整数的数目。

只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。

解题思路%title插图%num

python里的切片和字典对这题来说简直就是魔法……不然还得自己弄个哈希表,去除前导0等做一系列麻烦的操作。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

代码
class Solution:
def numDifferentIntegers(self, word: str) -> int:
temp = []
for i, ch in enumerate(word): # 遍历字符串并把其中非数字的字符全部变为空格
if ch >= ‘0’ and ch <= ‘9’:
temp.append(ch)
else:
temp.append(‘ ‘)
s = “”.join(temp)
num = [int(n) for n in s.split()] # 借助刚刚生成的空格利用split()新建一个列表
return len(list({}.fromkeys(num).keys())) # 新建字典去重并统计数字个数

 

AcWing 3311.*长算术-Python版

AcWing 3311.*长算术-Python版

*长算术-Python版
题目描述
题目链接:https://www.acwing.com/problem/content/description/3314/

一个算术数组是指至少包含两个整数,且相邻整数之间的差值都相等的整数数组。

例如,[9、10],[3、3、3] 和 [9、7、5、3] 是算术数组,而 [1、3、3、7],[2、1、2],和 [1、2、4] 不是算术数组。

Sarasvati 有一个包含 N 个非负整数的数组,其中的第 i 个整数为 Ai。

她想从数组中选择一个*大长度的连续算术子数组。

请帮助她确定*长的连续算术子数组的长度。

样例
4
7
10 7 4 6 8 10 11
4
9 7 5 3
9
5 5 4 5 5 5 4 5 6
10
5 4 3 2 1 2 3 4 5 6

输出样例
Case #1: 4
Case #2: 4
Case #3: 3
Case #4: 6
1
2
3
4
解题思路
思路描述
首先*短的子序列肯定是2
下标为j;只需要判断[j – 1]-[j]的值和[j]-[j + 1]的值是否相等
若相等,则计数+1
若不相等,则计数重置为0,并把计数结果添加到答案数组中
此处应注意减号两边的顺序不要写反。
*后按格式输出答案数组中的*大值即为答案。
解题代码(Python)
n = int(input())
for i in range(1, n + 1):
m = int(input())
ls = list(map(int, input().split())) # 读取控制台输入的数据并形成列表
c = 2 # 定义*长子序列初始化计数
a = 2 # *长子序列
t = ls[1] – ls[0]
for j in range(1, m – 1): # 循环并判断是否满足条件
if ls[j – 1] – ls[j] == ls[j] – ls[j + 1]:
c += 1
else:
if c > a: # 如果计数值大于*长子序列值,则替换*长子序列的值
a = c
c = 2
if c > a: # 补充判断,防止未进入else语句
a = c
print(f’Case #{i}: {a}’)

求个 smb 浏览器方案

前情提要:迫于贫穷,*终选择打算“安卓手机”smb 访问“电脑 macos”上的视频、相册、音频。

下载了几个 smb 浏览器 apk 好像满足不了我的需求:将远程视频批量加入到手机播放器列表或者按文件夹批量打开相册来浏览

(试了几家浏览器,一个一个文件打开太不舒适了。google baidu 之后无果,有些 apk 下载了之后都用不了。)

第 1 条附言  ·  19 天前

大佬们 有没有打开文件夹相册的啊?按相册打开,点击一下或者划一下就能翻到下一张图片
26 条回复  •  2021-03-15 11:05:02 +08:00
1 yulgang   19 天前   1 playerxtreme kmplayer 试过么
2 Slf4j   19 天前   1 我用的 nplayer
3 no1xsyzy   19 天前 https://github.com/google/samba-documents-provider Google 官方的?通过 storage access framework ( SAF )把 SMB 映射为文件管理器的一个左侧条目。相应地支持 SAF 的播放器就能够直接打开了
4 Hurriance   19 天前   1 我也是用 nplayer 放 mac 上的视频的,就是如果看的片源比较大,*次缓冲要点时间
5 hs0000t   19 天前 via Android   1 kodi,电脑+手机+电视全支持
6 getadoggie   19 天前 是安卓需要 smb 的功能吗,fx 文件浏览器很好,满足需求
7 revalue   19 天前 @getadoggie 对 安卓访问 macos @no1xsyzy 简单看了一下好像不错 @Slf4j @Hurriance 看到字面上是 player 的,应该不支持打开图片相册浏览
8 kisshot   19 天前 @revalue #7 nplayer 妥妥的 更神奇的是 适配安卓电视
9 hutng   18 天前 play 上的 cx 文件管理器,支持 smb 、ftp 、sftp 、webdav,免费好用
10 wanguorui123   18 天前 es 管理器
11 zx900930   18 天前 mixplorer+smb v2 插件
12 IgniteWhite   18 天前 via iPhone 一直用 nplayer 浏览 smb,好用
13 revalue   18 天前 @hutng 我用了啊 应该不能一个口气加入几个视频到播放列表
14 hanguofu   18 天前 es 文件浏览器试过了吗 ?
15 revalue   18 天前 @zx900930 试过免费版 mix 再加自己下载 smb 插件。结果 smb 连接不上,其他 apk app 可以连上。*后还是放弃调试了
16 revalue   18 天前 @hanguofu 木有 听说要找老版本的 es 现在不好找。新版的打开过 简直不堪入目
17 maokabc   18 天前 via Android 要不要试试我写的,*近刚优化 smb2 。https://www.coolapk.com/apk/in.mfile
18 iceheart   18 天前 via Android 视频的话 考虑一下 vlc 安卓版本,开源项目,google play 有下载,也可以自己源码编译,干净清爽无广告
19 imn1   18 天前 x-plorer 文件浏览器 支持 smb,支持图片和音乐的连续播放,长按目录或者多选文件后长按(播放可选外部 APP 或内置播放器) 但视频只能单个
20 jyf007   18 天前 ssh ftp server
21 lovestudykid   18 天前 smb 很多神奇的兼容性问题,不懂为什么那么多人用
22 ji39   18 天前 Android 有发现 smb 的功能吗
23 revalue   18 天前 @lovestudykid 对 我就是发现有些客户端连不上去,有些又可以连
24 revalue   18 天前 @lovestudykid 在传输速度方面 smb 还是比较好的 @ji39 有客户端 app 浏览器自动帮你连接
25 zhilincom   18 天前 我一直使用 ES 文件浏览器,它自带的图片浏览器可以连续滑动浏览图片,只不过它好像只支持 SMB 1.0 的协议。
26 q197   14 天前   1 其实建议搭支持断点续传的 http 服务器配合手机 vlc,这样体验更好。安卓上 smb 使用 es 浏览器我怀疑文件要经过中转,在手机上转两圈,耗电多