ปรึกษาครับ GET ข้อมูลมาได้แค่ 1000 Limit ต้องการให้ได้ 2000+ Limit ทำอย่างไร ต้องใช้อะไรมาช่วยครับ ขอแนวทางด้วยครับ
จากโค้ดที่ให้มาแค่นั้น ดูแล้วเป็นการเชื่อมต่อระหว่างแอพของเรา กับแอพของคนอื่น เป็น API (ย่อมาจากอะไรใช้ google หาเอา)
ดังนั้นวิธีการเชื่อมต่อกับเขาแล้วกำหนด limit ข้อมูล มันต้องมีเอกสารของเขามาประกอบว่าวิธีการ limit ข้อมูลทำอย่างไร
แต่ในเมื่อไม่มีข้อมูลอะไรเพิ่มเติม เช่น เชื่อมต่อกับที่ไหน, URL อะไร, จะไปหาเอกสารของเขาได้ยังไง ก็ตอบไม่ได้ว่าต้องทำอย่างไร
เพราะแต่ละแห่งจะมีคำสั่ง limit ข้อมูลไม่เหมือนกันบ้าง หรือเหมือนกันบ้าง เดาสุ่มไปก็ไม่รู้อีกกี่วันจะถูก
แล้วก็ดูแล้วไม่ใช่ภาษา PHP แต่แท็กภาษา PHP............
==update======
ดูจากตัวอย่างผลลัพธ์
มันอยู่ที่คำสั่ง limit=xxx ก็ไปแก้ตรงนั้น แต่ไม่มี URL ตัวอย่างที่เรียกใช้ ก็เดาๆไปว่าเอา URL เดิมแล้วเติม &limit=2000
ประวัติการแก้ไข 2021-08-19 17:43:59
Date :
2021-08-19 17:42:33
By :
mr.v
ตอบความคิดเห็นที่ : 1 เขียนโดย : mr.v เมื่อวันที่ 2021-08-19 17:42:33
รายละเอียดของการตอบ ::
ขอบคุณคำแนะนำครับ
ตอบ
อธิบายเพิ่มเติมครับ
1. ใช้ api url เชื่อมต่อกับ web
1.1 ไม่ใช่ app เดี๋ยวเข้าใจผิดกันหมดครัล
1.2 ไม่ใช่การเชื่อมต่อ แอพของเราและแอพของคนอื่น
1.3 แต่คือ การใช้ api url ไปดึงข้อมูลจาก web ของเราเอง จุดประสงค์คือดึงข้อมูล ioc เพื่อทำ test
1.4 api_url limit มาให้แค่ 1000
1.5 สิ่งที่ต้องการแนวทางจากทางเว็บ คือ เมื่อ api_url limit มาให้แค่ 1000 แต่เราต้องการมากกว่า 1000 limit คือ 2000+ (จะใช้วิธีไหนได้บ้างครับ)
1.6 หลังจาก get ioc ได้มากกว่า 2000+ จึงจะทำการ import ioc ชุดนี้เข้าไปใหม่ครับ
1.7 ส่วนที่บอกว่าใส่ &limit=2000 ข้อนี้ที่ผมอธิบายไปคือข้อ 1.5 api_url limit มาให้แค่ 1000 ผมลอง limit เป็น 2000 ก้ไม่ได้ครับ
2. key ใช้ในการ authen คือ เอามาจากทาง web ของเราเองครับ
3. เอกสารไม่ได้บอกในเรื่องของการทำ limit ว่าถ้า ต้องการ limit 2000+ ใช้วิธีนี้ ในเอกสารไม่มีครับ เลยมาถามในเว็บนี้ เผื่อมีคนรู้ครับ
4. ในเอกสารผมทำตามเอกสารครับ code ที่ผมแป๊ะไว้เลยครับ
5. ขอภัยที่ติด tag php แต่ที่จริงใช้ python พอดีผมหา tag python ไม่เจอ ไม่รู้ tag python มีหรือเปล่า ก็ขออภัยด้วยครับ
ประวัติการแก้ไข 2021-08-19 19:05:24
Date :
2021-08-19 18:53:26
By :
TeeTs
ถ้า api เป็นของคนอื่น ต้องไปดูคู่มือของเขาว่า ถ้าต้องการข้อมูลมากกว่า 1000 ต้องทำอย่างไร
ถ้า api เป็นของเราเอง ต้องไปดูว่า code เขียนไว้อย่างไร
้ถ้าเป็น endpoint แบบมาตราฐาน ไม่ว่าจะเขียนด้วยภาษาใด ก็จะมีคู่มือไว้ให้เสมอครับ โดยเฉพาะ framework ของ python จะมีคู่มือค่อนข้างดีเลยครับ
ดูจากของคุณคือ คุณเขียน python ไปดึงข้อมูลจาก api มาใช้งานก็ต้องไปดูว่า api ที่คุณไปดึงข้อมูลมานั่นแหละ ว่า ต้องส่ง paramiter อะไรไปบ้างเพื่อให้ได้ข้อมูลตามต้องการ
ประวัติการแก้ไข 2021-08-20 11:50:17 2021-08-20 11:54:50
Date :
2021-08-20 11:47:09
By :
Songkram
แนะนำได้แค่ หาค่า Start,Offset โดยเขียนเป็น Loop
- ต้องทำ Loop 2 รอบ ถ้าเป็น PHP SQL จะประมาณ $sql = "SELECT * FROM Orders LIMIT 15(OFFSET), 10"; เริ่มต้น OFFSET ที่ 16 โดยต้องการแค่ 10 Record เสร็จแล้วนำค่าได้แถวสุดท้ายไปใส่แทน OFFSET แรก
- เมื่อคุณดึงข้อมูลเยอะขนาดนี้สิ่งที่คุณต้องเรียนรู้เพิ่มเกี่ยวกับพวก javascript หรือ JSON คือ การทำ Promise เพื่อให้ดึง Response ให้เสร็จสิ้นก่อนค่อยทำบรรทัดถัดไป เพราะ javascript จะ Run แต่ละแถวไปเลยโดยที่มันจะไม่รอแถวก่อนหน้าให้เสร็จสิ้น
Promise ที่นิยมตอนนี้คือ async await
Example
async function getData() {
try{
let response = await fetch('API_ROUTE');
return await response.json();
}catch(err){
console.error(err);
// Handle errors here
}
}
Date :
2021-08-20 21:58:01
By :
Genesis™
การสื่อสารที่ผิดพลาด
สาว: Dog แปลว่า อะไร
หนุ่ม: มึงอย่ามาหลอกกู
สาว: กูไปหลอกอะไรมึง
หนุ่ม: What ต่างหากที่แปลว่า อะไร
Date :
2021-08-23 11:16:37
By :
ผ่านมา
api กำหนด ครั้งละ 1000 เพื่อไม่ให้หนักเซิฟเว่อร์ ใช้เวลาเยอะ
ก็เรียก ไป 2 ครั้ง ได้หรือไม่ แล้วให้ client จัดการรวมเป็นชุด data เดียวกัน
Date :
2021-08-24 20:27:30
By :
Chaidhanan
ตอบความคิดเห็นที่ : 16 เขียนโดย : TheGreatGod_of_Death เมื่อวันที่ 2021-08-23 17:15:27
รายละเอียดของการตอบ ::
2 code นี้จะเชื่อมกันได้อย่างไรครับ
1. code ที่ได้ทำ
Code
import requests
import json
# url
url = "api.xxx.com"
api_key ="xxx"
user = "xxx"
headers = {
"Content-Type": "application/json",
"Authorization": "apikey " + user + ":" + api_key,
}
response = requests.get(url, verify=False, headers=headers)
print(response.json())
print("status_code = " + str(response.status_code))
2.คือ code ที่เขาให้มาครับ น่าจะยังไม่มีการ loop parameter next ครับ
Code
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
str_match_next = ''.join(match_next)
while match_next != []:
url = "https://api.threatstream.com" + str(str_match_next)
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
ประวัติการแก้ไข 2021-08-25 10:47:52
Date :
2021-08-25 10:46:27
By :
TeeTs
- ต้องอธิบายก่อนครับ next ของ API มันคือ การส่ง Client ไปยังหน้าเพจต่างๆที่เรากำหนดเมื่อได้รับ response status == 200
Next()
app.get("/", (req, res, next) => {
next();
}
- หาคุณต้องการ 2000 record คุณต้องมี Loop 2 รอบ ก่อนเข้า next() หรือคุณอาจใช้การเขียนแบบ Recursive ก็ได้
- แต่คุณต้องไปถามฝั่งโน้นก่อนว่า ถ้าจะกำหนดเริ่มต้น Record Offset ต้องทำยังไง จะต้องทำการส่งลักษณะไหน หรือถ้าฝั่ง Frontend ต้องการส่ง Parameter ค่า ID Record เริ่มต้นต้องทำอย่างไร ฝั่ง javascript ไม่ว่าจะเป็น React,Vue,Next,Nuxt เค้าจะเรียกค่าส่วนนี้ว่า q ผ่าน URL (ไปขอ pattern ส่วนนี้เค้ามา)
- ส่วนสุดท้าย Record ที่ได้มา มันมาที่ละ 1000 Record ตามที่เคยบอกไว้ javascript อะไรพวกนี้มันจะไม่รอให้บรรทัดก่อนหน้าให้เสร็จสิ้น แต่มันจะรันต่อไปเรื่อยๆ โดยไม่หยุดรอ เพราะฉะนั้นในการเข้า Loop ครั้งที่ 2 ข้อมูลได้คละกันมั่วแน่ๆ คุณจำเป็นต้องไปเรียนรู้เรื่อง Promise ที่เป็น async await เพื่อทำการรอบรรทัดปัจจุบันให้ Process เสร็จสิ้นก่อนค่อยทำบรรทัดถัดไป
async await
async function f() {
try {
let response = await fetch('ROUTE_API');
let user = await response.json();
console.success('ผ่าน', user);
} catch(err) {
console.error('พัง', err);
}
}
f();
แนะนำได้แค่นี้ครับ
ประวัติการแก้ไข 2021-08-25 11:50:12 2021-08-25 11:52:39
Date :
2021-08-25 11:49:14
By :
Genesis™
update code
Code (Python)
import requests
import re
import json
url = "api.xxx.com"
api_key ="xxx"
user = "xxx"
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
str_match_next = ''.join(match_next)
while match_next != []:
url = "api.xxx.com" + str(str_match_next)
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
print(response.json())
print("status_code = " + str(response.status_code))
response มาแบบนี้ครับ
PS C:\xampp\htdocs\api> & "C:/Program Files/Python38/python.exe" c:/xampp/htdocs/api/anomali/test.py
C:\Program Files\Python38\lib\site-packages\urllib3\connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'api.threatstream.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
warnings.warn(
Traceback (most recent call last):
File "c:/xampp/htdocs/api/anomali/test.py", line 19, in <module>
print(response.json())
File "C:\Program Files\Python38\lib\site-packages\requests\models.py", line 900, in json
return complexjson.loads(self.text, **kwargs)
File "C:\Program Files\Python38\lib\json\__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "C:\Program Files\Python38\lib\json\decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Program Files\Python38\lib\json\decoder.py", line 355, in raw_decode
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
PS C:\xampp\htdocs\api>
Date :
2021-08-25 13:31:42
By :
TeeTs
ก่อนอื่นทำความเข้าใจ endpoint
แล้วศึกษาพื้นฐาน Python จาก
https://www.w3schools.com/python/default.asp
โดยเฉพาะสิ่งเหล่านี้
https://www.w3schools.com/python/python_lists_loop.asp
https://www.w3schools.com/python/python_dictionaries.asp
https://www.w3schools.com/python/python_json.asp
https://www.w3schools.com/python/module_requests.asp
https://www.w3schools.com/python/python_regex.asp
Quote: Python Dictionary ≠ JSON
print(response.json() ) ได้ Python Dictionary
ทำให้ RegEx pattern ที่เขาให้มา
r"\"next\": \"(.*?)\""
จะไม่ตรงและค้นหา string ไม่เจอ
ในตัวอย่างเขาจึงใช้ text property จะได้
response เป็น JSON string ตาม pattern
Code
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text , re.MULTILINE | re.IGNORECASE)
ต่อไป มาดูตัวอย่างการสร้าง endpoint
จากการจำลอง response string
Code (Python)
import re
txt = """{
{When will snow falling in Thailand},
{'next': '/api/path/?page=2'},
{what is the next sample?},
{'next': '/api/path/?page=3'}
}"""
# result in list
l = re.findall(r"'next': '(.*?)'",txt, re.MULTILINE | re.IGNORECASE)
print('List:', end = ' ')
print(l)
# join() has no use place, just remove these two lines
j = ''.join(l) # remove it
print('\nJoin: ' + j) # remove it
print('\nLoop:')
# Method 1
for v in l:
url = "https://api.xxx.com" + v
print(url)
"""
# Method 2
while l != []: # in order to use this form of condition, pop() method is required
url = "https://api.xxx.com" + l[0]
print(url)
l.pop(0)
"""
พอเห็นภาพบ้างหรือไม่ ...ถ้าไม่ ต้องศึกษาพื้นฐาน python ให้เข้าใจก่อน
ทีนี้ลองประยุกต์กับ requests module
สงสัยหรือตัดขัดอะไร ค่อยถามครับ
Date :
2021-08-25 15:32:14
By :
TheGreatGod_of_Death
JSON vs Python Dictionary
JSON เป็น string มีรูปแบบตามนี้ ***https://www.json.org/json-en.html ***
Python Dictionary เป็น data structure (in-memory object )
*** ถ้าสังเกต(รูปแบบ string) เมื่อ print() dict จะได้ผลลัพธ์ ต่างจาก print() json
เมื่อใช้ json module ใน Python
json.loads() แปลง json เป็น dict
json.dump(), json.dumps() แปลง dict เป็น json
อยู่ในลิงค์ที่ผมให้ไปหมดแล้ว...พยายามทำความเข้าใจเอา
Quote: print(response.json()) ทำไมไม่ได้เป็น json หรือครับ และทำไมได้เป็น Python Dictionary
จริงๆ print(xxx) ได้ output string แต่ส่วนที่ได้ dict คือ response.json()
ผมตอบไม่ได้เหมือนกันว่าเพราะอะไร...ต้องไปถามคนสร้างและคิดชุด module requests
บอกได้แค่ที่มา ที่เขา(กลุ่มคนคิดโมดูล) ระบุไว้ในเอกสารการใช้โมดูล requests
https://docs.python-requests.org/en/latest/api/#requests.Response.json
ใจความว่า
Quote: json (**kwargs)
Returns the json-encoded content of a response, if any.
Parameters: **kwargs – Optional arguments that json.loads takes.
Raises: requests.exceptions.JSONDecodeError – If the response body does not contain valid json.
Quote: ผมต้องเอา Python Dictionary ไปแปลงเป็น json โดยใช้ RegEx
การแปลงระหว่าง
Python Dictionary <-> JSON
ไม่จำเป็นต้องใช้ RegEx
แต่ใช้ loads(), dumps() method ตามที่กล่าวไปแล้วข้างต้น
ส่วน RegEx นำมาใช้ในการค้นหา string ที่มี pattern เช่น wildcard, ...
แล้วทำไมต้องหา string? ...เพราะ response ได้กลับมาเป็น string
ตัวอย่างที่ผมให้ไปไม่เข้าใจเลย ???
จุดประสงค์ที่ให้ตัวอย่าง เพื่อบอกให้รู้ว่า
โค้ดวิธีการดึง limit=1000 หลายรอบจนครบที่ต้องการ (limit=2xxx)
ที่ admin คุณส่งมาให้ ตามนี้
Code (Python)
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
str_match_next = ''.join(match_next)
while match_next != []:
url = "api.xxx.com" + str(str_match_next)
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
มีทั้งข้อดีและเสีย
ดี - ป้องกัน fake-Developer (Copier) นำโค้ดไปคัดลอกวาง โดยไม่ดูให้ดีก่อน
...เนื่องจาก syntax/logic เพี้ยนหรือไม่เป๊ะ แต่ก็เป็นแนวทางไปสู่จุดหมาย (limit > 1000)
เสีย - ป้องกันแม้กระทั่ง Entry-Programmer...ซึ่งผมทำเป็นกรณีศึกษา/สร้างบทเรียนการปฏิบัติ
ในตัวอย่างนั้นแล้ว เช่น while match_next != []: ถ้าจะใช้ต้องมี pop(0) เป็นต้น
ยังไงลองศึกษาดู...ช้าๆ มักได้ของ งาม
Date :
2021-08-25 20:10:36
By :
TheGreatGod_of_Death
ตอบความคิดเห็นที่ : 35 เขียนโดย : TheGreatGod_of_Death เมื่อวันที่ 2021-08-25 20:10:36
รายละเอียดของการตอบ ::
code ชุดนี้ยังไม่ parameter next loop ใช่ไหมครับ
Code
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
str_match_next = ''.join(match_next)
while match_next != []:
url = "api.xxx.com" + str(str_match_next)
response = requests.get(url, headers={"Content-Type": "application/json"}, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
ข้อมูลที่เขาแนะนำมา คือ
1.แนะนำ code ที่ให้มา
2.บอกไป collect value ใน loop นั้นๆ จนกว่าจะจบใส่ array อันหนึ่ง (ผมไม่รู้อีก)
3.เขาบอกว่า เขาใช้พวก regex มาช่วยดึง data ที่ต้องการ ไม่ได้ใช้พวก json.load อะไรแบบนั้น (ผมไม่รู้อีก ผมศึกษา regex ที่พี่แนะนำก็ไม่เข้าใจอีก)
4.เขาบอกว่า มันดีตรงที่ flexible มาก แต่ต้องไปเขียน regex เพิ่มเอาเอง แล้วเอามาใส่ใน code อีกที (ผมไม่รู้อีก ว่าจะเขียนยังไง)
4.ข้อนี้ผมจะทำยังไงดี ตอนนี้ที่ผมทำได้คือ get มาได้ 1000 limit จาก no.1
แสดง ผมต้องเขียน loop ขึ้นมาเองได้ยังไงครับ ศึกษาจากตัวที่พี่ให้ จาก w3school ศึกษานะ ก็เป็นแบบ basic แต่ผมจะเขียนให้มัน loop ครั้งล่ะ 1000,1000,1000 จะประยุกต์ใช้กับงานยังไงครับ
หรือผมต้องไปถามเขาก่อนว่า loop next ทำแบบไหนใช่ไหมครับ
Date :
2021-08-26 11:32:23
By :
TeeTs
ผมเลือกให้เลยแล้วกัน
โค้ดดึงข้อมูลจาก api(ของคุณ TEEST โดยเฉพาะ)
แบบ limit=1000*3
แบบก็อปวาง 99.99% (สำหรับ non-Programmer)
import requests
import json
import re
# url
url = "xxxx"
api_key ="xxxx"
user = "xxxx"
headers = {
"Content-Type": "application/json",
"Authorization": "apikey " + user + ":" + api_key,
}
response = requests.get(url, headers=headers, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
data = [response.text]
for i in range(2):
if len(match_next) > 0:
url = "api.xxx.com" + match_next[0]
response = requests.get(url, headers=headers, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
data.append(response.text)
print(json.dumps(data, indent=4))
อีก 0.01% คือ ค่าผิดพลาดจากการแทนค่า API endpoint และ Python indentation(ย่อหน้า) และ Typos ถ้ามี (แต่คงไม่)
ถ้าจะพลาดได้ขนาดนั้นก็...
ปิดจ๊อป
Date :
2021-08-26 14:01:40
By :
TheGreatGod_of_Death
ตอบความคิดเห็นที่ : 37 เขียนโดย : TheGreatGod_of_Death เมื่อวันที่ 2021-08-26 12:17:20
รายละเอียดของการตอบ ::
เอาแบบที่ 1 ครับ
1. อยากทำความเข้าใจ โดยให้คุณอธิบายเพิ่มเติมครับ และในตัวอย่างที่แนะนำมาจาก no.33 ที่ให้ไปประยุกต์กับ requests module อันนี้ผมยังไม่เข้าใจครับ
2.no.33 ตรง code python ที่บอกให้ประยุกต์กับ requests module ผมลองทำดูแต่ยังผิดครับ ให้คำแนะนำได้ครับ
Code (Python)
import requests
import re
url = "api.xxx.com"
api_key ="xxx"
user = "xxx"
headers={
"Content-Type": "application/json",
"Authorization": "apikey " + user + ":" + api_key,
"next": "api.xxx.com",
"next": "api.xxx.com"
}
response = requests.get(url, headers=headers, verify=False)
# Method 1
match_next = re.findall(r"'next': '(.*?)'",response.text, re.MULTILINE | re.IGNORECASE)
str_match_next = ''.join(match_next)
print(match_next)
# Method 2
while match_next != []:
url = "api.xxx.com" + str(str_match_next)
response = requests.get(url, headers=headers, verify=False)
match_next = re.findall(r"\"next\": \"(.*?)\"",response.text, re.MULTILINE | re.IGNORECASE)
print(url)
match_next.pop()
3.ผลลัพธ์ครับ ได้ค่านี้ []
Code
PS C:\xampp\htdocs\api> & "C:/Program Files/Python38/python.exe" c:/xampp/htdocs/api/anomali/test1.py
C:\Program Files\Python38\lib\site-packages\urllib3\connectionpool.py:1013: InsecureRequestWarning: Unverified HTTPS request is being made to host 'api.threatstream.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
warnings.warn(
[]
PS C:\xampp\htdocs\api>
Date :
2021-08-26 14:18:35
By :
TeeTs
ตอบความคิดเห็นที่ : 40 เขียนโดย : TeeTs เมื่อวันที่ 2021-08-26 14:26:30
รายละเอียดของการตอบ ::
ที่ผมไม่รอ เพราะผมจะไม่อยู่แล้ว...
ที่นี่ไม่ได้ประโยชน์อะไร
ผมจะไปปลูกผัก เลี้ยงสัตว์ กินอยู่ที่บ้าน
ปล.ผมก็ไม่ใช่โปรแกรมเมอร์...แค่สนใจและเรียนเอง
เพียงมีเวลา (หมกมุ่นกับมัน)
ที่เคยเรียนสมัย มัธยม อุดมฯ มีแค่ c/c++/vb
PHP ? Python? , ...9รอ9
No ผมไม่เคยรู้จักมาก่อน
เพิ่งมาดู doc ช่วงหลังๆ ปีสองปีนี้เอง
ปล.2 คำตอบสุดท้ายของสุดท้าย
ลาก่อน ThaiCreate (ค้นพบโดยบังเอิญ เมื่อ 15 ปีที่แล้ว)
Date :
2021-08-26 14:34:51
By :
TheGreatGod_of_Death
Load balance : Server 03