Do sự cố mạng hoặc truyền sai tham số nên gọi API xử lý hàng trăm đơn hàng bị lỗi, cần phải gọi lại. Làm sao để không phải làm thủ công từng đơn nhỉ?
Cụ thể hơn nhé: Sau khi khách thanh toán thành công để mua thẻ điện thoại, thì phải gọi API để gửi SMS mã thẻ và mã seri cho khách. Năm tháng qua đi, chẳng thấy SMS bị lỗi bao giờ. Bỗng một ngày đẹp trời bị lỗi và phải gọi lại hàng trăm SMS. Trên tool quản trị bằng web với mỗi đơn hàng có sẵn 1 link là "Gửi lại SMS" rồi, dạng như: /tool/re-send-sms?madon=abcxyz&_token=7749hacktaodi&_extra=huypv
Giờ làm sao để thực hiện lại việc này nhanh nhất thay vì CSKH vào từng đơn và click "Gửi lại SMS"
Lúc này cần coder làm gì đó để auto chứ thủ công thì mỏi tay quá. Lời giải là vào DB lấy data rồi sinh ra danh sách các URL cần gọi lại
Có các URL này rồi thì chỉ cần cho ra file run.bat dạng như sau là được
curl "link1"
curl "link2"
curl "link3"
Ố ồ, nhưng mà thằng API kia nó ko cho gọi liên tục nhanh như vậy mà cách 3 giây mới được gọi chẳng hạn thì phải làm sao
curl "link1"
timeout -n 4 > NUL
curl "link2"
timeout -n 4 > NUL
curl "link3"
(Lưu ý mình đang dùng Windows nhé, Linux thì chắc cũng có lệnh tương tự để sleep thôi)
Ngon rồi, ơ nhưng mà cái link đấy phải admin login vào rồi mới có quyền gọi, làm sao bây giờ nhỉ?
curl --cookie "key1=val1;key2=val2;..." "link1"
timeout -n 4 > NUL
curl --cookie "key1=val1;key2=val2;..." "link2"
timeout -n 4 > NUL
curl --cookie "key1=val1;key2=val2;..." "link3"
curl "link3"
hoặc là lấy (read) cookie từ file
curl -b /path/to/cookiefile "link1"
Nếu không muốn động chạm cookie và trên admin có sẵn jQuery (thường thì có luôn rồi) thì có thể F12 và chạy lệnh xem log cũng được:
$a = ["link1", "link2", "link3", ...];
i = setInterval(function() { if ($a.length == 0) { clearInterval(i); console.log('Stop'); return; } u=$a.pop();$.get(u, function(d) {console.log(u, d);});}, 15000);