_HttpRequest_CreateDataForm

HTTP Requests

_HttpRequest_CreateDataForm

Top  Previous  Next

 

Tạo biểu mẫu DataToSend kiểu Multi-part / Upload

 

_HttpRequest_CreateDataForm($a_FormItems)

 

 

 

* Tham số

$a_FormItems

Mảng chứa Key và Value ta đọc được từ Live HTTP Headers

 

 

 

* Giá trị trả về

·Chuỗi Form Data chuẩn.
·Rỗng và set @error nếu lỗi.

 

 

 

* Ghi chú

·$a_FormItems phải là mảng kiểu:
o1 chiều được định dạng như sau: ["key1=value1", "key2=value2",...]
ohoặc 2 chiều được định dạng như sau: [["key1", "value1"], ["key2", "value2"], ...]

 

·Khi Value nhìn trên Live HTTP Headers là một tập tin (Value dạng tập tin thường sẽ có 3 phần là: filename=..., Content-Type:... mấy ô vuông kỳ quặc - xem hình ví dụ 1 bên dưới sẽ thấy) thì Key ta phải thêm dấu $ đằng trước để phân biệt với các Key thường, và Value phải là đường dẫn của tập tin đó. Ví dụ:
oLocal $FormItems = ["token=abcxyz", "$file=C:\\Images\Pic.jpg"]
ohoặc Local $FormItems = [["token", "abcxyz"], ["$file", "C:\\Images\Pic.jpg"]]

 

·Khi Value là một đoạn text có chứa tiếng Việt (ví dụ khi upload lên trang https://pastebin.com/ chẳng hạn) thì ta phải thêm đằng trước Key dấu ~ để hàm tự động chuyển Unicode sang ANSI trước, thì khi upload thành công sẽ không bị lỗi tiếng Việt. Ví dụ:
oLocal $FormItems = ["~text=upload chuẩn chưa"]
ohoặc Local $FormItems = [["~text", "upload chuẩn chưa"]  

 

·Có thể nạp thẳng $a_FormItems vào tham số $sDataToSend của _HttpRequest → Ta có thể bỏ qua bước sử dụng hàm _HttpRequest_CreateDataForm chuyển mảng Data-Form về chuỗi Data-Form.Để hiểu rõ hơn, xem Ví dụ 2 bên dưới.

 

·Để hiểu thêm về POST dữ liệu, đọc tài liệu tại đây

 

 

 

* Ví dụ

 

Ví dụ 1

formdata1

 

 

#include <_HttpRequest.au3>

Local $PathImage = FileOpenDialog('Chọn ảnh', '', 'Image (*.*)') ;chọn 1 ảnh từ máy

If @error Then Exit

Local $aFormItem = ['$source=' & $PathImage] ;hoặc Local $FormItem = [['$source', $PathImage]]

Local $sFormItems = _HttpRequest_CreateDataForm($aFormItem)

MsgBox(4096, 'Test xem Form-Data có đúng chưa', $sFormItems)

$rq = _HttpRequest(1, 'http://www.upsieutoc.com/json', $sFormItems)

MsgBox(4096, 'Xem thử header trả về', $rq)

 

 

 

Ví dụ 2

Tương tự Ví dụ 1 nhưng ta sẽ rút gọn lại code ở Ví dụ 1:

 

#include <_HttpRequest.au3>

Local $PathImage = FileOpenDialog('Chọn ảnh', '', 'Image (*.*)') ;chọn 1 ảnh từ máy

If @error Then Exit

Local $aFormItem = ['$source=' & $PathImage] ;hoặc Local $FormItem = [['$source', $PathImage]]

$rq = _HttpRequest(1, 'http://www.upsieutoc.com/json', $aFormItem)

;→  Nạp thẳng Mảng Data-Form vào $sDataToSend, _HttpRequest sẽ tự động nhận biết đây là request Upload.

MsgBox(4096, 'Xem thử header trả về', $rq)

 

 

 

Ví dụ 3

formdata2

 

 

#include <_HttpRequest.au3>

$NoiDung = 'upload chuẩn chưa'

$rq1 = _HttpRequest(2, 'https://pastebin.com/') ; Lấy source địa chỉ Referer để tìm csrf_token_post

$csrf_token_post = StringRegExp($rq1, '"csrf_token_post" value="(.*?)"', 1)[0] ; Xem chú thích bên dưới

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

Local $aFormItems = [['csrf_token_post', $csrf_token_post], ['submit_hidden', 'submit_hidden'], ['~paste_code', $NoiDung], ['paste_format', 1], ['paste_expire_date', 'N'], ['paste_private', 0], ['paste_name', 'Test']]

Local $sFormItems = _HttpRequest_CreateDataForm($aFormItems)

MsgBox(4096, 'Xem thử Form-Data được tạo', $sFormItems)

$rq2 = _HttpRequest(2, 'https://pastebin.com/post.php', $sFormItems)

_HttpRequest_Test($rq2)

MsgBox(4096, 'Địa chỉ Paste', _GetLocationRedirect() )

 

 

Ở ví dụ 3 ta cần tìm giá trị csrf_token_post để hoàn chỉnh Form-Data. 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, địa chỉ Referer đó là https://pastebin.com/ → Ta request địa chỉ này và lưu source request được vào Clipboard:

$rq_referer = _HttpRequest(2, 'https://pastebin.com/')

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à csrf_token_post) 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:

 

<form class="paste_form" id="myform" enctype="multipart/form-data" name="myform" method="post" action="/post.php" onsubmit="localStorage.clear();document.getElementById('submit').disabled=true;document.getElementById('submit').value='Please wait...';">        

<input type="hidden" name="csrf_token_post" value="MTUwNDQzOTUwN1hGdVZFZnBJclpnN">

<input name="submit_hidden" value="submit_hidden" type="hidden" />

<div class="textarea_border">

 

→ Ta StringRegExp với pattern là '"csrf_token_post" 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 đó.