【TensorFlow】01 TensorFlow簡介與Python基礎
963
2025-04-03
python連接ES
集群方式
from elasticsearch import elasticsearch es = Elasticsearch([{'host': 'xxx'}, {'host': 'xx'}, {'host': 'xxx'}], http_auth=('xxx', 'xxx'), timeout=3600)
單點方式
from elasticsearch import Elasticsearch es = Elasticsearch([{'host': 'xxx', 'port': 9000}], timeout=3600)
如何使用SSl或者添加port端口等可以help該API查看,有具體的例子
ES body中的命令
數據庫中現在有一條數據為:
{'source': 'abc', 'valid': True}], 'collectTime': '2021-11-02T15:50:30Z', 'confidence': 70.0, 'createdBy': 'def', 'createdTime': '2021-11-02T16:10:55Z', 'creditLevel': 3, 'dataType': 'business', 'hitCount': 2, 'id': 'indicator-d3a548d9eb056666', 'idxKey': 'network-attacks-botnet', 'labels': ['ip'], 'modifiedTime': '2021-11-02T16:10:55Z', 'modifyCount': 0, 'observables': [{'type': 'ipv4-addr', 'value': '175.181.111.27'}], 'pattern': "[ipv4-addr:value = '175.181.111.27']", 'related': [], 'revoked': False, 'threatLevel': 5, 'threatTypes': ['40702'], 'tlp': 'green', 'type': 'indicator', 'hitLastTime': '2021-11-03T17:14:19Z'}}
主要命令
切片查詢
body = { 'from': 0, # 從0開始 'size': 20 # 取多少條數據 }
term精準單值查詢
'term': {'source': 'nsfocus'} # 查詢source為nsfocus的數據 'term': {'createdBy.keyword': '中國電信'} # 查詢中文需要加上keyword
terms精準多值(value)查詢(or關系)
'terms': {'source': ['nsfocus', 'tjym']} # 查詢source為nsfocus或者tjym的數據
match模糊查詢-分詞
'match': {'createdBy': '中國電信'} # 模糊查詢(會被分詞)。只要包含"中國"或者"電信"就會被查詢到
multi_match多字段(key)模糊查詢(AND)-分詞
'multi_match': {'query':'indicator', 'fields': ['type', 'id']} # "type"和"id"字段中包含關鍵詞indicator的數據
match_phrase模糊查詢-不分詞
'multi_phrase': {'idxkey': 'network'}
match_all搜索所有數據
"match_all":{}
exists存在查詢
'exists': {'field': 'indicator'} # 查詢存在indicator的數據
prefix前綴查詢
'prefix': {'idxkey.keyword': '中國'} # 查詢idxkey以中國開頭的數據,英文不需要加keyword
wildcard通配符查詢
'wildcard': {'idxkey': '*network*'} # ?代表一個字符,*代表0個或多個字符
regexp正則查詢
'regexp': {'tlp': 'w+'}
range范圍查詢
'range': {'collectTime': {'gte': '2021-11-02T00:00:00', 'lt': '2021-12-02T23:59:59'}} # gt : 大于 # lt : 小于 # gte : 大于等于 # lte :小于等于
單條件查詢
body ={ 'query':{ 'term': {'source': 'nsfocus'} } }
復合查詢bool
bool有三類查詢關系:
must:必須都滿足
should:只要其中一個滿足
must_not:must_not都不滿足
body = { 'query': { 'bool': { 'must': [ {'range': {'createdTime': {'gte': '2020-11-06T00:00:00', 'lt': '2020-11-06T23:59:59'}}}, {'match': {'createdBy': "['安全幫']"}} ] } } }
切片查詢
# 取20個數據。類似mysql中的limit 0, 20。 注:size可以在es.search中指定,也可以在此指定,默認是10 body = { 'from': 0, # 從0開始 'size': 20 # 取20條數據 }
排序
# 單字段排序 body = { "query":{ # query指定查詢條件,可以使用以上的任何命令 "match_all":{} }, "sort":{ # 對滿足查詢條件的數據按照confidence從小到大排序 "confidence":{"order":"asc"} } } # 多字段排序:先根據confidence升序,再更具threatLevel降序 body = { "query":{ "match_all":{} }, "sort":[{"confidence":{"order":"asc"}}, {"threatLevel":{"order":"asc"}} ], }
聚合
# 查詢滿足條件數據中confidence的最小值 # 聚合:min、max、sum、mean # confidence_age:最小值的key # min:聚合操作 # field:age對age字段進行求最小值 body = { "from": 0, "size": 3, "aggs":{ "confidence_min":{ "min": {"field":"confidence"} } } }
針對不同數據的命令
基礎數據類型
文本數據類型,用于索引全文值的字段。使用文本數據類型的字段,它們會被分詞,在索引之前將字符串轉換為單個術語的列表(倒排索引),分詞過程允許ES搜索每個全文字段中的單個單詞。因此適用于match命令,一般不用于聚合
關鍵字數據類型,用于索引結構化內容的字段。使用keyword類型的字段,其不會被分析(分詞),給什么值就原封不動地按照這個值索引,所以關鍵字字段只能按其確切值進行搜索,適用于term命令,通常用于過濾、排序和聚合。
對比text和keyword數據類型,假如value為"我喜歡運動",以text類型進行存儲為"我喜歡你中國",以keyword類型進行存儲為"我喜歡"、“運動”,假如match查詢時,輸入的條件為"運動",那么以text存儲時是沒有"運動"這個詞的,故查不到;但keyword有,故能查到。假如value為“運動”,無論是text還是keyword,存儲的都是"運動",因此用term和match都是能查到的。
數字類型,這類數據類型都是以**確切值(不會分詞)**存儲的,可以使用"term"查詢精確匹配。ES支持的數字類型有:long、integer、short、byte、double、float、half_float、scaled_float。
"confidence":{"type":"float"}
日期數據類型。由于JSON中沒有表示日期的數據類型,所以ES中的日期可以表示:
日期格式化后的字符串,如:“2021-01-01”
long類型值表示自紀元以來的毫秒數
nteger類型值表示自紀元以來的秒數
如果指定了時區,ES將日期轉換為UTC,然后再存儲為自紀元以來的毫秒數(long類型)。當字段被設置為date類型時,可以自定義日期格式,但如果未指定格式,則使用默認格式:“strict_date_optional_time||epoch_millis”
范圍數據類型。具有大小關系的一個值區間,所以會用到gt、gte、lt、lte…等邏輯表示符。ES支持下面6種范圍數據類型:integer_range、long_range、float_range、double_range、date_range、ip_range
復雜數據類型
在ES中,沒有專門的數組數據類型,但是默認情況下,任意一個字段都可以包含0或多個值,這意味著每個字段默認都是數組類型。不過ES要求數組類型的各個元素值的數據類型必須相同。
假如type是keyword的array,相關命令需要進行更改(添加一個value):"term": {"labels": {"value": "url"}},labels中包含url(不分詞)的數據。
對象類型,類似于python的字典,如下所示是category的數據類型,properties代表了object,針對每個key還可以設置其對應的type
"category":{ "properties":{ "firstCategory":{"type":"keyword"}, "secondCategory":{"type":"keyword"}, "thirdCategory":{"type":"keyword"}}} # 多了一個properties,數字類型時直接是'confidence': {"type":"float"}
對象類型的相關命令也需要進行修改:'term': {"category.firstCategory": "network-attacks"},也可以搭配復合查詢bool使用。
nested數據類型是object的延伸版本。object的value是一個字典,nest是字典構成的數組
object數據舉例:"category": {"firstCategory": "network-attacks", "secondCategory": "botnet"} nest數據舉例:"category": [{"firstCategory": "network-attacks", "secondCategory": "botnet"}, {"firstCategory": "network-attacks", "secondCategory": "botnet", "thirdCategory": "c2"}]
對象類型的相關命令也需要進行修改,使用專門的nested命令,假如插入的一條數據是:
// 插入的數據 { "title":"Speed", "actors":[ { "first_name":"Keanu", "last_name":"Reeves" }, { "first_name":"Dennis", "last_name":"Hopper" } ] } // nested查詢語句 {"query": { "bool": { "must": [ {"match": {"title": "Speed"}}, {"nested": {"path": "actors", "query": { "bool": { "must": [{"match": {"actors.first_name":"Keanu"}}, {"match": {"actors.last_name": "Hopper"}}] } } } }] } } } // 如果數據中first_name的值還是個object,在nested語句中可以寫成actors.first_name.next_objective_key
操作:插入數據(增)
python
from elasticsearch import Elasticsearch def connect_es(): # 連接數據庫 es = Elasticsearch([{'host': 'xxx'}, {'host': 'xxx'}, {'host': 'xxx'}], http_auth=('xxx', 'xxx'), timeout=3600) return es body ={ 'name': 'tom', 'aget': 25 } es = connect_es() # index的作用比較多,通過只傳入body的方式,可以插入一條數據 # 也可以既傳body,也傳id。如果id號不存在,插入該條數據,id號為指定的值;如果id號存在,則更新值 # 如果索引不存在,會直接創建索引 result = es.index(index='indicator', body=body) # es.indices.refresh(index='indicator') # 一定要加上刷新,否則很容易報錯
命令行
// put:需要設定數據ID(同一條數據首次插入是created,再次插入會updated) curl -u elastic:Pis@ta12735f2A56 -PUT "http://127.0.0.1:9200/indicator/_doc/1" -H 'Content-Type: application/json' -d' { "name":"stono", "country":"China", "age":111, "date":"1999-11-11" }'' // post,可選擇設定數據ID(不指定id情況下:同一條數據首次插入是created,再次插入還是created,但_id會變;指定id若id不變第二次插入失敗) curl -u elastic:Pis@ta12735f2A56 -POST "http://127.0.0.1:9200/indicator/_doc/" -H 'Content-Type: application/json' -d' { "name":"stono", "country":"China", "age":111, "date":"1999-11-11" }'
操作:刪除數據(刪)
python(含按id號方式)
from elasticsearch import Elasticsearch def connect_es(): # 連接數據庫 es = Elasticsearch([{'host': 'xxx'}, {'host': 'xxx'}, {'host': 'xxx'}], http_auth=('xxx', 'xxx'), timeout=3600) return es body ={ 'query':{ 'term': {'source': 'nsfocus'} } } # body = { # "query": { # "bool": { # "should": [ # { # "ids": { # "values": ['tool'] # } # } # ] # } # } # } es = connect_es() result = es.delete(index='indicator', body=body) # 通過指定body來查詢數據 es.indices.refresh(index='indicator') # 一定要加上刷新,否則很容易報錯
命令行(含按id號方式)
curl -X POST 'http://10.0.10.11:9200/indicator/_delete_by_query' -H 'content-Type:application/json' -d ' { "query": { "match": { "name": "測試" } } }' // 按id號刪除 curl -X POST 'http://10.0.10.11:9200/indicator/_delete_by_query' -H 'content-Type:application/json' -d ' { "query": { "bool": { "should": [ { "ids": { "values": [1,2] } } ] } } }
操作:修改數據(改)
python
# 方法一:參考插入數據中的index方法 # 同時指定body和id,id存在,更新數據為body;id不存在插入body數據 # 方法二:指定ID單條更新:update data={'doc':{"age":77}} # doc必須存在 es.update(index='test',id=3,doc_type='_doc',body=data) es.indices.refresh(index='test') """ 使用update_by_query批量更新:該方法需要結合painless語言 body分為兩部分: query是查詢語言,表示對query查詢出的數據進行更新 script:表示以腳本的方式修改doc,value就是修改的具體內容 lang:指明腳本的語言,painless表示以es內置的腳本語言進行修改. 此外es還支持多種腳本語言, 如Python, js等等 inline: 腳本內容,也就是更新的內容(本例將createdBy修改為['中國']) ctx: 代表es上下文 _source:表示對_source這個key createdBy:是_source中的一個key params:下方的params參數,這里指定value params: 指定inline中用到的參數 """ body = { "script": { "inline": "ctx._source.createdBy = params.newProps", "lang": "painless", "params": { "newProps": ["中國"] } }, "query": { "match": {"createdBy": '["安全"]'} } } es.update_by_query(index='test2',body=data_all) es.indices.refresh(index='test2')
命令行
curl -X POST 'http://10.0.10.11:9200/indicator/_update_by_query' -H 'content-Type:application/json' -d '{ "script": { "inline": "ctx._source.createdBy = params.newProps", "lang": "painless", "params": { "newProps": ["中國"] } }, "query": { "match": {"createdBy": '["安全"]'} }}'
# 批量修改createdBy,將電信安全改為中國curl -u user:123455 -POST "http://172.160.100.224:9200/indicator/_update_by_query" -H 'Content-Type: application/json' -d '{ "script": { "inline": "ctx._source.createdBy = params.newProps", "lang": "painless", "params": { "newProps": ["中國"] } }, "query": { "match": {"createdBy": '["安全"]'} }}'
操作:查詢數據(查)
python
search的方式:按照body進行查詢,常用該方法
from elasticsearch import Elasticsearchdef connect_es(): # 連接數據庫 es = Elasticsearch([{'host': 'xxx'}, {'host': 'xxx'}, {'host': ''}], xxx http_auth=('xxx', 'xxx'), timeout=3600) return esbody ={ 'query':{ 'term': {'source': 'nsfocus'} }}es = connect_es()result = es.search(index='indicator', body=body) # 通過指定body來查詢數據es.indices.refresh(index='indicator') # 一定要加上刷新,否則很容易報錯
get或者get_source按照id進行查詢:不常用
from elasticsearch import Elasticsearchdef connect_es(): # 連接數據庫 es = Elasticsearch([{'host': 'xxx'}, {'host': 'xxx'}, {'host': 'xxx'}], http_auth=('xxx', 'xxx'), timeout=3600) return eses = connect_es()result = es.get_source(index='indicator', id='indicator-6461a5b7de8c4d2c9e1fcb49fecb0196') es.indices.refresh(index='indicator') # 一定要加上刷新,否則很容易報錯
命令行
// search的方式curl -u user:password -XGET "http://172.16.100.21:9000/indicator/_search?pretty" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} }, "from": 0, "size": 1}'// search的第二種方法:查詢tlp為green的文檔curl -u elastic:Pis@ta12735f2A56 -XGET "http://172.160.111.221:9000/indicator/_search?pretty&q=tlp:green" -H 'Content-Type: application/json'
批量增改
#批量對不同的索引進行增刪改查操作,每個json一行batch_action=[ {"index": {"_index": "test", "_type": "_doc", "_id": "1"}}, # index表示插入 {"name": "tom", "age": 25, "email":"12345@163.com", "company":"test1" }, # 插入的數據 {"index": {"_index": "test", "_type": "_doc", "_id": "2"}}, # index表示插入 {"name": "lucy", "age": 33, "email":"lucy@163.com", "company":"test2" }, # 插入的數據 {"delete": {"_index": "test", "_type": "_doc", "_id": "3"}}, # delete刪除數據 {"create": {"_index" : "test", "_type" : "_doc", "_id": "4"}}, # create插入數據 {"name": "bob", "age": 24, "email":"bob@csdn.com", "company":"test3" }, # 插入的數據 {"update": {"_index": "test", "_type": "_doc", "_id": "5"}}, # 更新數據 {"doc": {"age": "12"}} # 更新的數據字段和值 ]es.bulk(index='test2',doc_type='_doc',body=batch_action)
其他操作
查看es所有索引
python
from elasticsearch import Elasticsearches = Elasticsearch([{'host': '172.160.100.224'}, {'host': '172.160.100.133'}, {'host': '172.160.100.153'}], http_auth=('user', '123456'), timeout=3600)indices=es.indices.get_alias().keys()print(sorted(indices))
命令行模式
curl -u user:123456 -XGET "http://172.160.100.224:9200/_cat/indices?v"
查看index的信息(包括數據類型等)
curl -u elastic:Pis@ta12735f2A56 -XGET "http://172.16.0.224:9200/indicator?pretty" -H 'Content-Type: application/json'
// 完整結果{ "indicator": { "aliases": {}, "mappings": { "properties": { "actTypes": { "type": "integer" }, "categories": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "category": { "properties": { "firstCategory": { "type": "keyword" }, "secondCategory": { "type": "keyword" }, "thirdCategory": { "type": "keyword" } } }, "chainEvidenceId": { "type": "keyword" }, "city": { "type": "keyword" }, "collectSource": { "properties": { "source": { "type": "keyword" }, "valid": { "type": "boolean" } } }, "collectTime": { "type": "date" }, "confidence": { "type": "float" }, "configurations": { "properties": { "cVEDataVersion": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "nodes": { "properties": { "cpe": { "properties": { "cpe22Uri": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "cpe23Uri": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "vulnerable": { "type": "boolean" } } }, "operator": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }, "country": { "type": "keyword" }, "createdBy": { "type": "text" }, "createdTime": { "type": "date" }, "creditLevel": { "type": "integer" }, "cvssInfo": { "properties": { "vKey": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "vValue": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "cvssScore": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "cweId": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "dataType": { "type": "text" }, "description": { "type": "text" }, "extReferences": { "properties": { "externalId": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "sourceName": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "url": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }, "heat": { "type": "long" }, "hitCount": { "type": "long" }, "hitLastTime": { "type": "date" }, "id": { "type": "keyword" }, "idxKey": { "type": "keyword" }, "interfaceType": { "type": "keyword" }, "iocCreateTime": { "type": "date" }, "labels": { "type": "keyword" }, "lang": { "type": "text" }, "lastUpdated": { "type": "date" }, "modifiedBy": { "type": "text" }, "modifiedTime": { "type": "date" }, "modifyCount": { "type": "long" }, "modifyTime": { "type": "date" }, "name": { "type": "text" }, "observables": { "properties": { "displayName": { "type": "text" }, "type": { "type": "keyword" }, "value": { "type": "keyword" } } }, "operator": { "type": "keyword" }, "pattern": { "type": "text" }, "patternType": { "type": "text" }, "patternVersion": { "type": "text" }, "pocFound": { "type": "boolean" }, "public": { "type": "boolean" }, "query": { "properties": { "bool": { "properties": { "must": { "properties": { "match": { "properties": { "observables": { "properties": { "value": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }, "term": { "properties": { "revoked": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }, "must_not": { "properties": { "exists": { "properties": { "field": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } } } } } }, "region": { "type": "keyword" }, "related": { "properties": { "object": { "properties": { "type": { "type": "keyword" }, "value": { "type": "text" } } }, "objectRef": { "properties": { "objId": { "type": "keyword" }, "objTitle": { "type": "text" }, "objType": { "type": "keyword" } } }, "relationship": { "type": "text" }, "threatTypes": { "type": "keyword" } } }, "relatedCount": { "properties": { "infoType": { "type": "keyword" }, "value": { "type": "integer" } } }, "revoked": { "type": "boolean" }, "riskLevel": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "solution": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "sourceRef": { "type": "text" }, "tag": { "properties": { "tagType": { "type": "keyword" }, "tagValues": { "type": "text" } } }, "threatLevel": { "type": "integer" }, "threatTypes": { "type": "keyword" }, "timestamp": { "type": "date" }, "tlp": { "type": "keyword" }, "type": { "type": "keyword" }, "validFrom": { "type": "date" }, "validUntil": { "type": "date" }, "vulnerabilityIds": { "properties": { "cve": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "xf": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } } }, "settings": { "index": { "creation_date": "1604625303266", "number_of_shards": "3", "number_of_replicas": "1", "uuid": "uwv6wSdiTA2zY7SEY5ZsOQ", "version": { "created": "7080099" }, "provided_name": "indicator" } } }}
刪除指定index
python
res=requests.delete(es_http+'/'+'new_index',auth=auth) #刪除索引
命令行
curl -u user:12735 -DELETE "http://172.160.100.224:9000/indicator"
filter_path顯示指定字段
python
添加過濾路徑。通過指定字段,只顯示數據的指定字段信息(默認顯示所有字段的信息)。
from elasticsearch import Elasticsearchdef connect_es(): # 連接數據庫 es = Elasticsearch([{'host': 'xxx'}, {'host': 'xxx'}, {'host': 'xxx'}], http_auth=('xxx', 'xxx'), timeout=3600) # es = Elasticsearch([{'host': 'xxx', 'port': 9200}], timeout=3600) # 不需要密碼 return eses = connect_es()index = 'indicator'body = { "query":{ "match_all":{} }}filter_path=['hits.hits._source.labels', # 字段1 'hits.hits._source.category'] # 字段2res = es.search(index=index, body=body, filter_path=filter_path) # 指定字段:filter_pathprint(res)
命令行
curl -u user:123445 -XGET "http://172.160.100.224:9200/indicator/_search?pretty" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} }, "_source": ["labels", "category"]}'
條件查詢總數
nums = es.count(index='alert', body=body)['count']es.indices.refresh(index="alert")print('------nums------', nums)
翻頁查找
方法1
body={ 'query':{'match_all': {}},}# size:設置一頁數據量result = es.search(index='indicator', scroll='5m', size=5, body=body)es.indices.refresh(index="indicator")# 獲取總的數據量,用于得到總的數據頁數total = result['hits']['total']['value']# 或者nums = es.count(index='alert', body=body)['count']# 獲取初始翻頁idscrid = result['_scroll_id']# 第一頁的數據first_page_data = result['hits']['hits'] # 數據構成的列表# 開始翻頁for i in range(5): #翻5頁 next_page_data = es.scroll(scroll_id=scrid, scroll='5m') next_page_data = next_page_data['hits']['hits'] # 數據構成的列表
方法2(推薦)
# 設置一頁的數據量content_size = 100 # 獲取的總的數據量# 按常規方法進行第一次查詢first_body = { "query": { "match_all": {} }, 'sort': [ {"confidence": "asc"}, {"_id": "desc"}], # 按照confidence和_id排序,后續會根據這兩個值進行排序 'size': 10 # 指定當前頁數據量}first_reslut = es.search(index='tool', body=body)['hits']['hits']es.indices.refresh(index="tool")# 主要內容是first_result['_source']['collectSource']# 獲取最后一個文檔sort后的confidence與id值next_id = first_result[-1]['_source']['sort'] # 返回的結果是[80.0, 'tool-fffa800581654d5fa6ff0051a9e61563']size_cont = len(first_result) while content_size==size_cont: # 若數據量不等于指定的數據量,說明遍歷到最后的一頁數據了 second_body = { "query": { "match_all": {} }, 'sort': [ {"confidence": "asc"}, {"_id": "desc"}], 'search_after': next_id, # second_body和firt_body僅相差一行代碼:從此數據之后的第1個數據開始,但不包含此數據 'size': 10 } next_result = es.search(index='tool', body=body)['hits']['hits'] es.indices.refresh(index="tool") next_id = next_result[-1]['_source']['sort'] for result in next_result: print(result)
Elasticsearch Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。