日期: 2021 年 4 月 7 日

全局获取Context技巧

前言:

Android提供了一个Application类,每当应用程序启动的时候,系统就会自动将这个类进行初始化,而我们可以定制一个自己的Application类,以便管理程序内的一些全局状态信息,比如说全局Context。

在android开发中,很多地方都要用到Context上下文这个类对象,比如:弹出 Toast

的时候需要、启动活动的时候需要、发送广播的时候需要、操作数据库的时候需要、使用通

知的时候需要等。

如果是在Activity中,那么获取这个context对象很容易,因为Activity本身就继承Context,直接受用this就可以了。

但是对于比较复杂的逻辑,这些代码没有放在Activity中,那么,获取Context就显得不是那么容易了。

这里告诉大家一个技巧:

Android 提供了一个 Application 类,每当应用程序启动的时候,系统就会自动将这个类

进行初始化。 而我们可以定制一个自己的 Application 类, 以便于管理程序内一些全局的状态信息,比如说全局 Context。

1,新建一个类MyApplication继承Application.

代码如下:

package com.example.networktest;
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
context = getApplicationContext();
}
public static Context getContext() {
return context;
}
}

2,在 AndroidManifest.xml 文件的<application>标签下进行指定就可以了,代码如下所示:

<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”com.example.networktest”
android:versionCode=”1″
android:versionName=”1.0″ >
……
<application
android:name=”com.example.networktest.MyApplication”
…… >
……
</application>
</manifest>

注意:指定 MyApplication 的时候一定要加上完整的包名,不然系统将无法找到这

个类。

这样我们就已经实现了一种全局获取 Context的机制,之后不管你想在项目的任何地方

使用 Context,只需要调用一下 MyApplication.getContext()就可以了。

实现步骤:
1.自定义一个类继承Applicatioon类
public class MyApplication extends Application {

private static Context mContext;

@Override
public void onCreate() {
super.onCreate();
//获取context
mContext = getApplicationContext();
}
//创建一个静态的方法,以便获取context对象
public static Context getContext(){
return mContext;
}
}

2.在Manifest添加一句语句:原因上面说过了
<application
//注意是完整的路劲,我这个是因为前面有一句:package=”com.example.getcontexttest”
android:name=”.util.MyApplication”
…………
</application>

3.自定义一个类,创建一个静态方法,用于验证:
public class GetContext {

public static void toastNews(){

Context context = MyApplication.getContext();
Toast.makeText(context, “hello world”, Toast.LENGTH_SHORT).show();

}
}

*后调用这个方法:
public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

GetContext.toastNews();
}
}

高防服务器哪里好

大品牌商例如阿里云神马的太坑爹了就不考虑了

试过镇江,宿迁,台州的机器,单线电信

试过群英的,试过安徽的,佛山的也试过几个段子,福州 27 的段子也试过

绍兴的部分也试过,嘉兴的部分也试过。

网络质量都不太行啊,能双线三线*好。

来几位 IDC 大神推荐些高防的服务器,主要是做网站用。

配置无所谓,防御能秒解就行

价格 1500 以下

IDC 大神快来吧,小生天天测试服务器已经身心疲惫了。

abel163 1
abel163 2017-03-14 16:00:19 +08:00
福州双线的还行吧
lsido 2
lsido 2017-03-14 19:45:35 +08:00 via Android
@abel163 哪里有卖呢
stevenkang 3
stevenkang 2017-03-15 13:45:34 +08:00
安利一个 ssf.cc
集群 500G 单 100G ,¥ 150/月,八核 /2G/10M/120G
lsido 4
lsido 2017-03-16 07:56:44 +08:00 via Android
@stevenkang 四五互联?这家机器试过了,都是虚的
wtf8888 5
wtf8888 2017-03-19 00:18:45 +08:00
@lsido 一定要国内的?
lsido 6
lsido 2017-03-19 10:50:36 +08:00 via Android
@wtf8888 国外网络更差了
wangzhangwei 7
wangzhangwei 2017-03-19 22:45:25 +08:00
1500 以下租不到合适的哦,我记得以前在广东找灾备机房,光租台机器也得 1500 元 /月,防几十个 G 的双线机房 4 , 5000 左右 /月。建议你就用个阿里云、腾讯云之类的,再找个外地的 IDC 朋友提前说好,一旦有攻击就转移到外地去,等风头过了再转到云上,按天也交不了几个钱的。纯属个人建议。
lsido 8
lsido 2017-03-23 05:49:44 +08:00
@wangzhangwei 好吧…以前可能是一直用云库把网站访问忽略了,转移到机器上,网站访问快多了
duola 9
duola 2017-03-25 20:59:02 +08:00
@ 不知道你试过这个没有,他们号称打不挂, www.kk30.com
lsido 10
lsido 2017-03-27 02:31:40 +08:00 via Android
@duola 快快网络,他自家的还行就是太贵,其他机房都是代售的辣鸡

cuqk 11
cuqk 2018-12-01 21:39:56 +08:00 via Android
请问楼主后来用了哪家服务?
zoenreo 12
zoenreo 2018-12-20 23:23:12 +08:00
徐州高防,妥妥的,联系我就行,可以先测试,QQ:872283896

安卓手机里出现无法删除的 0B 文件怎么办?

如图:

%title插图%num

9 条回复    2021-02-09 17:16:10 +08:00

tiny1994095
    2

tiny1994095   57 天前 via Android

使用不同的文件管理器删除,例如谷歌文件*客,我也出现过。
learningman
    3

learningman   57 天前

试试 chattr -i ?
calloc
    4

calloc   57 天前

下个终端模拟器执行 rm 命令删除
Dox
    5

Dox   57 天前 via iPad

@calloc 请问是手机还是电脑的终端模拟器?具体要怎么操作呢?
calloc
    6

calloc   57 天前   ❤️ 1

@Dox 安装手机版终端模拟器并打开,执行`find /sdcard -name ‘APKPure_ v3.17.16_apkpure.com.apk’`找到该文件所在的目录,在终端模拟器中 cd 到该目录,执行`rm APKPure_ v3.17.16_apkpure.com.apk`
liqingcan
    7

liqingcan   57 天前

这种情况放以前,由于强迫症和洁癖,我会想尽一些办法把这个文件删掉,甚至于回复出厂设置和刷机。
现在:又不占地方,随他去吧,反正又看不到。
Lemeng
    8

Lemeng   57 天前

我的处理方式是删不掉,就懒得管他了
gablic
    9

gablic   56 天前

建议双清

LSI 的 raid 卡都不支持 Non-RAID 吗?

之前一直用 Dell 的服务器,Dell 的 13 代服务器的 raid 卡都支持 Non-RAID,就是可以单独把一些硬盘设置成 Non-RAID,操作系统就可以直接识别到硬盘。
今天跟另外一个服务器提供商聊了一下,他们的 RAID 卡都是用的 LSI 的,说是 LSI 的卡全都不支持,感觉很诧异。不知道有没有使用了解的朋友
第 1 条附言  ·  2017-08-22 12:45:22 +08:00

原来 Dell 的 raid 卡在非 Dell 的服务器上也可以用,这样就好办了,RAID 卡直接用买 Dell h730P
mhycy 2017-08-21 20:14:10 +08:00
老卡都是 IR,IT 模式分开的,只有新卡 LSI 93XX 系列开始才支持混合阵列,记忆中是这样
lydasia 2
lydasia 2017-08-21 20:14:19 +08:00
9201-16i 路过,在 FreeNAS 中服役。。刷 it 固件就行。
lydasia 3
lydasia 2017-08-21 20:16:18 +08:00
单独的话老卡应该都不支持,一楼可能说得对的。不过我已经彻底放弃硬件 RAID 了。
hncqp 4
hncqp 2017-08-21 21:01:34 +08:00
jbod 也是可以的,要么就刷 it 模式了
ovear 5
ovear 2017-08-21 21:01:49 +08:00
有直通卡
一个硬盘你直接打 raid0 呗。。
yanest 6
yanest 2017-08-22 07:02:48 +08:00 via iPhone
@lydasia 直通卡我知道,只是用了直通卡系统盘就没法做 raid1 了,总有些担心。
yanest 7
yanest 2017-08-22 07:04:40 +08:00 via iPhone
@ovear raid0 貌似没办法获取到硬盘的信息,和故障后直接替换
yanest 8
yanest 2017-08-22 07:36:29 +08:00 via iPhone
@mhycy 混合模式在 lsi 的卡上怎么称呼,我只知道 Dell 叫 nonraid,查了 lsi 的 pdf 貌似没有这个说法
yanest 9
yanest 2017-08-22 07:38:10 +08:00 via iPhone
@hncqp jbod 是混合的吗?既有 raid 又有直通?
lydasia 10
lydasia 2017-08-22 08:04:15 +08:00
@yanest 我系统盘是 zfs mirror 的。

lydasia 11
lydasia 2017-08-22 08:09:42 +08:00
http://www.xasun.com/article/e1/2105.html
http://we.poppur.com/thread-2138497-1-1.html

好像是叫 IT/IR 混合?
wxlg1117 12
wxlg1117 2017-08-22 08:57:24 +08:00 via Android
低端是 HBA 卡,有 ir 模式支持不需要 xor 的 raid 模式比如 0-1-10…之类,高端硬 RAID 卡,必须组 raid 吧
mhycy 13
mhycy 2017-08-22 09:01:17 +08:00
@yanest 我还没用过 LSI 原版 93XX 系列的卡。。抱歉了
mhycy 14
mhycy 2017-08-22 09:01:39 +08:00
@wxlg1117 楼主问的不是这个事
fcka 15
fcka 2017-08-22 09:21:43 +08:00 via Android
十二楼正解。便宜的支持,贵的不支持。
hncqp 16
hncqp 2017-08-22 10:37:44 +08:00
@yanest jobd 即直通与 raid 互不干扰(可以选择将 hdd 设置为 jobd 模式或者 raid 模式),当然不是所有卡都有 jobd 模式
yanest 17
yanest 2017-08-22 11:58:48 +08:00 via iPhone
@hncqp 我发现 lsi 原厂卡真是无语,9361 带缓存和 bbu 却不支持 jbod,9341 支持 jbod 不支持缓存。
Dell 同是 3108 主控芯片的 h730 都支持
hncqp 18
hncqp 2017-08-22 16:34:43 +08:00
@yanest 估计刷固件可以解决,没刷过 93 系列的,还在用 92 的

Python 发送短信

Python 发送短信
短信发送平台
在发送短信前需要添加两个配置文件,将下面两个文件复制下来即可
xmltojson.py

“`# -*- coding: utf-8 -*-
# python xml.etree.ElementTree

import xml.etree.ElementTree as ET

# from xml.dom import minidom

class xmltojson:
# global var
# show log
SHOW_LOG = True
# XML file
XML_PATH = None
a = {}
m = []

def get_root(self, path):
”’parse the XML file,and get the tree of the XML file
finally,return the root element of the tree.
if the XML file dose not exist,then print the information”’
# if os.path.exists(path):
# if SHOW_LOG:
# print(‘start to parse the file : [{}]’.format(path))
tree = ET.fromstring(path)
return tree
# else:
# print(‘the path [{}] dose not exist!’.format(path))

def get_element_tag(self, element):
”’return the element tag if the element is not None.”’
if element is not None:

return element.tag
else:
print(‘the element is None!’)

def get_element_attrib(self, element):
”’return the element attrib if the element is not None.”’
if element is not None:

return element.attrib
else:
print(‘the element is None!’)

def get_element_text(self, element):
”’return the text of the element.”’
if element is not None:
return element.text
else:
print(‘the element is None!’)

def get_element_children(self, element):
”’return the element children if the element is not None.”’
if element is not None:

return [c for c in element]
else:
print(‘the element is None!’)

def get_elements_tag(self, elements):
”’return the list of tags of element’s tag”’
if elements is not None:
tags = []
for e in elements:
tags.append(e.tag)
return tags
else:
print(‘the elements is None!’)

def get_elements_attrib(self, elements):
”’return the list of attribs of element’s attrib”’
if elements is not None:
attribs = []
for a in elements:
attribs.append(a.attrib)
return attribs
else:
print(‘the elements is None!’)

def get_elements_text(self, elements):
”’return the dict of element”’
if elements is not None:
text = []
for t in elements:
text.append(t.text)
return dict(zip(self.get_elements_tag(elements), text))
else:
print(‘the elements is None!’)

def main(self, xml):
# root
root = self.get_root(xml)

# children
children = self.get_element_children(root)

children_tags = self.get_elements_tag(children)

children_attribs = self.get_elements_attrib(children)

i = 0

# 获取二级元素的每一个子节点的名称和值
for c in children:
p = 0
c_children = self.get_element_children(c)
dict_text = self.get_elements_text(c_children)
if dict_text:
# print (children_tags[i])
if children_tags[i] == ‘TemplateSMS’:
self.a[‘templateSMS’] = dict_text
else:
if children_tags[i] == ‘SubAccount’:
k = 0

for x in children:
if children_tags[k] == ‘totalCount’:
self.m.append(dict_text)
self.a[‘SubAccount’] = self.m
p = 1
k = k + 1
if p == 0:
self.a[children_tags[i]] = dict_text
else:
self.a[children_tags[i]] = dict_text

else:
self.a[children_tags[i]] = c.text
i = i + 1
return self.a

def main2(self, xml):
# root
root = self.get_root(xml)

# children
children = self.get_element_children(root)

children_tags = self.get_elements_tag(children)

children_attribs = self.get_elements_attrib(children)

i = 0

# 获取二级元素的每一个子节点的名称和值
for c in children:
p = 0
c_children = self.get_element_children(c)
dict_text = self.get_elements_text(c_children)
if dict_text:
if children_tags[i] == ‘TemplateSMS’:
k = 0

for x in children:
if children_tags[k] == ‘totalCount’:
self.m.append(dict_text)
self.a[‘TemplateSMS’] = self.m
p = 1
k = k + 1
if p == 0:
self.a[children_tags[i]] = dict_text
else:
self.a[children_tags[i]] = dict_text

else:
self.a[children_tags[i]] = c.text
i = i + 1
return self.a

CCPRestSDK.py

# -*- coding: UTF-8 -*-
# Copyright (c) 2014 The CCP project authors. All Rights Reserved.
#
# Use of this source code is governed by a Beijing Speedtong Information Technology Co.,Ltd license
# that can be found in the LICENSE file in the root of the web site.
#
# http://www.yuntongxun.com
#
# An additional intellectual property rights grant can be found
# in the file PATENTS. All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import base64
import datetime
import json
from hashlib import md5
from urllib import request as urllib2

from .xmltojson import xmltojson

class REST:
AccountSid = ”
AccountToken = ”
AppId = ”
SubAccountSid = ”
SubAccountToken = ”
ServerIP = ”
ServerPort = ”
SoftVersion = ”
Iflog = False # 是否打印日志
Batch = ” # 时间戳
BodyType = ‘xml’ # 包体格式,可填值:json 、xml

# 初始化
# @param serverIP 必选参数 服务器地址
# @param serverPort 必选参数 服务器端口
# @param softVersion 必选参数 REST版本号
def __init__(self, ServerIP, ServerPort, SoftVersion):

self.ServerIP = ServerIP
self.ServerPort = ServerPort
self.SoftVersion = SoftVersion

# 设置主帐号
# @param AccountSid 必选参数 主帐号
# @param AccountToken 必选参数 主帐号Token

def setAccount(self, AccountSid, AccountToken):
self.AccountSid = AccountSid
self.AccountToken = AccountToken

# 设置子帐号
#
# @param SubAccountSid 必选参数 子帐号
# @param SubAccountToken 必选参数 子帐号Token

def setSubAccount(self, SubAccountSid, SubAccountToken):
self.SubAccountSid = SubAccountSid
self.SubAccountToken = SubAccountToken

# 设置应用ID
#
# @param AppId 必选参数 应用ID

def setAppId(self, AppId):
self.AppId = AppId

def log(self, url, body, data):
print(‘这是请求的URL:’)
print(url)
print(‘这是请求包体:’)
print(body)
print(‘这是响应包体:’)
print(data)
print(‘********************************’)

# 创建子账号
# @param friendlyName 必选参数 子帐号名称
def CreateSubAccount(self, friendlyName):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/SubAccounts?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)
# xml格式
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><SubAccount><appId>%s</appId>\
<friendlyName>%s</friendlyName>\
</SubAccount>\
”’ % (self.AppId, friendlyName)

if self.BodyType == ‘json’:
# json格式
body = ”'{“friendlyName”: “%s”, “appId”: “%s”}”’ % (friendlyName, self.AppId)
data = ”
req.data = body.encode()
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 获取子帐号
# @param startNo 可选参数 开始的序号,默认从0开始
# @param offset 可选参数 一次查询的*大条数,*小是1条,*大是100条
def getSubAccounts(self, startNo, offset):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/GetSubAccounts?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
# auth = base64.encodestring(src).strip()
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)
# xml格式
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><SubAccount><appId>%s</appId>\
<startNo>%s</startNo><offset>%s</offset>\
</SubAccount>\
”’ % (self.AppId, startNo, offset)

if self.BodyType == ‘json’:
# json格式
body = ”'{“appId”: “%s”, “startNo”: “%s”, “offset”: “%s”}”’ % (self.AppId, startNo, offset)
data = ”
req.data = body.encode()
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 子帐号信息查询
# @param friendlyName 必选参数 子帐号名称

def querySubAccount(self, friendlyName):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/QuerySubAccountByName?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
# auth = base64.encodestring(src).strip()
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)

req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><SubAccount><appId>%s</appId>\
<friendlyName>%s</friendlyName>\
</SubAccount>\
”’ % (self.AppId, friendlyName)
if self.BodyType == ‘json’:
body = ”'{“friendlyName”: “%s”, “appId”: “%s”}”’ % (friendlyName, self.AppId)
data = ”
req.data = body.encode()
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 发送模板短信
# @param to 必选参数 短信接收彿手机号码集合,用英文逗号分开
# @param datas 可选参数 内容数据
# @param tempId 必选参数 模板Id
def sendTemplateSMS(self, to, datas, tempId):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/SMS/TemplateSMS?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
# auth = base64.encodestring(src).strip()
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)
# 创建包体
b = ”
for a in datas:
b += ‘<data>%s</data>’ % (a)

body = ‘<?xml version=”1.0″ encoding=”utf-8″?><SubAccount><datas>’ + b + ‘</datas><to>%s</to><templateId>%s</templateId><appId>%s</appId>\
</SubAccount>\
‘ % (to, tempId, self.AppId)
if self.BodyType == ‘json’:
# if this model is Json ..then do next code
b = ‘[‘
for a in datas:
b += ‘”%s”,’ % (a)
b += ‘]’
body = ”'{“to”: “%s”, “datas”: %s, “templateId”: “%s”, “appId”: “%s”}”’ % (to, b, tempId, self.AppId)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 外呼通知
# @param to 必选参数 被叫号码
# @param mediaName 可选参数 语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。
# @param mediaTxt 可选参数 文本内容
# @param displayNum 可选参数 显示的主叫号码
# @param playTimes 可选参数 循环播放次数,1-3次,默认播放1次。
# @param respUrl 可选参数 外呼通知状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。
# @param userData 可选参数 用户私有数据
# @param maxCallTime 可选参数 *大通话时长
# @param speed 可选参数 发音速度
# @param volume 可选参数 音量
# @param pitch 可选参数 音调
# @param bgsound 可选参数 背景音编号

def landingCall(self, to, mediaName, mediaTxt, displayNum, playTimes, respUrl, userData, maxCallTime, speed, volume,
pitch, bgsound):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/Calls/LandingCalls?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
# auth = base64.encodestring(src).strip()
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><LandingCall>\
<to>%s</to><mediaName>%s</mediaName><mediaTxt>%s</mediaTxt><appId>%s</appId><displayNum>%s</displayNum>\
<playTimes>%s</playTimes><respUrl>%s</respUrl><userData>%s</userData><maxCallTime>%s</maxCallTime><speed>%s</speed>
<volume>%s</volume><pitch>%s</pitch><bgsound>%s</bgsound></LandingCall>\
”’ % (
to, mediaName, mediaTxt, self.AppId, displayNum, playTimes, respUrl, userData, maxCallTime, speed, volume,
pitch, bgsound)
if self.BodyType == ‘json’:
body = ”'{“to”: “%s”, “mediaName”: “%s”,”mediaTxt”: “%s”,”appId”: “%s”,”displayNum”: “%s”,”playTimes”: “%s”,”respUrl”: “%s”,”userData”: “%s”,”maxCallTime”: “%s”,”speed”: “%s”,”volume”: “%s”,”pitch”: “%s”,”bgsound”: “%s”}”’ % (
to, mediaName, mediaTxt, self.AppId, displayNum, playTimes, respUrl, userData, maxCallTime, speed,
volume,
pitch, bgsound)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 语音验证码
# @param verifyCode 必选参数 验证码内容,为数字和英文字母,不区分大小写,长度4-8位
# @param playTimes 可选参数 播放次数,1-3次
# @param to 必选参数 接收号码
# @param displayNum 可选参数 显示的主叫号码
# @param respUrl 可选参数 语音验证码状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知
# @param lang 可选参数 语言类型
# @param userData 可选参数 第三方私有数据

def voiceVerify(self, verifyCode, playTimes, to, displayNum, respUrl, lang, userData):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/Calls/VoiceVerify?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
# auth = base64.encodestring(src).strip()
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)

req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><VoiceVerify>\
<appId>%s</appId><verifyCode>%s</verifyCode><playTimes>%s</playTimes><to>%s</to><respUrl>%s</respUrl>\
<displayNum>%s</displayNum><lang>%s</lang><userData>%s</userData></VoiceVerify>\
”’ % (self.AppId, verifyCode, playTimes, to, respUrl, displayNum, lang, userData)
if self.BodyType == ‘json’:
# if this model is Json ..then do next code
body = ”'{“appId”: “%s”, “verifyCode”: “%s”,”playTimes”: “%s”,”to”: “%s”,”respUrl”: “%s”,”displayNum”: “%s”,”lang”: “%s”,”userData”: “%s”}”’ % (
self.AppId, verifyCode, playTimes, to, respUrl, displayNum, lang, userData)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# IVR外呼
# @param number 必选参数 待呼叫号码,为Dial节点的属性
# @param userdata 可选参数 用户数据,在<startservice>通知中返回,只允许填写数字字符,为Dial节点的属性
# @param record 可选参数 是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性

def ivrDial(self, number, userdata, record):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch;
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/ivr/dial?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
req.add_header(“Accept”, “application/xml”)
req.add_header(“Content-Type”, “application/xml;charset=utf-8”)
req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?>
<Request>
<Appid>%s</Appid>
<Dial number=”%s” userdata=”%s” record=”%s”></Dial>
</Request>
”’ % (self.AppId, number, userdata, record)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 话单下载
# @param date 必选参数 day 代表前一天的数据(从00:00 – 23:59),目前只支持按天查询
# @param keywords 可选参数 客户的查询条件,由客户自行定义并提供给云通讯平台。默认不填忽略此参数
def billRecords(self, date, keywords):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/BillRecords?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><BillRecords>\
<appId>%s</appId><date>%s</date><keywords>%s</keywords>\
</BillRecords>\
”’ % (self.AppId, date, keywords)
if self.BodyType == ‘json’:
# if this model is Json ..then do next code
body = ”'{“appId”: “%s”, “date”: “%s”,”keywords”: “%s”}”’ % (self.AppId, date, keywords)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()

res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 主帐号信息查询

def queryAccountInfo(self):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/AccountInfo?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
body = ”
req.add_header(“Authorization”, auth)
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 短信模板查询
# @param templateId 必选参数 模板Id,不带此参数查询全部可用模板

def QuerySMSTemplate(self, templateId):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/SMS/QuerySMSTemplate?sig=” + sig
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)

req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><Request>\
<appId>%s</appId><templateId>%s</templateId></Request>
”’ % (self.AppId, templateId)
if self.BodyType == ‘json’:
# if this model is Json ..then do next code
body = ”'{“appId”: “%s”, “templateId”: “%s”}”’ % (self.AppId, templateId)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main2(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 呼叫结果查询
# @param callsid 必选参数 呼叫ID

def CallResult(self, callSid):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/CallResult?sig=” + sig + “&callsid=” + callSid
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
body = ”
req.add_header(“Authorization”, auth)
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()
res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 呼叫状态查询
# @param callid 必选参数 一个由32个字符组成的电话唯一标识符
# @param action 可选参数 查询结果通知的回调url地址
def QueryCallState(self, callid, action):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/ivr/call?sig=” + sig + “&callid=” + callid
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
self.setHttpHeader(req)
req.add_header(“Authorization”, auth)

# 创建包体
body = ”'<?xml version=”1.0″ encoding=”utf-8″?><Request>\
<Appid>%s</Appid><QueryCallState callid=”%s” action=”%s”/>\
</Request>\
”’ % (self.AppId, callid, action)
if self.BodyType == ‘json’:
# if this model is Json ..then do next code
body = ”'{“Appid”:”%s”,”QueryCallState”:{“callid”:”%s”,”action”:”%s”}}”’ % (self.AppId, callid, action)
req.data = body.encode()
data = ”
try:
res = urllib2.urlopen(req)
data = res.read()

res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 语音文件上传
# @param filename 必选参数 文件名
# @param body 必选参数 二进制串
def MediaFileUpload(self, filename, body):

self.accAuth()
nowdate = datetime.datetime.now()
self.Batch = nowdate.strftime(“%Y%m%d%H%M%S”)
# 生成sig
signature = self.AccountSid + self.AccountToken + self.Batch
sig = md5(signature.encode()).hexdigest().upper()
# 拼接URL
url = “https://” + self.ServerIP + “:” + self.ServerPort + “/” + self.SoftVersion + “/Accounts/” + self.AccountSid + “/Calls/MediaFileUpload?sig=” + sig + “&appid=” + self.AppId + “&filename=” + filename
# 生成auth
src = self.AccountSid + “:” + self.Batch
auth = base64.encodebytes(src.encode()).decode().strip()
req = urllib2.Request(url)
req.add_header(“Authorization”, auth)
if self.BodyType == ‘json’:
req.add_header(“Accept”, “application/json”)
req.add_header(“Content-Type”, “application/octet-stream”)

else:
req.add_header(“Accept”, “application/xml”)
req.add_header(“Content-Type”, “application/octet-stream”)

# 创建包体
req.data = body.encode()

try:
res = urllib2.urlopen(req)
data = res.read()

res.close()

if self.BodyType == ‘json’:
# json格式
locations = json.loads(data)
else:
# xml格式
xtj = xmltojson()
locations = xtj.main(data)
if self.Iflog:
self.log(url, body, data)
return locations
except Exception as error:
if self.Iflog:
self.log(url, body, data)
return {‘172001’: ‘网络错误’}

# 子帐号鉴权
def subAuth(self):
if (self.ServerIP == “”):
print(‘172004’)
print(‘IP为空’)

if (int(self.ServerPort) <= 0):
print(‘172005’)
print(‘端口错误(小于等于0)’)

if (self.SoftVersion == “”):
print(‘172013’)
print(‘版本号为空’)

if (self.SubAccountSid == “”):
print(‘172008’)
print(‘子帐号为空’)

if (self.SubAccountToken == “”):
print(‘172009’)
print(‘子帐号令牌为空’)

if (self.AppId == “”):
print(‘172012’)
print(‘应用ID为空’)

# 主帐号鉴权
def accAuth(self):
if (self.ServerIP == “”):
print(‘172004’)
print(‘IP为空’)

if (int(self.ServerPort) <= 0):
print(‘172005’)
print(‘端口错误(小于等于0)’)

if (self.SoftVersion == “”):
print(‘172013’)
print(‘版本号为空’)

if (self.AccountSid == “”):
print(‘172006’)
print(‘主帐号为空’)

if (self.AccountToken == “”):
print(‘172007’)
print(‘主帐号令牌为空’)

if (self.AppId == “”):
print(‘172012’)
print(‘应用ID为空’)

# 设置包头
def setHttpHeader(self, req):
if self.BodyType == ‘json’:
req.add_header(“Accept”, “application/json”)
req.add_header(“Content-Type”, “application/json;charset=utf-8”)

else:
req.add_header(“Accept”, “application/xml”)
req.add_header(“Content-Type”, “application/xml;charset=utf-8”)

下面就是我们要发送短信需要配置的内容,内容在短信发送平台

# -*- coding:utf-8 -*-

# from .CCPRestSDK import REST
from libs.yuntongxun.CCPRestSDK import REST

# 说明:主账号,登陆云通讯网站后,可在”控制台-应用”中看到开发者主账号ACCOUNT SID
_accountSid = ‘8a216da8***************636c9’

# 说明:主账号Token,登陆云通讯网站后,可在控制台-应用中看到开发者主账号AUTH TOKEN
_accountToken = ‘a064092********************8c2’

# 请使用管理控制台首页的APPID或自己创建应用的APPID
_appId = ‘8a216d***************536cf’

# 说明:请求地址,生产环境配置成app.cloopen.com
_serverIP = ‘app.cloopen.com’

# 说明:请求端口 ,生产环境为8883
_serverPort = “8883”

# 说明:REST API版本号保持不变
_softVersion = ‘2013-12-26′

# 云通讯官方提供的发送短信代码实例
# # 发送模板短信
# # @param to 手机号码
# # @param datas 内容数据 格式为数组 例如:{’12’,’34’},如不需替换请填 ”
# # @param $tempId 模板Id
#
# def sendTemplateSMS(to, datas, tempId):
# # 初始化REST SDK
# rest = REST(serverIP, serverPort, softVersion)
# rest.setAccount(accountSid, accountToken)
# rest.setAppId(appId)
#
# result = rest.sendTemplateSMS(to, datas, tempId)
# for k, v in result.iteritems():
#
# if k == ‘templateSMS’:
# for k, s in v.iteritems():
# print ‘%s:%s’ % (k, s)
# else:
# print ‘%s:%s’ % (k, v)

class CCP(object):
“””发送短信的辅助类”””

def __new__(cls, *args, **kwargs):
# 判断是否存在类属性_instance,_instance是类CCP的唯一对象,即单例
if not hasattr(CCP, “_instance”):
cls._instance = super(CCP, cls).__new__(cls, *args, **kwargs)
cls._instance.rest = REST(_serverIP, _serverPort, _softVersion)
cls._instance.rest.setAccount(_accountSid, _accountToken)
cls._instance.rest.setAppId(_appId)
return cls._instance

def send_template_sms(self, to, datas, temp_id):
“””发送模板短信”””
# @param to 手机号码
# @param datas 内容数据 格式为数组 例如:{’12’,’34’},如不需替换请填 ”
# @param temp_id 模板Id
result = self.rest.sendTemplateSMS(to, datas, temp_id)
# 如果云通讯发送短信成功,返回的字典数据result中statuCode字段的值为”000000″
# if result.get(“statusCode”) == “000000”:
# # 返回0 表示发送短信成功
# return 0
# else:
# # 返回-1 表示发送失败
# return -1

if __name__ == ‘__main__’:
ccp = CCP()
# 注意: 测试的短信模板编号为1
# 参数1: 给谁发 手机号
# 参数2: 【云通讯】您使用的是云通讯短信模板,您的验证码是{1},请于{2}分钟内正确输入
# 参数3: 模板号 ,默认我们选1
from random import randint

# 随机一个六位数的随机码
sms_code = ‘%06d’ % randint(0, 999999)
print(sms_code)
ccp.send_template_sms(‘***********’, [sms_code, 5], 1)

主流应用服务器

JBoss 含有 Jsp 和 Servlet 容器 , 也就可以做 web 容器 , 也包含 EJB 容器 , 是完整的 J2EE 应用服务器
JBoss  是一个运行 EJB 的 J2EE 应用服务器。它是开放源代码的项目,遵循*新的 J2EE 规范。从 JBoss 项目开始至今,它已经从一个 EJB 容器发展成为一个基于的 J2EE 的一个 web 操作系统( operating systemfor&nbsp;web ),它体现了 J2EE 规范中*新的技术,含有 Jsp 和 Servlet 容器 , 也就可以做 web 容器 , 也包含 EJB 容器 , 是完整的 J2EE 应用服务器 .

Weblogic 是 BEA 公司的产品,是用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器
WebLogic 是用于开发、集成、部署和管理大型分布式 Web 应用、   网络应用和数据库应
用的 Java 应用服务器。将 Java 的动态功能和 Java Enterprise 标准的安全性引入大型网络应用的
开发、集成、部署和管理之中。
Websphere是IBM公司的产品,基于J2EE的,对Jsp,Servlet,ejb的支持非常好!不过挺复杂的!
WebSphere 是随需应变的电子商务时代的*主要的软件平台。它使您的公司可以开发、部署和整合新一代的电子商务应用,如B2B 电子商务,并支持从简单的网页内容发布到企业级事务处理的商业应用,含有Jsp和Servlet容器,也就可以做web容器,也包含EJB容器,是完整的J2EE应用服务器

 

IIS是微软的Internet Information Server的简称!主要是用来提供Web服务的,当然是针对它自己的产品asp的。什么是IIS?
首先,Internet Information Server的缩写为(IIS)是一个World Wide Web server。Gopher server和FTP server全部包容在里面。IIS意味着你能发布网页,并且有ASP(Active Server Pages)、JAVA、VBscript产生页面,有着一些扩展功能。IIS支持一些有趣的东西,象有编辑环境的界面(FRONTPAGE)、有全文检索功能的(INDEX SERVER)、有多媒体功能的(NET SHOW)
其次,IIS是随Windows NT Server 4.0一起提供的文件和应用程序服务器,是在Windows NT Server上建立Internet服务器的基本组件。它与Windows NT Server完全集成,允许使用Windows NT Server内置的安全性以及NTFS文件系统建立强大灵活的Internet/Intranet站点。

 

Tomcat含有Jsp和Servlet容器,但不包含EJB容器
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器
Tomcat 是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,*新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持*新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

 

Apache是世界使用排名*的Web服务器。它可以运行在几乎所有广泛使用的计算机平台上。
Apache 源于NCSAhttpd服务器,经过多次修改,成为世界上*流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
本来它只用于小型或试验Internet网络,后来逐步扩充到各种Unix系统中,尤其对Linux的支持相当完美。Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的*多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面

WEB应用服务器都有哪些?

下面介绍几种常用的WEB服务器:
Microsoft的 IIS 服务器
Microsoft的Web服务器产品为Internet Information Server (IIS), IIS 是允许在公共Intranet或Internet上发布信息的Web服务器。IIS是目前*流行的Web服务器产品之一,很多著名的网站都是建立在IIS的平台上。IIS提供了一个图形界面的管理工具,称为 Internet服务管理器,可用于监视配置和控制Internet服务。
IIS是一种Web服务组件,其中包括Web服务器、FTP服务器、NNTP服务器和SMTP服务器,分别用于网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域网)上发布信息成了一件很容易的事。它提供ISAPI(Intranet Server API)作为扩展Web服务器功能的编程接口;同时,它还提供一个Internet数据库连接器,可以实现对数据库的查询和更新。
官方网站:http://www.microsoft.com
下载地址:http://www.eryin.com/Server/Soft/200808/02257.html

IBM的 WebSphere 服务器
WebSphere Application Server 是 一 种功能完善、开放的Web应用程序服务器,是IBM电子商务计划的核心部分,它是基于 Java 的应用环境,用于建立、部署和管理 Internet 和 Intranet Web 应用程序。 这一整套产品进行了扩展,以适应 Web 应用程序服务器的需要,范围从简单到高级直到企业级。
WebSphere 针对以 Web 为中心的开发人员,他们都是在基本 HTTP服务器和 CGI 编程技术上成长起来的。IBM 将提供 WebSphere 产品系列,通过提供综合资源、可重复使用的组件、功能强大并易于使用的工具、以及支持 HTTP 和 IIOP 通信的可伸缩运行时环境,来帮助这些用户从简单的 Web 应用程序转移到电子商务世界。
官方网站:http://www.ibm.com
下载地址:http://www.ibm.com/developerworks/cn/downloads/ws/wasce/

BEA的 WebLogic 服务器
BEA WebLogic Server 是一种多功能、基于标准的web应用服务器,为企业构建自己的应用提供了坚实的基础。各种应用开发、部署所有关键性的任务,无论是集成各种系统和数据库,还是提交服务、跨 Internet 协作,起始点都是 BEA WebLogic Server。由于 它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开发,基于 Internet 的企业都选择它来开发、部署*佳的应用。
BEA WebLogic Server 在使应用服务器成为企业应用架构的基础方面继续处于*地位。BEA WebLogic Server 为构建集成化的企业级应用提供了稳固的基础,它们以 Internet 的容量和速度,在连网的企业之间共享信息、提交服务,实现协作自动化。
官方网站:http://www.bea.com
下载地址:http://www.oracle.com/bea/index.html

Apache 服务器
Apache仍然是世界上用的*多的Web服务器,市场占有率达60%左右。它源于NCSAhttpd服务器,当NCSA WWW服务器项目停止后,那些使用NCSA WWW服务器的人们开始交换用于此服务器的补丁,这也是apache名称的由来(pache 补丁)。世界上很多著名的网站都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
官方网站:http://www.apache.org
下载地址:http://www.eryin.com/Server/Soft/200808/01245.html

Tomcat 服务器
Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比*大多数商业应用软件服务器要好。
Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是完全重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版号的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此目前许多WEB服务器都是采用Tomcat。

有么有不用 PC 端就能 root 的 APP?

现在因测试需要,需要把手机 root,手机型号是小米 8,我网上找了一下,都是需要在 PC 断安装软件的,但这种软件我不敢往电脑上装。。就怕装了就卸载不了了

有没有 APP 能 root 的,因为手机是公司的测试用手机,不管啥 APP 都可以装

 

50 条回复    2021-02-14 22:27:53 +08:00
divilkcvf
    1

divilkcvf   57 天前   ❤️ 2

……无力吐槽
madao2015
    2

madao2015   57 天前   ❤️ 1

虚拟机
Microkernel
    3

Microkernel   57 天前

看来你对 Android 机应该怎么 root 还完全没概念。。给你两个方向自己查下吧 MIUI 开发版、Magisk
HarryQu
    4

HarryQu   57 天前

小米官方支持解锁 Bootloader,你可以自己刷开发版。
mgrddsj
    5

mgrddsj   57 天前   ❤️ 5

以前 Android 4 时代的那些一键 root (不管是需要 PC 端的还是不用 PC 端的)都是通过系统漏洞实现的,现在已经很少这样的系统漏洞了。而且那些一键 root (比如臭名昭著的 KingRoot )会在手机上安装很难删掉的流氓软件。
想 root 的话建议还是解锁 bootloader,刷 recovery,然后自己刷入 SuperSu/Magisk 之类的。这些教程应该在小米论坛 /XDA 不难找。不过都需要电脑,但电脑上不用装流氓软件。
mxT52CRuqR6o5
    6

mxT52CRuqR6o5   57 天前 via Android

你买台安卓 4 的手机就能无电脑 root 了
poic
    7

poic   57 天前   ❤️ 1

那就去网吧
bghtyu
    8

bghtyu   57 天前 via Android

先用小米的官方的解锁工具解锁 bootloader,然后用 Google 的 fastboot 工具刷一个 recovery,再把 magisk 刷进去就行了。有什么不敢往电脑上装的
no1xsyzy
    9

no1xsyzy   57 天前   ❤️ 1

你不敢往电脑上装的软件,为什么还敢让它去 root 手机?
怕电脑上卸载不了,就不怕手机上更卸载不了?
S179276SP
    10

S179276SP   57 天前

miui 开发版
katana97
    11

katana97   57 天前   ❤️ 1

pc 上要装的不就一个小米解锁工具和 Android sdk tools 么
QBugHunter
    12

QBugHunter   57 天前

@no1xsyzy
大佬。。。。我不说的很清楚么,手机是公司测试用的手机,随便搞
no1xsyzy
    13

no1xsyzy   57 天前

@QBugHunter 我觉得随便搞不包括流氓软件、挖矿软件、木马软件和可横向移动的蠕虫。
不然整个网络瘫痪。
3dwelcome
    14

3dwelcome   57 天前 via Android

不用 PC root 不可能,你可以用 VHD 系统,安装前备份系统,用完就恢复一下。比卸载干净多了。
XuanFei990
    15

XuanFei990   57 天前

@no1xsyzy 电脑是自己的电脑,手机是公司的手机,
zhuweiyou
    16

zhuweiyou   57 天前

“就怕装了就卸载不了了”

建议辞职

no1xsyzy
    17

no1xsyzy   57 天前

@XuanFei990 手机会连公司的网吧?小心把整个公司网搞瘫痪了
XuanFei990
    18

XuanFei990   57 天前

@no1xsyzy 楼主怕自己电脑中毒,不怕公司网络瘫痪,看来是无所谓。
QBugHunter
    19

QBugHunter   57 天前

@no1xsyzy

@XuanFei990

手机不会连公司网

marczhao
    20

marczhao   57 天前

1 、不要用任何“一键 root”软件。
2 、3 楼正解。
yolee599
    21

yolee599   57 天前 via Android

先解 bootloader 锁,装面具
ivyy
    22

ivyy   57 天前

有点意思,去网吧就是了
qqg1530
    23

qqg1530   57 天前 via Android

vmos pro
masker
    24

masker   57 天前 via Android

真可怜
oldshensheep
    25

oldshensheep   57 天前

电脑安装虚拟机,虚拟机中安装小米解锁工具就行了。一样的……,2 楼应该是这个意思。
Jirajine
    26

Jirajine   57 天前

正常来说 PC 端只需要安装安全的开源软件(android sdk platform-tools) 使用里面的 adb 和 fastboot 工具就足以。

但你这个是 OEM 需要,得用 OEM 提供的工具解锁。所以放到虚拟机里就可以,多数虚拟机对 USB 直通的支持都很好。

cat9life
    27

cat9life   57 天前   ❤️ 4

我居然在 V2 论坛发现这个个帖子 唉
fatelight
    28

fatelight   56 天前

真就不会搜一下,懒癌晚期
Hypixel
    29

Hypixel   56 天前 via Android

安装 App 来 root 和连接电脑用 root 工具的那个时代已经过去了,正确的做法是:
1. 用小米官方解锁工具解锁 Bootloader (需要绑定账号,可能会有 15 天不等的限制时间)
2. 刷入 TWRP 和 Magisk 或者刷入 MIUI 开发版并开启 root
systemcall
    30

systemcall   56 天前

@Jirajine #26
Hyper-V 就不支持 USB 直通
cofface
    31

cofface   56 天前

自己动手就解 BL,刷 twrp recovery,刷 magisk root 包完毕。
learningman
    32

learningman   56 天前

@systemcall 支持啊。。。至少 WSL2 可以,WSL2 应该是基于 Hyper-V 的吧
systemcall
    33

systemcall   56 天前

@learningman #32
没看到原生的 USB 重定向支持,只找到用 USB over IP 来弄的。那个东西估计还不如 RDP 的远程 USB 重定向
Hyper-V 感觉可以用 DDA 分配一个 USB 扩展卡来给里面的虚拟机弄出来 USB 接口,没试过。我的 b450m 迫击炮实际上只有 1 个 PCIe X1,插了这个的话就不能够插无线网卡了。当时买的时候考虑到了这个问题,但是这个价位的板子那个时候都差不多寒酸
感觉这方面 Hyper-V 还是没有 Virtualbox 功能全,后者哪怕连 VT-d 之类的 I/O 虚拟化都不支持,也还是可以分配 USB 设备和存储设备
GeruzoniAnsasu
    34

GeruzoniAnsasu   56 天前

公司给你一个 andorid 手机让你“随便搞”
然后 你吧 android sdk 也不用装,adb bridge 也不用装,fastboot bridge 也不用
给你这个手机自拍用的?
JBaker
    35

JBaker   56 天前

我很好奇,明明每年 Android 都公开了那么多的 CVE,linux 内核也有一大堆 CVE,为啥就没有几个“一键 root”跟进更新出来呢?为啥全都是(相对手机一键 root)巨麻烦的“解锁+刷机”的流程呢?。。。
JensenQian
    36

JensenQian   56 天前

1 小米解 bl 锁 https://www.miui.com/unlock/index.html 这边申请,现在*新版本的可能要绑定 7 天,旧版本的 miui 应该不需要
2 具体咋样,网上有详细过程的
3 然后刷 twrp,https://twrp.me/xiaomi/xiaomimi8.html 刷进去,国内定制的 twrp 你可以搜下 wzsx150 这个
cev2
    37

cev2   56 天前

@JBaker 35# 1.且不说那一大堆 Linux 的漏洞中可用于提权的漏洞只有 1 成左右,这 1 成可用于提权的漏洞又有大多数是 KVM 、XEN 、网络相关的部分,而这其中大部分安卓裁剪掉了,并没用到相关模块,可利用的其实不多。
2.BL 锁的存在,目前的机型如果无法解锁 BL,即使通过漏洞 [临时] 获取了 root 权限,也无法修改 /system 分区文件,强行修改后会导致下次系统无法启动。只修改 /data 分区多数是可以的,但大多数使用一键 root 的用户才不会去仔细看使用说明,对他们来说 root 后怎么能不精简个系统 APP ?一精简开不了机了。。。对于开发者来说,这种“不完美的 root”费力不讨好,不适合拿来做一键 root 。
3.如果通过漏洞破解掉了 BL 锁,那就没有了 2 的限制,但这又回到了你的问题,既然已经解了 BL 锁了,*简单通用的方式当然是直接刷入 magisk 。
以上,不解 BL 锁无法完美永久的 root,解了 BL 锁没必要再研究其他的 root 方式。(仅针对大多数通用情况,不排除小部分厂商 BL 不限制 /system 修改后启动,不具备实用意义)
WebKit
    38

WebKit   56 天前 via Android

root 本来也不用装什么软件啊。。。adb 有这个环境就行。其他的都是命令操作的脚本
w950888
    39

w950888   56 天前

你为什么会认为解锁软件卸不掉? 毫无理由的黑小米.
QBugHunter
    40

QBugHunter   56 天前

@GeruzoniAnsasu
这 3 个装了哪个能抓包?
GeruzoniAnsasu
    41

GeruzoniAnsasu   56 天前

@QBugHunter 你要 tcpdump 为什么不直接连局域网然后在网关上抓?
QBugHunter
    42

QBugHunter   56 天前

@GeruzoniAnsasu
你猜?
codehz
    43

codehz   56 天前

@JBaker #35 因为谷歌每月发布安全更新(
codehz
    44

codehz   56 天前

如果 Android 10 没有启用 seccomp,有一个一键 root 的方法 https://github.com/vvb2060/Magica
arvinsilm
    45

arvinsilm   56 天前

建议买台电脑,单拉网线,物理隔离
Zy143L
    46

Zy143L   55 天前 via Android

这楼主是活在安卓 2.3.6 还是 4.0 的时代?
小米 8 的话 去解锁手机 小米官方有解锁工具
然后 Magisk 随便刷..有啥不放心的
lychs1998
    47

lychs1998   55 天前

测试为啥需要 root…
YamatoRyou
    48

YamatoRyou   55 天前

*近入了一个小米 9T, 获取 Root 权限确实不需要在 PC 上完成 (通常是已有 TWRP 的情况下卡刷 Magisk), 但解锁 Bootloader 和刷 TWRP 必须在 PC 上完成 (如果曾经没有解锁的话).
kingfalse
    49

kingfalse   54 天前 via Android

去网吧那兄弟成功逗笑我了
acess
    50

acess   51 天前

按照标准的流程,解锁 bootloader 是需要恢复出厂清空数据的。

Linux 下有 supervisord,还有哪些管理服务器的黑科技?

以前服务器上就跑几个程序,每次重启服务器,都是再手动启动程序

通过 Windows 的计划任务或者设置开机启动,能自动启动

但是,如果服务器不重启,程序挂掉了,有类似 supervisord 的监控程序么?

不知道大家在管理服务器方面还有哪些黑科技?比如管理多台服务器、再比如快速部署之类的,谢谢大家

wxlg1117 1
wxlg1117 2017-08-24 01:39:44 +08:00 via Android ❤️ 6
alwaysup 或者 firedaemon,都挺好用
only0jac 2
only0jac 2017-08-24 08:06:47 +08:00 via Android
@wxlg1117 感谢,前者比后者小很多
hjc4869 3
hjc4869 2017-08-24 08:18:45 +08:00 via Android
计划任务可以自动重启挂掉的进程。taskschd.dll 可以用 vbs/js 脚本或者 C#/C++等语言调用,也可以 powershell remote,部署起来方便*了。
only0jac 4
only0jac 2017-08-24 08:42:47 +08:00 via Android
@hjc4869 计划任务只能定时执行或者重启时执行吧?你说的那种是不是基于事件消息?那个事件消息,普通程序挂掉是没有消息的,mysql 有
hjc4869 5
hjc4869 2017-08-24 09:18:36 +08:00
@only0jac Settings 里有,If the task fails, restart every ____,这个 fails 就是指 task 的那个进程 exit code 不为 0。
当然,你必须让你启动的那个进程一直活着。如果你想监控它子进程的状态,就办不到了。
only0jac 6
only0jac 2017-08-24 23:40:51 +08:00
@hjc4869 谢谢,不过有缺陷,你说的计划任务 If the task fails,是指在计划任务主动启动程序时,失败的话会再次重试,如果这个程序中途挂掉,就没办法自动拉起来
hjc4869 7
hjc4869 2017-08-25 00:34:25 +08:00
@only0jac 然而对于一个进程来讲没有所谓的“启动程序时”和“中途”的区分,创建一个进程不管过多久返回非 0 值在 taskschd 看来都是 failed。
only0jac 8
only0jac 2017-08-25 09:00:48 +08:00 via Android
@hjc4869 多谢,我描述一个场景,比如,服务器正常运行着几个程序,忽然其中一个挂掉了,我希望能自动拉起这个挂掉的程序并邮件通知我
QQ2171775959 9
QQ2171775959 2017-08-25 16:26:03 +08:00
监控方面,可以利用的工具还是蛮多。阿里监控也可以啊。

既然微信支持安卓平板扫码登陆了, 有个想法不知当不当讲

安卓版的微信开始支持微信登陆了, 就像 ipad 一下, 扫码就能登陆了.

既然如此, 是不是可以把我手上的安卓手机修改一下什么信息, 让微信识别我的安卓手机为安卓平板, 然后同一个微信账号就能在两台手机上一起跑了?

求大佬支招 Orz

43 条回复    2021-02-16 13:39:58 +08:00
superrichman
    1

superrichman   52 天前 via iPhone   ❤️ 4

封号的边缘疯狂试探
SenLief
    2

SenLief   52 天前 via Android   ❤️ 36

如果你不怕封号我觉得是可行的,微信在其他方面不严,但是在打击用户方面从不留手。
Joooooe
    3

Joooooe   52 天前

@superrichman
@SenLief
哈哈, 这多么刺激呀
Joooooe
    4

Joooooe   52 天前

@superrichman
@SenLief
仔细想想, 我 root 我修改的是我手机的信息呀, 你微信识别的关我啥事, 我又没修改微信的文件
FlyPuff
    5

FlyPuff   52 天前

好像有人试过了 平板模式的 DPI 需要 600 以上才能平板模式登录 然后你备用手机使用的话字体会非常非常小~不实用
Joooooe
    6

Joooooe   52 天前

@FlyPuff 有没有链接啥的呀, 我网上找了一大圈没看到啥帖子呢
FlyPuff
    7

FlyPuff   52 天前   ❤️ 1

我记得当时应该是查阅酷安的 小米平板 4 的帖子看见的~
Joooooe
    8

Joooooe   52 天前

@FlyPuff 可以, 我去翻一番
FlyPuff
    9

FlyPuff   52 天前

@Joooooe 刚刚简单搜索了一下,基本都是有人尝试用手机修改成平板的各种设备信息,但是*后还是没有成功。
哎 原罪还是这个程序就不支持你双持或者同步聊天记录~
dingwen07
    10

dingwen07   52 天前 via Android   ❤️ 2

微信啊。。。连 M1 Mac 登录都封你号,改设备信息什么的不是。。。秒封
Cielsky
    11

Cielsky   52 天前 via Android

理论可以,登录成功后重新改回去应该也不会下线,不过封号也是有可能的
lucybenz
    12

lucybenz   52 天前

还是造个尺寸小点儿的 android 平板更容易一些
Joooooe
    13

Joooooe   52 天前

@lucybenz 主要也就是想多余的手机发挥一下余热
Joooooe
    14

Joooooe   52 天前

@dingwen07 鹅子这么不给力的吗
Joooooe
    15

Joooooe   52 天前

@FlyPuff 微信也是越来越臃肿了呐, 他们要是出一个付费云同步的功能我立马付钱
wunonglin
    16

wunonglin   52 天前 via iPhone

就不能不搞骚操作??老钻灰色地带
JunoNin
    17

JunoNin   52 天前 via iPhone

刺激?
sephinh
    18

sephinh   52 天前 via iPhone

@Joooooe #4 说的很有道理,可惜我们不听,我们都听 ai 的,ai 说你是坏人你就是坏人…
Joooooe
    19

Joooooe   52 天前 via iPhone

@wunonglin 咳,就是喜欢瞎折腾
felixcode
    20

felixcode   52 天前

试当然可以试,但试的时候可能一不小心就封号了,然后你也不知道原因,你也找不到微信的客服可以问,封了就是封了。
yujiang
    21

yujiang   52 天前 via Android

小米平板 4 已经用上了,好使
Felldeadbird
    22

Felldeadbird   52 天前 via iPhone

你伪装就需要 root…这点微信应该不会坐视不理吧。估计封号是*可能
icyalala
    23

icyalala   52 天前

不当讲不当讲。。
CoderLife
    24

CoderLife   52 天前

为什么要这样, 有什么实用的应用场景
tanghongkai
    25

tanghongkai   52 天前

@Joooooe 微信你啥都不动也能封你号
freelancher
    26

freelancher   52 天前

估计就是做黑产的。如果你手机和安卓的 IP 对不上。估计微信的风控直接封号。到时慢慢申诉吧。
demen
    27

demen   52 天前

我也是小米平板 4 可以登,但是退出的时候那个提示窗很奇怪:正在退出微信网页版
wasd6267016
    28

wasd6267016   52 天前 via iPhone

这就是微信为什么迟迟不肯开放安卓平板扫码登录的原因吧
mrochcnnnnn
    29

mrochcnnnnn   52 天前 via iPhone

好像是 density,不太确认
LittleCute
    30

LittleCute   52 天前

神为你网开一面
凡躯 请不要再得寸尽知
Joooooe
    31

Joooooe   52 天前

@felixcode 我看微信作为一个带有支付功能的软件, 却没有与支付相关的人工客服?

@Felldeadbird 应该不会吧, root 了的手机不至于不能用微信, 之前想把我亚太版的 note 10 刷成国行版的 ROM, 没看到论坛有人说微信被封号的

@CoderLife 因为贪心, 安卓手机苹果手机想同时用

@freelancher 真不是做黑产呀, 纯自己想同时用两个手机而已. 那我 ipad 插了流量卡登陆微信, IP 和我 iPhone 也不一样呀, 不至于封我号吧.

@demen 那是他们还没优化好, 没注意细节

@mrochcnnnnn 手机 DPI 调到了 800 也没用, 虽然输入法是给我显示的平板的样子了

@LittleCute 哲学了

91pornshanghai
    32

91pornshanghai   52 天前

@Felldeadbird 我手机从骁龙 801 开始就一直 root 的,微信还好好的
pmgh10
    33

pmgh10   52 天前

没问题。ios 越狱后安装微信伪装 iPad 登录,可以在两部手机上同时登录。多年老号,微信不封。
rocketman13
    34

rocketman13   52 天前

同一个微信在两台手机上跑的意义是?
FlyPuff
    35

FlyPuff   52 天前 via Android

@rocketman13 *常用的形式就是双持手机,例如一个工作一个休闲,然后有时只想带一台手机,但是切过去聊天记录全无,不能和其他 IM 一样无缝切换
Joooooe
    36

Joooooe   52 天前 via iPhone

@FlyPuff 兄弟正解呀
felixcode
    37

felixcode   52 天前 via Android

你应该试着先找找有没有客服,我也只是听说没客服,没找过
bao3
    38

bao3   51 天前 via iPhone

用 telegram 吧,比较安全可靠
SenLief
    39

SenLief   51 天前 via Android

@FlyPuff 分开,用两个微信号,同一个手机开分身就完事了,我这样用了几年了。带两个手机干啥,每天出门还得带个包。
FlyPuff
    40

FlyPuff   51 天前

@SenLief 分身双开微信会霸占掉少说 2x 1.2G 运存 /笑哭~
双倍的后台 双倍的小程序 双倍的“快乐”
然后手机中*耗电的程序 除了游戏 估计就是微信了~
asche910
    41

asche910   50 天前 via iPhone

小号在 root 过的手机登陆,后来莫名其妙被封了。
SenLief
    42

SenLief   50 天前 via Android

@FlyPuff 还好,除非你微信一直消息进来,要不然每次电不是耗电大户的。
dzyou2007
    43

dzyou2007   50 天前

没记错的话是识别设备型号实现的,修改功能会被检测,小心封号(我一个常用设备登录小号都能触发人脸验证,微信的风控不是一般的严)
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速