Example 6

HTTP Requests

Example 6

Top  Previous  Next

Auto Thanks trong các Topic trang:

https://www.steam-gamers.net

 

 

* Nếu chưa có tài khoản thì tạo tài khoản mới hoặc dùng tài khoản sau để làm thử:

user: huan4hoang5, password: 123456

 

 

Trang cụ thể để test Thanks: https://www.steam-gamers.net/forum/showthread.php?t=72832

 

Để Thanks được thì dĩ nhiên phải Đăng Nhập trước. Ta sẽ làm 2 Bước:

 

 

 

A) Đăng nhập

 

1/ Xem Live HTTP Headers các request cần làm

 

 

·Điền thông tin đăng nhập vào (username, password) nhưng khoan bấm nút Đăng Nhập.

 

·Nếu chưa bật Live HTTP Headers thì bật nó lên. Nếu bật rồi thì bấm Clear để xoá hết các request cũ không liên quan.

 

·Bây giờ mới bấm nút Đăng nhập và Live HTTP Headers sẽ hiển thị 1 đống thông tin. Vì là đăng nhập nên tìm trong Live HTTP Headers chỗ nào có POST và có tên host steam-gamers.net với login, thì thấy:

 

https://www.steam-gamers.net/forum/login.php?s=5ce1a193df2cdde210ac104712d6c7f6&do=login

 

POST /forum/login.php?s=5ce1a193df2cdde210ac104712d6c7f6&do=login HTTP/1.1

Host: www.steam-gamers.net

User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:51.0) Gecko/20100101 Firefox/51.0 Cyberfox/51.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US

Accept-Encoding: gzip, deflate, br

Referer: https://www.steam-gamers.net/forum/

Cookie: bb_lastactivity=0; sc_is_visitor_unique=rx8874897.1504846484.58B058DAE4D74FE1CF996E7F07FBD909.1.1.1.1.1.1.1.1.1

DNT: 1

Connection: keep-alive

Upgrade-Insecure-Requests: 1

Content-Type: application/x-www-form-urlencoded

Content-Length: 201

  vb_login_username=huan4hoang5 &vb_login_password=123456 &vb_login_password_hint=Password &s=5ce1a193df2cdde210ac104712d6c7f6 &securitytoken=guest &do=login &vb_login_md5password=&vb_login_md5password_utf=

→ DataToSend

 

Ta thấy địa chỉ request có đoạn s=5ce1a193df2cdde210ac104712d6c7f6. Cách tìm đọc ở phần Phân tích Data cần gửi đi bên dưới.

 

 

2/ Phân tích Headers

 

·Các Header như Accept, Accept-Language, Accept-Encoding, Connection, Content-Length, User-Agent, DNT: 1ta không cần để ý đến chúng vì UDF đã add sẵn hết rồi. Xem thêm chi tiết tại mục $sAdditional_Headers

 

·Header còn lại Upgrade-Insecure-Requests: 1 thường thì không cần nạp vào vẫn được.

 

 

3/ Phân tích Referer

 

Hình trên có Referer nhưng không điền vào tham số $sReferer cũng được, chừng nào request thất bại mới điền vào để thử.

 

 

4/ Phân tích Cookie

 

Những cookie tạp nham thường có dạng __abcxyz, ___abcxyz ta không cần để ý đến chúng.

 

 

5/ Phân tích Data cần gửi đi

 

DataToSend thường nằm thụt lùi qua phải hơn so với các dòng khác, nó là:

vb_login_username=huan4hoang5 &vb_login_password=123456 &vb_login_password_hint=Password &s=5ce1a193df2cdde210ac104712d6c7f6 &securitytoken=guest &do=login &vb_login_md5password=&vb_login_md5password_utf=

 

·Ta có thể đặt usernamepassword là biến để dễ tuỳ biến hơn: $sDataToSend = vb_login_username=' & $name &'&vb_login_password=' & $pass & .....

 

·Vì chuỗi gửi đi $sDataToSend phải là chuỗi không dấu, nhưng sẽ có trường hợp đặt tên cho tài khoản có chứa ký tự có dấu nên để chắc ăn, ta dùng hàm _URIEncode($name) để biến chuỗi có dấu thành chuỗi không dấu theo chuẩn URL.

 

·Đoạn s=5ce1a193df2cdde210ac104712d6c7f6: s ta tìm ở đâu ? Thông thường để tìm một giá trị lạ ta sẽ tìm giá trị đó trên Live HTTP Headers trước. Nếu tìm không thấy ta sẽ làm 1 request lấy source từ địa chỉ header Referer. Nhìn hình ở trên, địa chỉ Referer đó là https://www.steam-gamers.net/forum/ →Ta request địa chỉ này và lưu source request được vào Clipboard:

$rq_referer = _HttpRequest(2, 'https://www.steam-gamers.net/forum/')

ClipPut($rq_referer)

Paste source đã lưu vào Notepad hoặc trang SciTE mới và search thử (Ctrl+F3) giá trị lạ đó (ở ví dụ này là s) có nằm trong source không, nếu có thì dùng StringRegExp để tách lấy nó ra. Ta tìm thử thì quả nhiên là thấy:

 

<html>

.......

<input type="hidden" name="s" value="7ac3eca162de41baec9948407a2bf46a" />

<input type="hidden" name="securitytoken" value="guest" />

.......

</html>

 

→ Ta StringRegExp với pattern là 'name="s" value="(.*?)"' (Xem thêm về StringRegExp tại đây)

Hoặc ta cũng có thể sử dụng hàm _HttpRequest_SearchHiddenValues để tìm nhanh giá trị ẩn đó.

 

 

6/ Phân tích ngoài luồng

 

Từ s lấy được ở trên ta gắn vào địa chỉ request để được địa chỉ hoàn chỉnh như đã nhìn thấy trên Live HTTP Headers:

'https://www.steam-gamers.net/forum/login.php?s=' & $s & '&do=login'

 

 

7/ Hoàn thiện code Đăng Nhập

 

#include <_HttpRequest.au3>

$name = 'huan4hoang5'

$pass = '123456'

;-------------------------------------------------------------------------------

$rq1 = _HttpRequest(2, 'https://www.steam-gamers.net/forum/') ; Request đến địa chỉ Referer để tìm giá trị s

$s = StringRegExp($rq1, 'name="s" value="(.*?)"', 1)[0]

;-------------------------------------------------------------------------------

$rq2 = _HttpRequest(0, 'https://www.steam-gamers.net/forum/login.php?s=' & $s & '&do=login', 'vb_login_username=' & _URIEncode($name) & '&vb_login_password=' & $pass & '&vb_login_password_hint=Password&s=' & $s & '&securitytoken=guest&do=login&vb_login_md5password=&vb_login_md5password_utf=')

; → Sau request trên thì _HttpRequest sẽ lưu Cookies đăng nhập vào cache (Nếu thành công).

; → Tham số $iReturn của _HttpRequest điền số mấy cũng được bởi cái ta cần là Cookies đăng nhập đã sẵn sàng có trong cache khi request thành công. Vì vậy ta điền 0 để tăng tốc độ request (do không tốn thêm thời gian để lấy bất cứ giá trị trả về nào)

 

 

 

 

B) Nhấn nút Thanks

 

1/ Xem Live HTTP Headers các request cần làm

 

·Vào trang https://www.steam-gamers.net/forum/showthread.php?t=72832 hoặc bất cứ Topic nào tuỳ ý. (Đã đăng nhập tài khoản rồi)

 

·Live HTTP Headers bấm Clear để xoá hết các request cũ.

 

·Live HTTP Headers sẽ hiển thị 1 đống thông tin. Ta tìm request liên quan đến Thanks thì thấy:

 

https://www.steam-gamers.net/forum/post_thanks.php

 

POST /forum/post_thanks.php HTTP/1.1

Host: www.steam-gamers.net

User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:51.0) Gecko/20100101 Firefox/51.0 Cyberfox/51.0

Accept: */*

Accept-Language: en-US

Accept-Encoding: gzip, deflate, br

X-Requested-With: XMLHttpRequest

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

Referer: https://www.steam-gamers.net/forum/showthread.php?t=72832

Content-Length: 106

Cookie: bb_sessionhash=52bf03a35330675d028ac4ab0dc823db; bb_lastvisit=1504846519; bb_lastactivity=0; bb_forum_view=105a91349b0a86ab3290a689b9268b569e91abb9a-2-%7Bi-10_i-1504848326_i-254_i-1504848338_%7D; bb_userid=19354; bb_password=2f59f076551d711149835dc32da6893d;

DNT: 1

Connection: keep-alive

  do=post_thanks_add &using_ajax=1 &p=903238 &securitytoken=1504848391-37a0922bc8f485e038304d786944a0dd64ef2cf7

→ DataToSend

 

 

2/ Phân tích Headers

 

·Các Header như Accept, Accept-Language, Accept-Encoding, Connection, Content-Length, User-Agent, DNT: 1 ta không cần để ý đến chúng vì UDF đã add sẵn hết rồi. Xem thêm chi tiết tại mục $sAdditional_Headers

 

·Vậy là còn lại header X-Requested-With: XMLHttpRequest cần gán vào tham số $sAdditional_Headers

 

 

3/ Phân tích Referer

 

Hình trên có Referer nhưng không điền vào tham số $sReferer cũng được, chừng nào request thất bại mới điền vào để thử.

 

 

4/ Phân tích Cookie

 

·Cookie trong hình là những Cookies thông tin đăng nhập mà ta đã lấy được từ request đăng nhập (Sau khi đăng nhập thành công thì các Cookies này đã được tự động lưu vào Cache nên không cần phải nạp lại vào tham số $sCookie của _HttpRequest)

 

·Ngoài ra, để bỏ qua bước Đăng nhập ở những lần chạy code sau ta có thể dùng _GetCookie để trích lấy Cookies từ request đăng nhập, lưu lại Cookies đó vào ini hay txt, lần sau chạy code thì chỉ việc đọc từ ini/txt rồi nạp vào tham số $sCookie của _HttpRequest là xong. Xem cụ thể cách làm tại đây.

 

 

5/ Phân tích Data cần gửi đi

 

DataToSend thường nằm thụt lùi qua phải hơn so với các dòng khác, nó là:

do=post_thanks_add &using_ajax=1 &p=903238 &securitytoken=1504848391 - 37a0922bc8f485e0 38304d7869 44a0dd6 4ef2cf7

 

·psecuritytoken tìm ở đâu ? Thông thường để tìm một giá trị lạ ta sẽ tìm giá trị đó trên Live HTTP Headers trước. Nếu tìm không thấy ta sẽ làm 1 request lấy source từ địa chỉ header Referer. Nhìn hình ở trên, địa chỉ Referer đó là https://www.steam-gamers.net/forum/showthread.php?t=72832 → ta request địa chỉ này và lưu source request được vào đâu đó (sử dụng hàm ClipPut để copy giá trị biến lưu source vào Clipboard rồi paste vào Notepad, new tab SciTE... chẳng hạn) và search thử (Ctrl+F3) giá trị lạ đó (ở ví dụ này là psecuritytoken) có nằm trong source không, nếu có thì dùng StringRegExp để tách lấy nó ra. Ta tìm thử thì thấy:

 

<html>

.......

<a href="post_thanks.php? do=post_thanks_add&amp; p=903250&amp; securitytoken=1504849440-461f0fa504a8f4aa3403ca127b777387a4d03d34" id="post_thanks_button_903250" onclick="return post_thanks_give(903250, false);"  rel="nofollow" class="post_thanks_button">Thanks</a>

.......

<a href="post_thanks.php? do=post_thanks_add&amp; p=903253&amp; securitytoken=1504849440-461f0fa504a8f4aa3403ca127b777387a4d03d34" id="post_thanks_button_903250" onclick="return post_thanks_give(903250, false);"  rel="nofollow" class="post_thanks_button">Thanks</a>

.......

<a href="post_thanks.php? do=post_thanks_add&amp; p=903257&amp; securitytoken=1504849440-461f0fa504a8f4aa3403ca127b777387a4d03d34" id="post_thanks_button_903250" onclick="return post_thanks_give(903250, false);"  rel="nofollow" class="post_thanks_button">Thanks</a>

........

</html>

 

Trông rất giống với DataToSend nhìn thấy ở Live HTTP Headers đúng không nào. (Những dòng trên tương ứng với các nút Thanks của mỗi post trong Topic.)

 

→ Ta StringRegExp với pattern là '"post_thanks.php\?do=(.*?)"' (Xem thêm về StringRegExp tại đây)

Hoặc ta cũng có thể sử dụng hàm _HttpRequest_SearchHiddenValues để tìm nhanh các giá trị ẩn đó.

 

→ Dùng StringReplace để thay thế &amp; thành & của các chuỗi giá trị ẩn đã tách được ở trên và nối thêm với &using_ajax=1 là giống với DataToSend rồi.

 

 

 

C) Hoàn thiện code auto Thanks

 

#include <_HttpRequest.au3>

 

#Region <Đăng nhập>

$name = 'huan4hoang5'

$pass = '123456'

;-------------------------------------------------------------------------------

$rq1 = _HttpRequest(2, 'https://www.steam-gamers.net/forum/') ; Request đến địa chỉ Referer để tìm giá trị s

$s = StringRegExp($rq1, 'name="s" value="(.*?)"', 1)[0]

;-------------------------------------------------------------------------------

$rq2 = _HttpRequest(0, 'https://www.steam-gamers.net/forum/login.php?s=' & $s & '&do=login', 'vb_login_username=' & _URIEncode($name) & '&vb_login_password=' & $pass & '&vb_login_password_hint=Password&s=' & $s & '&securitytoken=guest&do=login' & '&vb_login_md5password=&vb_login_md5password_utf=')

#EndRegion

 

 

#Region <Nhấn các nút Thanks trong Topic>

$URL_Topic = 'https://www.steam-gamers.net/forum/showthread.php?t=72832'

$Source_Topic = _HttpRequest(2, $URL_Topic)

$array_Thanks = StringRegExp($Source_Topic, '"post_thanks.php\?(.*?)"', 3) ; Ta sẽ được mảng các button Thanks

_ArrayDisplay($array_Thanks, 'Xem lại thử các DataToSend')

For $i = 0 To UBound($array_Thanks) - 1

$array_Thanks[$i] = StringReplace($array_Thanks[$i], '&amp;', '&') & '&using_ajax=1'

_HttpRequest(1, 'https://www.steam-gamers.net/forum/post_thanks.php', $array_Thanks[$i], '', '', 'X-Requested-With: XMLHttpRequest')

Next

#EndRegion