Viết mã nguồn tự động thông báo điểm UIT (Phần 1)

Hôm nay mình sẽ hướng dẫn các bạn viết ứng dụng thông báo điểm học tập trên UIT. Hệ thống sẽ thông báo thông qua email, Messenger facebook.

 

Bài viết này gồm 2 phần:

Phần 1: Nói sơ về cách xử lí và một số thư viện cần dùng

Phần 2: Mã nguồn hoàn chỉnh và cách cài đặt

Bạn có thể test thử tại fanpage Notification KT24H

Bạn có thể test thử tại fanpage Notification KT24H

 

Yêu cầu

– Web hosting (php, mysql, curl, outgoing port 465)

– SSL domain

– PHPMailer

Botman

1. Ý tưởng kiểm tra và thông báo điểm

– Thông thường các bạn sẽ vào trang này https://daa.uit.edu.vn/sinhvien/kqhoctap đăng nhập rồi xem điểm của mình, để ý thêm sẽ thấy mục in bảng điểm theo đường dẫn này https://daa.uit.edu.vn/print/sinhvien/kqhoctap/ Ok như vậy mình sẽ lấy dữ liệu điểm ở đây.

– Như vậy nếu thông tin điểm số, các mục trong bảng điểm đó thay đổi thì mình mới quan tâm đến.

– Mình sẽ tiến hành lưu bảng điểm trước đó, và ở những lần sau mình kiểm tra xem 2 bảng điểm đó có khác nhau không, nếu khác thì mình lưu lại bảng điểm mới và thông báo cho người dùng.

2. Sử dụng CURL để đăng nhập và lấy dữ liệu

Phân tích form đăng nhập tại https://daa.uit.edu.vn/user

Mình lấy được các phần chính trong source form đăng nhập như sau:

<form action="https://daa.uit.edu.vn/user" method="post" id="user-login" accept-charset="UTF-8" _lpchecked="1">

<input type="text" id="edit-name" name="name" value="" size="60" maxlength="60" class="form-text required" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=&quot;); cursor: auto;" autocomplete="off">

<input type="password" id="edit-pass" name="pass" size="60" maxlength="128" class="form-text required" style="background-image: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGP6zwAAAgcBApocMXEAAAAASUVORK5CYII=&quot;); cursor: auto;" autocomplete="off">
       
<input type="hidden" name="form_build_id" value="form-Om37v4ngwmGX1JoLeeqdaFt-tROVqrcfM-3GsC5v5iw">

<input type="hidden" name="form_id" value="user_login">

<input type="submit" id="edit-submit" name="op" value="Đăng nhập" class="form-submit">
</form>

Như vậy mình sẽ post cho nó các data như sau

$postdata = “name=”.addslashes($username).”&pass=”.addslashes($password).’&form_build_id=form-Om37v4ngwmGX1JoLeeqdaFt-tROVqrcfM-3GsC5v5iw&form_id=user_login&op=Đăng%20nhập’;

Post data và lấy dữ liệu:

$username = "";
$password = "";
// username và pass của bạn

$url="https://daa.uit.edu.vn/user/login/";
$postdata = "name=".addslashes($username)."&pass=".addslashes($password).'&form_build_id=form-Om37v4ngwmGX1JoLeeqdaFt-tROVqrcfM-3GsC5v5iw&form_id=user_login&op=Đăng%20nhập'; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $file_cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 

curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_exec($ch); 
	
curl_setopt ($ch, CURLOPT_URL, "https://daa.uit.edu.vn/print/sinhvien/kqhoctap"); 
curl_setopt($ch, CURLOPT_POST, false);

$result = curl_exec($ch);

Sau khi đăng nhập xong mình sẽ lấy dữ liệu kết quả học tập.

Lúc này biến $result là source html của trang https://daa.uit.edu.vn/print/sinhvien/kqhoctap

3. Kiểm tra sự thay đổi, cập nhật và thông báo người dùng

– Để đơn giản mình sẽ so sánh sự khác biệt của chúng bằng md5

– Tuy nhiên code trong biến $result có chứa link css và js, nhìn sơ mình đoán rằng nó được sinh từ cache, nên có thể nó sẽ thay đổi url trong một thời gian, nếu sử dụng md5 thì chắc chắn sẽ thông báo sai.

Code html trang in bảng điểm có link css, css tạo bằng cache

Code html trang in bảng điểm có link css, css tạo bằng cache

– Lúc này chúng ta nhận xét thêm, đoạn code show bảng điểm chủ yếu bắt đầu từ đoạn <div class=”print-content”>  và kết thúc tại </strong></font></div> Nên mình sẽ dung hàm preg_match để lấy thành phần trong đó, và không quan tâm đến các link css, js ở trên.

preg_match('#<div class=\"print-content\">(.*?)<\/strong><\/font><\/div>#s', $result, $res);
$data = $res[0].'</strong></font></div>';

Sau khi mình lấy được dữ liệu lưu vào biến $data mình tiến hành so sánh md5 của dữ liệu vừa lấy được với md5 đã lưu trước đây.

$oldcode = .....// dữ liệu cũ lấy từ database
$newcode = md5($data);

if ($oldcode!=$newcode) 
{
    // Update lại md5 cho database
    // thông báo cho người dùng
}

Sau khi đưa vào sử dụng một thời gian, có những thời điểm hệ thống báo sai, qua phân tích mình phát hiện, khi server UIT down hoặc người dùng nhập cung cấp sai pass, thì dữ liệu get được của nó chẳng có gì, điều này khiến md5 của nó trong database cũng thay đổi theo, để khắc phục việc này mình đã thay if ($oldcode!=$newcode)   bằng if ($oldcode!=$newcode && $newcode!=’3e598d76745e5a0951c17eec14019ea1′)

Oke, cách thức xử lí cơ bản là như vậy, việc còn lại là các bạn tổ chức database lưu trữ và sử dụng PHPMailer và Botman để thông báo người dùng.

4. Cách dùng botman để gửi Messenger

Các bạn sử dụng composer để lấy thư viện botman, hướng dẫn của tác giả ở đây Installation Botman

Trong phần Sending (Dùng để gửi thông báo, không phải phản hồi tin nhắn) có nói đến  my-recipient-user-id Đây là ID của cuộc trò chuyện giữa page và user facebook. Lưu ý rằng, nó không phải là ID của facebook bạn cần nhắn.

Bạn có thể lấy ID đó bằng hàm này $bot->getUser()->getId()  khi người dùng gửi tin nhắn đến bạn.

ví dụ:

$botman->hears('id', function (BotMan $bot) {
    $bot->reply('ID messenger cua ban la:  '.$bot->getUser()->getId());
        exit; 
});

5. Sử dụng PHPMailer như thế nào?

Trong file hướng dẫn của tác giả, đã có hướng dẫn cách dùng, các bạn có thể tham khảo thêm tại đây 

Cấu hình Username và Password SMTP Các bạn có thể xem bài viết này từ 2p55s để lấy password SMTP

LẤY THÔNG TIN SMTP CỦA GMAIL

 

Các bạn xem tiếp phần tiếp theo tại đây Viết mã nguồn tự động thông báo điểm UIT (Phần 2)

 

2 thoughts on “Viết mã nguồn tự động thông báo điểm UIT (Phần 1)

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *