C (+ ซ็อกเก็ต), 433 429 280 276 270 259 ไบต์
#define H"medalbot.com"
char**p,B[999],*b=B;main(f){connect(f=socket(2,1,getaddrinfo("www."H,"80",0,&p)),p[4],16);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);read(f,b,998);for(f=3;f--;puts(p))b=strchr(p=strstr(++b,"_n")+9,34),*b=0;}
ดังนั้นปรากฎว่า C นั้นยอดเยี่ยมในการดาวน์โหลดทรัพยากรจากอินเทอร์เน็ตและแยกวิเคราะห์เป็น JSON ใครจะรู้
รหัสนี้คือ (โดยปกติ) super lax พร้อมการตรวจสอบข้อผิดพลาดดังนั้นฉันเดาว่า medalbot.com ต้องการส่งข้อมูลที่เป็นอันตรายที่พวกเขาสามารถเรียกใช้บัฟเฟอร์โอเวอร์โฟลว์ ฯลฯ ได้นอกจากนี้โค้ดล่าสุดยังคาดหวังว่าค่าคงที่สำหรับค่าคงAF_INET = 2
ที่ จะอาจจะเป็นกรณีที่ได้ทุกที่ แต่ก็ไม่รับประกัน
นี่คือรหัสดั้งเดิมที่ไม่บอบบางดังนั้น (แต่ยังไม่แข็งแกร่งหรือปลอดภัยมาก):
#include<netdb.h>
#define H"medalbot.com"
char*b,*B,d[999];struct addrinfo*p,h;main(f){h.ai_socktype=SOCK_STREAM;getaddrinfo("www."H,"80",&h,&p);f=socket(p->ai_family,p->ai_socktype,p->ai_protocol);connect(f,p->ai_addr,p->ai_addrlen);send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost: "H":80\r\nConnection: close\r\n\r\n",92,0);recv(f,d,998,0);for(f=0,b=d;f<3;++f)B=strstr(b,"_n")+9,b=strchr(B,'}'),*strchr(B,'"')=0,puts(B);}
ชำรุด:
// No imports needed whatsoever!
#define H"medalbot.com" // Re-use the host in multiple places
char**p, // This is actually a "struct addrinfo*"
B[999], // The download buffer (global to init with 0)
*b=B; // A mutable pointer to the buffer
main(f){
// Hope for the best: try the first suggested address with no fallback:
// (medalbot.com runs on Heroku which has dynamic IPs, so we must look up the
// IP each time using getaddrinfo)
f=socket(2,1,getaddrinfo("www."H,"80",0,&p));
// 2 = AF_INET
// 1 = SOCK_STREAM
// (may not match getaddrinfo, but works anyway)
// 0 = IP protocol (getaddrinfo returns 0 on success)
connect(f,p[4],16); // struct addrinfo contains a "struct sockaddr" pointer
// which is aligned at 32 bytes (4*8)
// Send the HTTP request (not quite standard, but works. 69 bytes long)
send(f,"GET http://"H"/api/v1/medals HTTP/1.1\r\nHost:"H"\r\n\r\n",69);
// (omit flags arg in send and hope 0 will be assumed)
read(f,b,998); // Get first 998 bytes of response; same as recv(...,0)
// Loop through the top 3 & print country names:
// (p is re-used as a char* now)
for(f=3;f--;puts(p)) // Loop and print:
p=strstr(++b,"_n")+9, // Find "country_name": "
b=strchr(p,34), // Jump to closing "
*b=0; // Set the closing " to \0
}
สิ่งนี้ไม่ดีสำหรับเซิร์ฟเวอร์เนื่องจากเราไม่ได้ส่งConnection: close\r\n
เป็นส่วนหนึ่งของคำขอ HTTP นอกจากนี้ยังละเว้นAccept
ส่วนหัวเนื่องจาก medalbot.com ดูเหมือนจะไม่ใช้การบีบอัดในทุกกรณีและพลาดช่องว่างหลังHost:
(อีกครั้งเซิร์ฟเวอร์ดูเหมือนว่าจะตกลงกับสิ่งนี้) ดูเหมือนว่าจะไม่สามารถลบสิ่งอื่นออกได้
เมื่อการแข่งขันกีฬาโอลิมปิกสิ้นสุดลงพฤติกรรมที่เป็นไปได้มากที่สุดสำหรับโปรแกรมนี้คือ segfault พยายามที่จะอ่านตำแหน่งของหน่วยความจำ 9. เว้นแต่แฮ็กเกอร์ชั่วร้ายจะเข้ายึดโดเมนซึ่งในกรณีนี้พฤติกรรมที่เป็นไปได้มากที่สุดคือ โครงสร้างข้อมูลซึ่งอาจไม่อันตรายเกินไปจริง แต่ใครจะบอกกับแฮ็กเกอร์ผู้ชั่วร้ายเหล่านี้ได้บ้าง