当前位置:首页 » 编程语言 » python验证码训练

python验证码训练

发布时间: 2023-04-17 12:38:49

㈠ 如何利用python做简单的验证码识别

1摘要

验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。

然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

2关键词

关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL

3免责声明

本文研究所用素材来自于某旧Web框架的网站完全对外公开的公共图片资源。

本文只做了该网站对外公开的公共图片资源进行了爬取,并未越权做任何多余操作。

本文在书写相关报告的时候已经隐去漏洞网站的身份信息。

本文作者已经通知网站相关人员此系统漏洞,并积极向新系统转移。

本报告的主要目的也仅是用于OCR交流学习和引起大家对验证安全的警觉。

4引言

关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:

互联网安全防火墙(1)--网络验证码的科普

里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容。本章内容则作为它的技术补充来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。

5基本工具

要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。普通程序员已经不需要了解复杂的数学原理,即可以实现对这些工具的应用了。

主要开发环境:

  • python3.5

  • python SDK版本

  • PIL

  • 图片处理库

  • libsvm

  • 开源的svm机器学习库

  • 关于环境的安装,不是本文的重点,故略去。

    6基本流程

    一般情况下,对于字符型验证码的识别流程如下:

  • 准备原始图片素材

  • 图片预处理

  • 图片字符切割

  • 图片尺寸归一化

  • 图片字符标记

  • 字符图片特征提取

  • 生成特征和标记对应的训练数据集

  • 训练特征标记数据生成识别模型

  • 使用识别模型预测新的未知图片集

  • 达到根据“图片”就能返回识别正确的字符集的目标

  • 7素材准备

    7.1素材选择

    由于本文是以初级的学习研究目的为主,要求“有代表性,但又不会太难”,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。

    最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。

    原始图:

  • def get_feature(img): """

  • 获取指定图片的特征值,

  • 1. 按照每排的像素点,高度为10,则有10个维度,然后为6列,总共16个维度

  • :param img_path:

  • :return:一个维度为10(高度)的列表 """


  • width, height = img.size


  • pixel_cnt_list = []

  • height = 10 for y in range(height):

  • pix_cnt_x = 0 for x in range(width): if img.getpixel((x, y)) == 0: # 黑色点

  • pix_cnt_x += 1


  • pixel_cnt_list.append(pix_cnt_x) for x in range(width):

  • pix_cnt_y = 0 for y in range(height): if img.getpixel((x, y)) == 0: # 黑色点

  • pix_cnt_y += 1


  • pixel_cnt_list.append(pix_cnt_y) return pixel_cnt_list

  • 然后就将图片素材特征化,按照libSVM指定的格式生成一组带特征值和标记值的向量文

㈡ python简单验证码识别的实现过程

demo :
import pytesseract
from PIL import Image
image = Image.open("captcha.png")
print(pytesseract.image_to_string(image))
=================================================
=================================================中文识别
import pytesseract
from PIL import Image
image = Image.open("00.jpg")
print(pytesseract.image_to_string(image,lang='chi_sim'))

有时候文本识别率并不高,建议图像识别前,先对图像进行灰度化和 二值化

效果如下(有时候第一次辩举好可能识别失败,可以写个循环逻辑让它多识别几次携铅,一般程序运答拆行1-3次基本会识别成功):

㈢ python如何识别验证码

我们首先识别最简单的一种验证码,即图形验证码。这种验证码最早出现,现在也很常见,一般由4位字母或者数字组成。例如,中国知网的注册页面有类似的验证码,页面如下所示:

表单中最后一项就是图形验证码,我们必须完全正确输入图中的字符才可以完成注册。

更多有关验证码的知识,可以参考这些文章:

Python3爬虫进阶:识别图形验证码

Python3爬虫进阶:识别极验滑动验证码

Python3爬虫进阶:识别点触点选验证码

Python3爬虫进阶:识别微博宫格验证码

·本节目标以知网的验证码为例,讲解利用OCR技术识别图形验证码的方法。

·准备工作识别图形验证码需要库tesserocr,以mac安装为例:在mac下,我们首先使用Homebrew安装ImageMagick和tesseract库: brew install imagemagickbrew install tesseract 接下来再安装tesserocr即可:pip3 install tesserocr pillow这样我们就完成了 tesserocr的安装。

·获取验证码为了便于实验,我们先将验证码的图片保存到本地。打开开发者工具,找到验证码元素。验证码元素是一张图片,它的ser属 性是CheckCode.aspk。所以我们直接打开如下链接就可以看到一个验证码,右键保存即可,将其命名为code.jpg:

这样我们就得到一张验证码图片,以供测试识别使用。

相关推荐:《Python教程》

识别测试

接下来新建一个项目,将验证码图片放到项目根目录下,用tesserocr库识别该验证码,代码如下所示:

这里我们新建了一个Image对戏那个,调用了tesserocr的image_to_text( )方法。传入该Image对象即可完成识别,实现过程非常简单,结果如下:

我们可以看到,识别的结果和实际结果有偏差,这是因为验证码内的多余线条干扰了图片的识别。

另外,tesserocr还有一个更加简单的方法,这个方法可以直接将图片文件转为字符串,代码如下:

不过这种方法的识别效果不如上一种的好。

验证码处理

对于上面的图片,我们可以看到其实并没有完全识别正确,所以我们需要对图像作进一步的处理,如灰度转换、二值化等操作。

我们可以利用Image对象的convert( )方法参数传入L,即可将图片转化为灰度图像,代码如下:

传入1即可将图片进行二值化处理,如下所示:

我们还可以指定二值化的阈值。上面的方法采用的是默认阈值127。不过我们不能直接转化原图,要将原图先转化为灰度图像,然后再指定二值化阈值,代码如下:

在这里,变量threshold代表二值化阈值,阈值设置为160,之后我们来看看我们的结果:

我们可以看到现在的二维码就比较方便我们进行识别了;那么对于一些有干扰的图片,我们做一些灰度和二值化处理,这会提高图片识别的正确率。

㈣ 验证码识别之模板匹配方法

在写爬虫的时候难免会遇到验证码识别的问题,常见的验证码识别的流程为:

- 图像灰度化

- 图像去噪(如图像二值化)

- 切割图片

- 提取特征

- 训练

但这种方法要切割图片,而且破解验证码的重点和难点就在于 能否成功分割字符 。

本文要介绍的算法 不需要进行图片切割,也不需要进行机器训练 ,这种方法就是模板匹配:将待识别的文字切割成一个个模板,在待识别的图像中去匹配模板。

这篇文章将分为两个部分:

第一部分介绍模板匹配的基本概念以及模板匹配的一种实现算法:快速归一化互相关匹配算法;

第二部分是一个具体实例。

模板匹配是在图像中寻找目标的方法之一,目的就是在一幅图像中寻找和模板图像最相似的区域。

模板匹配的大致过程是这样的:通过在输入图像上滑动图像块对实际的图像块和输入图像进行匹配。

假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:

从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;

用某种方法得出临时图像与模板的相似度c,存放到相似度矩阵中(矩阵大小为91 x91);

切割输入图像从(0,1)至(10,11)的临时图像,对比,并记录到相似度矩阵;

重复上述步骤,直到输入图像的右下角。

最终得到一个相似度矩阵,找到矩阵中的最大或最小值,最大值(最小值)对应的临时图像即为与模板最相似的图像。

在步骤b中,求模板与图像的相似度有多种方法,如平均绝对差算法(MAD)、绝对误差和算法(SAD)、误差平方和算法(SSD)、归一化互相关算法(NCC),本文使用的是归一化互相关算法。

什么是归一化互相关?

从几何图形上来看,空间中的两个向量,同方向平行时,归一化互相关系数为1,表示两个向量最相似,反方向平行时归一化互相关系数为-1,垂直时为0,表示最不相似(用互相垂直的三个向量来代表整个空间也是这个道理,垂直的向量之间不包含对方的信息,相关系数为0),存在一定夹角时处于(-1,1),是不是跟余弦函数很像,cos(0)=1,cos(pi/2)=0,cos(pi)=-1。就是这个样子的,相关系数可以看作是两个向量之间夹角的cosine函数。

在数学中是这么计算cosine函数的,假设两个n维向量X,Y,对应的坐标分别为(x1,x2,…xn), (y1,y2,…yn) 则:

(如果想要了解更多,请参考文献【2】)

但这是一维的,在模板匹配中要再加一个维度 (具体算法请参考文献【3】) ,简要说一下文献【3】的内容:如果直接计算二维相似度的话计算复杂度会非常高,文献【3】利用快速傅里叶变换与积分图像快速算法来降低计算复杂度。

接下来让我们看一个具体的应用。

模板匹配识别验证码的具体步骤为:

1. 找出图片中所有可能出现的字符,制作成模板集合

2. 图像灰度化

3. 图片去噪(二值化)

4. 模板匹配

5. 匹配结果优化

要识别的图片如下,以识别图片中的加字为例:



要从image中找到与模板最匹配的部分,Template图像是事先从image图像中截取的一部分。所用的为python模块skimage中的match_template方法,match_template方法使用的是快速归一化互相关算法 【2】 。

遍历模板图像集合,与图像匹配,如果dist大于阈值h,则认为此模板在图像中存在,否则不存在,继续匹配下一个模板,直到遍历完所有模板。

以模板‘加’为例,图像大小为40x260,模板大小27x27,result是一个大小为(14,234)的矩阵,即上文提到的相似度矩阵,矩阵中的数值属于[-1,1],找到result中最大值所处的对应位置即为与模板最匹配的图像位置:x=66,y=11,正好对应模板图像在image中所处的位置。 (更多内容请参阅参考文献【4】)

但这是比较好的情况,因为在匹配时遍历了所有的模板,而一张图片中出现的模板数量是有限的,比如数字’四’在图片中是没有的,这时就要根据某种规则去掉这些在图片中没有出现的模板:程序中使用dist变量来过滤匹配结果,如果dist变量大于某个值则认为此模板在图像中不存在。

最后的result_list中可能仍然存在一些图片中不存在的模板或者匹配不精确的模板,比如数字‘一’在模板中不存在,但仍然可以匹配到,因为数字‘二’中可以匹配到‘一’,需要进一步优化,优化方法有很多,比如当匹配到的两个模板距离过近时,选择较大的那个模板,其余方法留给读者自行考虑吧。

后续将会推出如何使用深度学习识别验证码,敬请期待~


参考文献:

http://www.cnblogs.com/beer/p/5672678.html

http://www.ruanyifeng.com/blog/2013/03/cosine_similarity.html

J. P. Lewis, “Fast Normalized Cross-Correlation”, Instrial Light and Magic.

http://scikit-image.org/docsjinhqin/dev/auto_examples/plot_template.html


本文作者 :李晖(点融黑帮),毕业于电子科技大学,现就职于点融成都Data部门,对一切新鲜事物充满好奇,对跳舞毫无抵抗力的活力女青年一枚。

㈤ 如何用Python+人工识别处理知乎的倒立汉字验证码

这给Python爬虫的模拟登录带来了一定的难度,目前网络上的相关资料针对的都是普通的“英文+数字”验证码,针对“倒立汉字”验证码的文章较少。而且大家普遍采用的是requests库。经过几天的研究,我采用urllib.request实现了模拟登陆知乎,现将代码分享如下:

[python] view plain
# 登录知乎,通过保存验证图片方式
import urllib.request
import urllib.parse
import time
import http.cookiejar

webUrl = "l"#不能写因为不支持重定向

webheader = {
# 'Accept': 'text/html, application/xhtml+xml, */*',
# 'Accept-Language': 'zh-CN',
# 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36',
# 'User-Agent': 'Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5',
# 'DNT': '1',
# 'Connection': 'Keep-Alive'
}

postData = {
'email': '在这里写你的账号',
'captcha_type': 'cn',
'password': '在这里写你的密码',
'_xsrf': '',
'captcha': ''
}
localStorePath = "写你想保存的验证码图片的地址"

if __name__ == '__main__':
#声明一个CookieJar对象实例来保存cookie
cookie = http.cookiejar.CookieJar()
#创建opener
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)#建立opener对象,并添加头信息
urllib.request.install_opener(opener)

captcha_url = '?r=%d&type=login&lang=cn' % (time.time() * 1000)
# captcha_url = '/captcha.gif?r=%d&type=login' % (time.time() * 1000)#这样获得的是“字母+数字验证码”

#这个获取验证码图片的方法是不行的!
# urllib.request.urlretrieve(captcha_url, localStorePath + 'myCaptcha.gif')

#用urlopen函数保存验证图片
req = urllib.request.Request(url=captcha_url,headers=webheader)
content = urllib.request.urlopen(req)
# content = opener.open(req)
captcha_name = 'D:/Python学习/crawler_learning/知乎登录专题研究/知乎验证码图片/myNewCaptcha.gif'
content = content.read()
with open(captcha_name, 'wb') as f:
f.write(content)

postData['captcha'] = input('请输入验证码')
# postData['_xsrf'] = get_xsrf()
postData['_xsrf'] = ''
print(postData['_xsrf'])

#用urlopen函数传送数据给服务器实现登录
postData_encoded = urllib.parse.urlencode(postData).encode('utf-8')
req = urllib.request.Request(url=webUrl,data=postData_encoded,headers=webheader)
webPage = urllib.request.urlopen(req)
# webPage = opener.open(req)
data = webPage.read().decode('utf-8')

print(data)
with open("D:/知乎服务器反馈的内容.txt",mode='w',encoding='utf-8') as dataFile:
dataFile.write(data)

几点思考:
1、首先需要明确如何获得验证码图片的地址,利用Fiddler抓包获得的典型的验证码图片的地址如下:

这个“r”代表的是什么含义呢?经过查看知乎上的js代码可以确定,这个r指的是毫秒级的时间戳。
2、以验证码图片地址cn为例,不同时间访问同一个验证码图片地址,得到的验证码图片是不同的,那么知乎服务器是如何知道你获取的是那张验证码呢?
我认为是通过sessionID,换句话说,知乎把某个验证码图片给了你,同时知乎记录下了你的sessionID和这个验证码的“正确答案”,这样将来你输入验证码给知乎后,知乎就能判断你输入的验证码是否正确了。
由于sessionID保存在cookie之中,所以Python模拟登陆的代码必须使用cookie。
3、获取验证码图片的时候,我用的是content =urllib.request.urlopen (req)函数,经过我的验证,用
urllib.request.urlretrieve函数是不行的,因为urlopen函数可以传递headers参数,而这一个参数必须有。

4、获得了倒立汉字图片以后,如何确定要传递给知乎的captcha是什么呢?经过Fiddler抓包,
传递的参数类似于这样:
{"img_size":[200,44],"input_points":[[43.44,22.44],[115.72,22.44]]}
经过分析和试验确定:200指的是图片长度,44指的是图片高度,后面的input_points指的是打在倒立汉字上的点的坐标。由于每次出现7个汉字,这7个汉字的坐标是固定的,我全部进行捕获:
{"img_size":[200,44],"input_points":[[12.95,14.969999999999998],[36.1,16.009999999999998],[57.16,24.44],[84.52,19.17],[108.72,28.64],[132.95,24.44],[151.89,23.380000000000002]]}
然后,问题就简单了:将图片保存在本地之后,打开图片,确定哪几个汉字倒立,比如说第2个和第6个,那就在上面选取出2和6的坐标输入即可,即
{"img_size":[200,44],"input_points":[[36.1,16.009999999999998],[132.95,24.44]]}。
5、小窍门:以验证码图片地址

㈥ Python 模拟登陆遇到验证码怎么办

  1. 方法1:找个验证码识别程晌桐序,自动识别

  2. 方法2:自己用PIL写一个

  3. 方法3:让用户手工输入验埋孙证码。这个比较简单

  4. 方法4:让后台程序开一个后门宴液坦,让你绕过验证码

  5. 方法5:直接使用cookie,这样就不用登陆了

㈦ Python开发文字点选验证码,有什么推荐的方法

文字点选验证码(Click Captcha)是一种常见的验证码形式,纳雹通常由若干个字符或单词组成,要求用户点击其中指定的字符或单词,以验证用户身份。

在Python开发中实现文字点选验证码,一种常用的方法是使用图像处理库和机器学习库,以下是一些常用的库和方法:

  • PIL库:Python Imaging Library(PIL)是一个Python图像处理库,提供了丰富的图像处理功能,包括图像读写、缩放、旋转、裁剪、滤波等。可以使用PIL库生成包含随机字符的验证码图片,并将其保存为本地文件。

  • OpenCV库:OpenCV是一个计算机视觉库,提供了大量的图像处理和计算机视觉算法,包括图像读写、滤波、边缘检测、特征提取等。可以使用OpenCV库对验证码图片进行预处理,提取出验证码中的字符或单词,以便后续的识别。

  • PyTesseract库伍和:PyTesseract是一个Python的OCR库,基于Google的Tesseract-OCR引擎,可以对图像中的文字进行识别。可以使用PyTesseract库对验证码图片中的字符或单词进行识别和分类。

  • KNN算法:KNN是一种常用的机器学习算法,可以用于对验证腔茄盯码图片中的字符或单词进行分类。可以使用KNN算法对预处理后的验证码图片进行特征提取和分类,以识别出验证码中的正确字符或单词。

  • 综合使用以上方法,可以实现一个较为稳定和准确的文字点选验证码。具体实现细节需要根据具体情况进行调整和优化。

㈧ 如何利用Python做简单的验证码识别

先是获取验证码样本。。。我存了大概500个。
用dia测了测每个字之间的间距,直接用PIL开始切。
from PIL import Image
for j in range(0,500):
f=Image.open("../test{}.jpg".format(j))
for i in range(0,4):
f.crop((20+20*i,0,40+20*i,40)).save("test{0}-{1}.jpg".format(j,i+1))

上面一段脚本的意思是把jpg切成四个小块然后保存
之后就是二值化啦。
def TotallyShit(im):
x,y=im.size
mmltilist=list()
for i in range(x):
for j in range(y):
if im.getpixel((i,j))<200:
mmltilist.append(1)
else:
mmltilist.append(0)
return mmltilist

咳咳,不要在意函数的名字。上面的一段代码的意思是遍历图片的每个像素点,颜色数值小于200的用1表示,其他的用0表示。
其中的im代表的是Image.open()类型。
切好的图片长这样的。
只能说这样切的图片还是很粗糙,很僵硬。
下面就是分类啦。
把0-9,“+”,”-“的图片挑好并放在不同的文件夹里面,这里就是纯体力活了。
再之后就是模型建立了。
这里我试了自己写的还有sklearn svm和sklearn neural_network。发现最后一个的识别正确率高的多。不知道是不是我样本问题QAQ。
下面是模型建立的代码
from sklearn.neural_network import MLPClassifier
import numpy as np
def clf():
clf=MLPClassifier()
mmltilist=list()
X=list()
for i in range(0,12):
for j in os.listdir("douplings/douplings-{}".format(i)):
mmltilist.append(TotallyShit(Image.open("douplings/douplings-{0}/{1}".format(i,j)).convert("L")))
X.append(i)
clf.fit(mmltilist,X)
return clf

大概的意思是从图片源中读取图片和label然后放到模型中去跑吧。
之后便是图像匹配啦。
def get_captcha(self):
with open("test.jpg","wb") as f:
f.write(self.session.get(self.live_captcha_url).content)
gim=Image.open("test.jpg").convert("L")
recognize_list=list()
for i in range(0,4):
part=TotallyShit(gim.crop((20+20*i,0,40+20*i,40)))
np_part_array=np.array(part).reshape(1,-1)
predict_num=int(self.clf.predict(np_part_array)[0])
if predict_num==11:
recognize_list.append("+")
elif predict_num==10:
recognize_list.append("-")
else:
recognize_list.append(str(predict_num))
return ''.join(recognize_list)

最后eval一下识别出来的字符串就得出结果了。。
顺便提一句现在的bilibili登陆改成rsa加密了,麻蛋,以前的脚本全部作废,心好痛。
登陆的代码。
import time
import requests
import rsa
r=requests.session()
data=r.get("act=getkey&_="+str(int(time.time()*1000))).json()
pub_key=rsa.PublicKey.load_pkcs1_openssl_pem(data['key'])
payload = {
'keep': 1,
'captcha': '',
'userid': "youruserid",
'pwd': b64encode(rsa.encrypt((data['hash'] +"yourpassword").encode(), pub_key)).decode(),
}
r.post("",data=payload)

㈨ python爬验证码

1.找地址

首先,我们要找到这个网站生成验证码的地址,这个地址我们可以通过查看他的源代码来实现。

1.找地址

首先,我们要找到这个网站生成验证码的地址,这个地址我们可以通过查看他的源代码来实现。

就以某大学教务网为例,这个教务网的模板很多学校都在采用:

我就截取表单的验证码部分即可。

<tdalign="center"rowspan="3">
<imgid="imgCode"src="../sys/ValidateCode.aspx"
onclick="changeValidateCode(this)"alt="单击可更换图片!"
style="CURSOR:pointer;">
<br>看不清,则单击图片!
</td>123456123456

这里就可以知道,地址就是../sys/ValidateCode.aspx

组合一下地址就是http://jwmis.lmu.cn/sys/ValidateCode.aspx

也就是我们等一下要用到的地址了。

我们可以查看一下那个网页。

2.处理图片

去查看了一下那个地址

果不其然,都是乱码,因为验证码分为两种。

1)直接处理成JPG/GIF/PNG或者其他格式,然后直接读取到一个图片地址。

2)接收用户触发,然后生成,再直接处理成图像,不读取到一个图片地址。

我们这里是第二种,我们要自己来读取他,到本地,再手动输入验证码。

#-*-coding:utf-8-*-
importurllib2
#验证码的处理#
#验证码生成页面的地址#
im_url='http://jwmis.lmu.cn/sys/ValidateCode.aspx'
#读取验证码图片#
im_data=urllib2.urlopen(im_url).read()
#打开一个Code.PNG文件在D盘,没有的话自动生成#
f=open('d:\Code.png','wb')
#写入图片内容#
f.write(im_data)
#关闭文件#
f.close()

这里包括两个部分:

1)打开那个生成验证码图片的页面,读取

2)将读取到的内容,保存成图片,下载到本地

我们这里的地址是可以随便写的,保存在你想保存的地方。

到这里我们就完成了验证码的一小部分。

by–LoDog

希望能帮到你!

热点内容
java数组包含字符串 发布:2024-11-01 22:31:15 浏览:791
服务器和家用电脑质量 发布:2024-11-01 22:28:29 浏览:488
sqlserver默认实例 发布:2024-11-01 22:23:42 浏览:959
sort排序java 发布:2024-11-01 22:23:26 浏览:47
解压后的apk无法安装 发布:2024-11-01 22:22:10 浏览:666
公司的pop服务器地址 发布:2024-11-01 22:22:07 浏览:119
朵唯m30手机配置是真的吗如何 发布:2024-11-01 22:16:56 浏览:681
梦幻西游怎么清理缓存 发布:2024-11-01 22:15:52 浏览:344
如何配置fcm 发布:2024-11-01 22:08:15 浏览:854
原装电脑配置哪个好 发布:2024-11-01 22:05:49 浏览:729