Jump to content
Các bạn đi qua đi lại :") nếu có rảnh giúp mình click vào quảng cáo ở góc phải hoặc dưới cùng hoặc trong bài viết nhé. Cám ơn nhìu ^^. ×

Search the Community

Showing results for tags 'hướng dẫn'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General Assembly
    • Announcements
    • Meeting Room
    • Discipline Room
  • Programs Language
    • C Sharp
    • C/C++
    • AutoIt
    • AutoHotKey
    • Python
    • HTML/Javascipt
  • Thuê code - Nhận code
    • Sales corner
    • Người thuê code
    • Người nhận code
    • Bóc phốt - Cảnh báo lừa đảo
  • Computer - Internet
    • Hot News
    • Internet Trick
    • Games World
    • Windows
    • Software
    • MMO
  • Recycle
    • Recycle

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me

Found 14 results

  1. Bài hướng dẫn sử dụng UDF _HttpRequest ở bài viết sau đây: Trang shopee.vn phiên bản mới sau này sử dụng nền tảng React.js khá khó chịu để làm request. Thì sau đây là kinh nghiệm của iêm khi làm login trang này bằng http request: Đầu tiên, ta sẽ ngó thử Live HTTP Headers / F12 để xem Request Headers được gửi đi khi login trang, ta có: Ở Request Headers trên ta thấy có 2 giá trị cần phải tìm là: csrftoken và password_hash. Theo nguyên tắc iêm hay nhắc là tìm từ source HTML khi GET địa chỉ referer (referer: https://shopee.vn/api/v0/buyer/login/) thì ta thấy hoàn toàn không có manh mối nào để tìm 2 giá trị trên, vậy là phải tìm thông tin trong code js, thì thấy những manh mối sau để giải câu hỏi: 1. Password_Hash: Sau một hồi lần mò từ đống js thì ta tìm thấy được đoạn sau: ...{"password_hash",function Ge(e){var e=CryptoJS.SHA256(CryptoJS.MD5(e).toString()).toString();}.... → À, vậy đơn giản password_hash là password đã được Hash MD5, sau đó Hash SHA256 chuỗi MD5 đó. UDF _HttpRequest đã cung cấp 2 hàm Hash này. Ta có: $password_hash = _GetSHA256(_GetMD5($password)) 2. csrftoken: Thằng này thì hơi khó nhằn. Phải sử dụng đến 2 manh mối từ js mới giải được thằng này, ta có 2 đoạn js sau: func("csrftoken", e = function(e, n) {n = n || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for (var a = "", r = 0; r < e; r++) {var t = Math.floor(Math.random() * n.length); a += n.substring(t, t + 1) }return a}(32), 0) và document.cookie=t+"="+e.csrftoken" → Khá hài hước là csrftoken nó chả phải là chuỗi mã hoá gì ghê gớm hết mà chỉ là một chuỗi ngẫu nhiên có độ dài 32 ký tự từ A-Z, a-z, 0-9. Vậy câu hỏi đặt ra là: "Tạo sai tôi cũng từng thay đại 1 chuỗi trong Live HTTP Headers / F12 vào mà có ra đâu ?". Câu trả lời nằm ở chỗ Cookie cũng phải nạp cái csrftoken vào (nó liên quan đoạn code này nè: document.cookie=t+"="+e.csrftoken"). Các thým xem lại mẫu Live HTTP Headers ở trên là thấy Headers và Cookie đều có csrftoken nhoé. 3. Vậy là xong 2 cái giá trị cần tìm. Tuy nhiên khi thử Run code thì nó vẫn chưa chạy (status 400 Bad Request). Đó là vì quá trình login đòi hỏi cookie phải có các tiền giá trị: SPC_T_ID, SPC_T_IV, SPC_F.... điều này thể hiện qua đoạn js sau: ...t.signature=Object(i.c)("SPC_T_ID"),t.hash=Object(i.c)("SPC_T_IV"),t.meta.device_fingerprint=Object(i.c)("SPC_F"),t.meta=JSON.stringify(t.meta),fetch(e,{method:"post"... → Đơn giản là chỉ cần request đến địa chỉ Referer https://shopee.vn/api/v0/buyer/login/ là có. 4. Thêm một lưu ý nữa trong POST data là tham số: login_type, giá trị tham số này thay đổi theo tài khoản điền vào là gì: + Điền tên: login_type=username + Điền số điện thoại: login_type=phone + Điền email: login_type=email Mọi yếu tố đều đã được giải đáp, vậy là ta có code hoàn chỉnh như sau: [Hidden Content] Ảnh demo: (Mượn tạm acc của thým HoangVu để làm demo) >>> Xem tiếp bài viết Tương tác với Shopee sau khi đã Login tại
  2. Sau bài viết đăng nhập Shopee : thì iêm sẽ hướng dẫn các cách thức tương tác request với nó bởi trang này khá đa dạng trong các kiểu request gây bối rối cho người code. Điều đầu tiên iêm muốn nói là ta không thể request trực tiếp đến địa chỉ cửa hàng được, ví dụ như khi request đến cửa hàng Lock&Lock Official Store có địa chỉ https://shopee.vn/locknlockvn thì ta sẽ bị redirect ngay đến https://shopee.vn/?__classic__=1 và không có kết quả gì liên quan cửa hàng này, nguyên do là đoạn js của nó: <script>function showBody(){document&&document.body&&(document.body.style.visibility="visible")}var SHORT_URL_MAX_LENGTH=256,pathname=location&&location.pathname;if("/"!==pathname&&pathname.length<SHORT_URL_MAX_LENGTH&&""===location.hash&&-1===pathname.indexOf("-")&&0===pathname.lastIndexOf("/")){document&&document.body&&(document.body.style.visibility="hidden"),setTimeout(showBody,5e3);var xhr=new XMLHttpRequest;xhr.open("GET","/api/v0/is_short_url/?path="+pathname.replace("/","")),xhr.setRequestHeader("Content-Type","application/json"),xhr.setRequestHeader("Accept","application/json"),xhr.onreadystatechange=function(){if(4===this.readyState)if(200===this.status)if(JSON.parse(this.responseText).error)showBody();else{var e=document.createElement("a");e.href=location.href,e.search+="?"===e.search[0]?"&__classic__=1":"?__classic__=1",location.href=e.href}else showBody()},xhr.send()}</script> <script>if(window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)},ga.l=+new Date,window.PerformanceObserver){var observer=new window.PerformanceObserver(function(e){for(var r=e.getEntries(),n=0;n<r.length;n++){var a=r[n],i=a.name,t=Math.round(a.startTime+a.duration);ga("send",{hitType:"timing",timingCategory:"Performance Metrics",timingVar:i,timingValue:t})}});observer.observe({entryTypes:["paint"]})}</script> Vì vậy, ta chỉ có thể lấy thông tin cửa hàng từ api mà trang shopee cung cấp, và iêm sẽ trang bị cho các thým đoạn code sau để lấy thông tin của một cửa hàng: $Info = Shopee_ShopInfo('https://shopee.vn/locknlockvn/', True) Func Shopee_ShopInfo($iURL, $vFullInfo = True) Local $ShopName = StringRegExp($iURL, 'https://shopee.vn/([^\/]+)', 1) If @error Then Return SetError(1) Local $rq = _HttpRequest(2, 'https://shopee.vn/api/v2/shop/get?username=' & $ShopName[0]) If $vFullInfo Then Return _HTMLDecode($rq) Return StringRegExp($rq, '"shopid"\s*?:\s*?(\d+)', 1)[0] EndFunc Hàm Shopee_ShopInfo sẽ trả về dữ liệu phụ thuộc tham số $vFullInfo, nếu $vFullInfo = True thì sẽ trả về đầy đủ thông tin như sau: Còn nếu để $vFullInfo = False thì sẽ chỉ trả về ShopID. ------------------------------------------------------------------------------------------------------------------------------------------ OK, giờ vào vấn đề chính, khi ta request tương tác với shopee thì ta để ý kỹ những điều này khi đọc Live HTTP Headers hoặc F12 Dev Tools Trình duyệt: - Nếu tương tác với trang shopee.vn thì thường có đi kèm với csrftoken trong header và cookie. - Nếu tương tác với trang banhang.shopee.vn thì thường có đi kèm với SPC_CDS trong param của URL và cookie. Bây giờ ta thử một số tương tác sau: 1/ Request nhấn nút "Theo Dõi" một cửa hàng: Ví dụ ta request "Theo Dõi" cửa hàng Lock&Lock Official Store tại địa chỉ sau: https://shopee.vn/locknlockvn , ta bắt request sẽ được thế này: - Số 55771655 trong URL là ShopID, cái này thì chỉ cần sử dụng hàm Shopee_ShopInfo đã cung cấp ở trên với $vFullInfo = False là xong. - Ta thấy có xuất hiện csrftoken ở header và cookie → Khi request ta nhớ nạp cả 2 cái csrftoken này vào tham số $Cookie và $Header của hàm _HttpRequest thì mới request thành công. Như đã nói ở bài hướng dẫn login shopee, csrftoken chỉ là 1 chuỗi ngẫu nhiên nên ta có thể lấy luôn csrftoken mà ta bắt được để nạp vào, hoặc sử dụng kết quả trả về của hàm Shopee_Login mà iêm đã cung cấp (Xin nhắc lại, hàm Shopee_Login($Username, $Password) sẽ trả về mảng 5 phần tử: [0] Cookie chứa csrftoken, [1] Header chứa csrftoken, [2] UserName, [3] ShopID, [4] ID) Vậy ta có code:[Hidden Content] 2/ Thay đổi trạng thái "Xác minh đăng nhập OTP": Để thay đổi trạng thái xác nhận OTP thì ta phải đăng nhập vào trang https://banhang.shopee.vn/account/signin rồi sau đó vào Cài Đặt rồi vào Thiết Lập Shop , và ta bắt được request khi tắt bật nút trượt Xác thực OTP: - Method request là PUT chứ không phải POST, cần chú ý. - Ta thấy sẽ xuất hiện SPC_CDS trong param của URL và cookie như ghi chú đã nói ở phía trên. Thì nó ở đâu ra ? Nó sinh ra từ js và nó cũng như csrftoken có liên quan đến Session của shopee, vì thế phải nạp nó vào cả 2 chỗ thì mới request thành công và giá trị của nó ta để là số 1 là được rồi, khỏi cần dông dài e850f29a-d704-48f0-8227-c9452adfc224 như request bắt được ở trên chi cho mệt. - 118343558 trong URL là ID của tài khoản, nó là phần tử thứ 4 trong mảng trả về của hàm Shopee_login đấy. - "disable_new_device_login_otp" trong Data2Send: nếu là false thì Bật OTP, nếu là true thì tắt OTP Ta có code:[Hidden Content] 3/ Chat với Shop: Chat shopee dựa trên WebSocket thì _HttpRequest đã hỗ trợ tương tác WebSocket trên Win10 (Win8 trở xuống WinHttp không hỗ trợ WebSocket) Code như thế này:[Hidden Content] Trong đó $from_userid, $to_userid , $ShopID, $itemid dễ dàng tìm được nên iêm sẽ không code cụ thể nữa, ai thích tìm hiểu thì tự code nhoé ($from_userid thì lấy từ kết quả trả về của hàm Shoppe_Login. $to_userid , $ShopID thì từ kết quả hàm Shopee_ShopInfo ...) Demo: https://www.youtube.com/watch?v=p2zby2DEw1g Vậy là iêm đã lướt qua một số request cơ bản tương tác với Shopee, chúc các thým tìm hiểu vui vẻ và thích thú với nhánh HTTP Request này
  3. BƯỚC 1: Net traffic: https://mbasic.facebook.com/support/forms/flow_view?raw_state={"data"%3A"AY2nD0BGM9wANk-qNlvC_4uAtgSqWGWK8Mm5fyzieD6-jG0eHl-NcMOPtmBci4whhUw7Z1q9pQYHCovoIrAU_-lPVPANON5N-B98XGEp_rC-Bvww5ZvG0q8C3CZ9fc1VkCHzadyjKl_uDP5-GlafyvKBod1GvWwhnip13FCQuO-sW_2_YbLi752SrFv0CJ91ruJAOfDH-DIXZ2p3n_UKzpyfrKL0GX1R7tbBYy0hZdn8pDurVs9DLJDR7wi1KDAfyv9YSV7CfsCrK-6qBmkvBTbV"%2C"mac"%3A"AY0jssQNmzT5lhbV"}&rand=1307108603 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="lsd" AVrGGcWz ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="jazoest" 2715 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="btnReported" Yes ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="Field486329968082456" mailcuatui@gmail.com ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="uploadID[]"; filename="" Content-Type: application/octet-stream ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="button_val[Next]" Tiếp ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX-- Cần tìm: lsd, jazoest, Field, raw_state trong url https://mbasic.facebook.com/support/forms/flow_view?raw_state=.... $1 = _HttpRequest(2, 'https://mbasic.facebook.com/support/forms/flow_view?id=321804254561747') $LinkPOST = StringRegExp($1, 'action="(/support/forms/flow_view\?raw_state=.*?)"', 1) $lsd = StringRegExp($1, 'name="lsd" value="(.*?)"', 1) $jazoest = StringRegExp($1, 'name="jazoest" value="(.*?)"', 1) $Field = StringRegExp($1, 'name="(Field\d+)"', 1) Content-Disposition: form-data; name="uploadID[]"; filename="" Content-Type: application/octet-stream là up file nên thêm $ ở đầu uploadID[] Local $form = ['ls=' & $lsd[0], 'jazoest=' & $jazoest[0], 'btnReported=Yes', $Field[0] & '=mailcuatui@gmail.com', '$uploadID[]=', 'button_val[Next]=Tiếp'] [Hidden Content] BƯỚC 2: Net traffic: https://mbasic.facebook.com/support/forms/flow_view?raw_state=%7B%22data%22%3A%22AY2Wd-W6B06m2zowlNYu-_ulj9jM22xv5_XhBgD7syR4IXRB4lY8nOK_MyigCbBApwIl8WeKhXCAigM-9aI3KlAKwUuHoyMPUpSG9-hqgq_eE8lvsZEAOe9KtSWxvzja3O0VWpebeT-Q4Ce2FcjUYaL3_kK9a42RpmlsTNl0ENAe3_T3zgd73n2OGDsTvmsZUfCD5GNpBne1iDRiO_NQ7CH6garW4JSA1IqTRCD3rkK8Rm89hlS1X9SFI14WKpcvjFLbJMMQxNeGLevcgUIyMZKB%22%2C%22mac%22%3A%22AY1XqiU80ceWTFIC%22%7D&rand=315123950 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="lsd" AVrGGcWz ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="jazoest" 2715 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="txtYourName" QUân ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="emailField" quancap@gmail.com ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="dobYourDOB[year]" 2000 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="dobYourDOB[month]" 1 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="dobYourDOB[day]" 1 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="areaMailingAddress" quancap@gmail.com ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="txtYourPhone" 0909112233 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="txtImpostorName" Huy ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="Field486329968082456" test@gmail.com ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="profileurl" https://www.facebook.com/guyhug.12 ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="uploadID[]"; filename="images.jpg" Content-Type: image/jpeg ÿØÿà ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="txtElectronicSig" quancap ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX Content-Disposition: form-data; name="button_val[Next]" Tiếp ------WebKitFormBoundaryjcDJ0ORCyGBXXCqX-- lsd, jazoest, Field như cũ (giống bước 1) nên khỏi tìm, chỉ tìm URL raw_state mới từ $2 Content-Disposition: form-data; name="uploadID[]"; filename="images.jpg" Content-Type: image/jpeg ÿØÿà là up file nên thêm $ ở đầu uploadID[] [Hidden Content] BƯỚC 3: Net traffic: https://mbasic.facebook.com/a/help/contact_us/ lsd=AVrGGcWz&jazoest=2715&form_id=321804254561747&raw_state=%7B%22data%22%3A%22AY3Kh1KKesPhev7t70DwGe9MC-157AhU6QrIWY7TPRdnNzRe9xbYjgkaS8N7NiSb1jBEV9Xva14Tw7nTNiGOEU9Qbspn40uVzqlablNQ7q01Rl0Cbo613AC0pNEa61PnyJhkoXVqZhQinquDgRiA0nQ5RPBJLcoDOyDtNSwuD53rDpbjnB4LtozpX8rBZYD6QAs1WZBY1kghniePQqB9mQP60qQk_vC9f9SOs2f_8N5DqWHawxefI73WSn9EXH3EiyfVDVuXB7ey202urzGuMUfxUbA6wNQ7w36Ud-NZNXuVedxi9oImF8iYotvPIeu5NWxdb8ZIWU3JIYbo4n6F4B_wNEKe_jRRQALr1p0fE55c0l8jyRs0mJKO9MQ1nUnDGPxMeUQBjz50u7wHgX4tpvS9i07Emv93X7wjKxzOEYC38mLNotJ4_-BPAtypWjHJb7bpSGgg3tUGKVEo7Q9O5a15fGHykhN8FhxHWibQrGfJ-OvjqHq7snOhSSaKZVT_lJyP0_U4Dejtr0bUPze2h_HFsU12_3NwZcyBQeOxqEmMyKAEYT9a4MxofHAdji2d4vQMMU4Ob7pPRS12v666-bws934kkswltaJurjrq1uXUeMPd6Os7FeFZApclw0kEh_dxa1Y8YfaTSoqkIVtTWOGDb_9aZwW_dQUbl_MfffXfDnWV4UMOsQ-fcIEGUCpU9_UJYAdDpDiWm7i5e2Y0_oD_ZAY64rzk_NVCQf_sxkoQP3_uMwJtOyYwyQOo3uceHt7t4OPPWc9jgP4fD9f2703QKZIFpR-l1SIhFpL_7HW2Uma22mKxpm55JSw2PXOJW3m_w01rsV1vgNwxP8VumtbwU1Ya-SoBGCX3CDH4BeMacq6BwTUgCfvCF3nXLzly6OEZEZBCatZlic95kiu4BLzWtk3Mo9L_rTcLuzsDDJX67Rx6voWo2T1q2m2pwqsEwPloIkwSFncPgscU7VIFmKbTyvOIw6-0ZDuG7hD4RGjCR9NerPt_HTOwgfVA_tZQlMLZQmIpJ2tNn0j9siCjwlylwS1nC5JAIMsO_E2qst-tC1ML2Mby9L-hMxA5ZJwWnQCj3gZ_E1UK95rE7PxZhlHFvhjwzVrlCOOHM9HCgfbEqRAExLzP9ZMGaByvDW8PmhUFn9XkbIK_jIZfuxVdp_JMKm4c5DILtu8dWycIWmYjTTERH0-7Gbj68WIFXmF-F_CyWMF08oMur7Z1EOnanmCwSzuu_ouCXu5d9XcHLPXkKpKrdCeQrP1TAZnGZ0PVv6B4MQOKEN8kUo7VmKqcDyA-cuu_bU7g-WQ-hvHBEKvXaW8JYcYIjfvs50t36AmkU7-F54_xWYX6NLm5b851pFSBe5vkXnvj4MOQ_ZcDfoKIV4vMBX3ZMzESPIQCJktPt_41ZmBLDgcm4WLk5RfqvPJWWmj4PR7fXnSzEGXLdvhtPucEVJeLJs9sFL4A2PVBMgmu_pLsU366IMqy165OFgiA%22%2C%22mac%22%3A%22AY1Pb6aIIU7oaoaO%22%7D&button_val%5BSubmit%5D=G%E1%BB%ADi lsd, jazoest như cũ (giống bước 1) nên khỏi tìm. lần này không lấy URL raw_state mà chỉ lấy giá trị raw_state nên StringRegExp thay đổi tí xíu. [Hidden Content]
  4. [Bài viết này của kakanet - autoitvn.com] Vì phần HotStrings cũng khá dài nên mình tách riêng HotKeys và HotStrings ra 2 bài khác nhau cho đỡ rối nhé.- Xem bản Word tại đây: https://drive.google.com/open?id=0B0fuwDPNpByLa3FpVXU1SUJ3M1kXem lại bài 3 tại đây:
  5. [Bài viết này của kakanet - autoitvn.com] Hôm nay mình sẽ giới thiệu tiếp đến các bạn một bài mới trong loạt chủ đề về AutoHotKey, đó là Cấu trúc rẽ nhánh Mệnh đề IF. Đây là một phần cũng khá quan trọng bởi trong mọi code, mệnh đề IF hầu như xuất hiện rất thường xuyên Xem bản Word được format đẹp ở đây: https://drive.google.com/open?id=0B0fuwDPNpByLVHpXRVJGZHVvNFkBên dưới là hình chụp về bài viết, mình không viết bài ở đây là vì công cụ định dạng có sẵn là rất hạn chế.Nếu bên AutoIt cấu trúc rẽ nhánh ngoài IF còn có Switch...EndSwitch, Select...EndSelect, thì bên AutoHotKey không có, nhưng bù lại sẽ có cấu trúc tương đương, thậm chí còn xài sướng hơn AutoIt nữa, để biết đó là gì thì đọc bài viết nhé Xem lại bài 2 tại đây: Xem tiếp bài 4 tại đây:
  6. [Bài viết này của kakanet - autoitvn.com] Phần này chứa rất nhiều kiến thức nền để bắt đầu công cuộc chinh phục AutoHotKey nên các bạn cần nắm thật vững mới có thể học tốt những phần sau được nhé.AutoHotKey hoàn toàn không có tài liệu tiếng Việt, mình thì cũng chỉ vừa mới nghiên cứu về AutoHotKey dựa trên Tài liệu tiếng Anh của nó thôi, nên có thể có những chi tiết trong bài viết không được chính xác lắm, ai phát hiện gì sai thì comment báo sai nhé.Nếu ai đã học qua C thì những kiến thức này cũng khá đơn giản thôi, vì AutoHotKey có cấu trúc tương tự C. Còn ai chưa biết về lập trình cũng như chỉ biết về AutoIt thì khá khó nuốt vì AutoIt cấu trúc nó giống ngôn ngữ Basic.Đây là file Word về bài viết đã được định dạng đẹp, ai thích thì tải về xem:https://drive.google.com/open?id=0B0fuwDPNpByLaXRKTTJfZ0JZZ1UCòn không thì đọc bài viết bên dưới cũng được (click vào ảnh để phóng lớn).Viết trong 3 ngày cuối cùng cũng xong, mừng muốn khóc Xem lại bài 1 tại đây: Xem tiếp bài 3 tại đây:
  7. [Bài viết này của kakanet - autoitvn.com] Bất cứ ngôn ngữ nào thì điều đầu tiên cần học là hiển thị text lên MsgBox.AutoHotKey có 2 kiểu hiển thị Msgbox với cấu trúc là:1/ MsgBox, Text hoặc MsgBox Text để hiển thị 1 Text với Button OK.Hãy copy tất cả 6 dòng code ví dụ sau vào AHK-SciTE hoặc trình soạn thảo mà bạn đang sử dụng và chạy thử: Mã (Text): MsgBox Hello World1_a MsgBox "Hello World2_a" MsgBox % "Hello World3_a" MsgBox, Hello World1_b MsgBox, "Hello World2_b" MsgBox, % "Hello World3_b" Bạn có thấy gì lạ không ? Hello World3_a và Hello World3_b không có dấu " " so với Hello World2_a và Hello World2_b. Điều này liên quan đến Biến trong AutoHotKey và mình sẽ nói ở phần sau.2/ MsgBox [, Options, Title, Text, Timeout] : Thêm nhiều tuỳ biến cho MsgBox.Hàm này cũng gần như tương tự như bên AutoIt, bên AutoIt là MsgBox (flag, "title", "text" [, timeout = 0 [, hwnd]])Parameter Options nạp giá trị y chang Flag bên AutoIt, ví dụ muốn hiện Yes/No thì điền Options = 4, muốn hiện Icon Question thì Options = 32, cũng có thể kết hợp nhiều Options với nhau như bên AutoIt, chẳng hạn Options = 32 + 4...Hãy copy tất cả 3 dòng code ví dụ sau vào AHK-SciTE hoặc trình soạn thảo mà bạn đang sử dụng và chạy thử: Mã (Text): MsgBox, 4, MsgBox 1, Would you like to continue? MsgBox, 4 + 32, MsgBox 2, Would you like to continue? MsgBox, % 4 + 32, MsgBox 3, Would you like to continue? Bạn có thấy dòng MsgBox 2 có gì lạ không ?Nếu không thì chạy lại thử code trên nhé, bạn sẽ thấy "4 + 32, MsgBox 2, Would you like to continue?" nó xem như 1 chuỗi luôn.=> Nếu là AutoIt thì 4 + 32 nó tự động hiểu là 40 thì AutoHotKey không thể dùng như vậy được, phải thêm dấu % phía trước (như code MsgBox 3) nó mới hiểu đó là phép tính, điều này sẽ nói rõ hơn ở phần Biến ở bài sau=> Nếu Parameter Options không phải là 1 con số thì AutoHotKey coi như nguyên 1 đoạn sau MsgBox đều là Chuỗi => Nó trở thành code kiểu 1: MsgBox, Text hoặc MsgBox TextTiếp tục ở kiểu 2 này, nó khác AutoIt ở chỗ nữa là:Ví dụ AutoIt: Mã (AutoIt): If MsgBox(4, 'Ví dụ Msgbox với Yes No Button', 'Ấn Yes sẽ trả về 6, Ấn No sẽ trả về 7') = 6 Then MsgBox(0, 'Kết quả', 'Bạn đã ấn Yes') EndIf Còn AutoHotKey MsgBox nó không trả về 1 con số như bên AutoIt mà phải dùng hàm IfMsgBox với cấu trúc: IfMsgBox,ButtonNameParameter ButtonName là tên của nút đã nhấn. Ví dụ: Mã (Text): MsgBox, 4, Ví dụ, MsgBox với YesNo Button IfMsgBox, Yes MsgBox, Bạn đã nhấn Yes IfMsgBox, No MsgBox, Bạn đã nhấn No Xem thêm hàm MsgBox tại: https://autohotkey.com/docs/commands/MsgBox.htmXem thêm hàm IfMsgBox tại: https://autohotkey.com/docs/commands/IfMsgBox.htm#Parameters Xem tiếp bài 2 tại đây: 
  8. BƯỚC 1 - CHỈNH SỬA THƯ VIỆN C# ĐỂ AUTOIT VÀ DLL ĐÓ CÓ THỂ "NHÌN THẤY NHAU" QUA CỔNG COM - Để có thể liên kết AutoIt với thư viện DLL của C# thông qua COM thì Dll đó phải được cài đặt chế độ COMVisible=True. Để làm được điều này ta sẽ thực hiện như sau: + Nếu máy tính của bạn có cài IDE lập trình C# thì đơn giản là mở source code của DLL đó nếu nó được nhà phát triển cung cấp. + Cách khác là ta có thể chỉnh sửa trực tiếp DLL C# bằng phần mềm hoàn toàn miễn phí dnSpy. Nếu máy đã cài .Net Framework 4.7.2 thì tải dnSpy-net472.zip. Nếu chưa cài .Net Framework thì tải dnSpy-netcore-win32.zip hoặc dnSpy-netcore-win64.zip - Sau đó ta cài đặt dòng [assembly: ComVisible(true)] ở mục khai báo DLL như ví dụ dưới: - Nếu là chỉnh sửa source bằng IDE thì đơn giản rồi, còn nếu chỉnh sửa bằng dnSpy thì cách làm như sau: + Mở chương trình dnSpy. +Open DLL cần chỉnh sửa, từ panel bên trái ta chọn tên thư viện cần chỉnh: + Ta sẽ tìm thấy dòng [assembly: ComVisible(false)] hoặc [assembly: ComVisible(true)] (Nếu không tìm thấy dòng này thì tự thêm vào), nếu chế độ đang là true thì khỏi cần chỉnh gì cả, nếu là false thì ta nhấp phải vài bất cứ dòng nào ở panel bên phải, chọn Edit Assembly Attributes (C#)... + Xong rồi thì Save lại DLL là hoàn tất bước 1. BƯỚC 2: CODE AUTOIT GIÚP KẾT NỐI AUTOIT VÀ DLL C# - Ta có thư viện được viết bởi guinness (DEV autoscript.com) tại địa chỉ sau: https://www.autoitscript.com/forum/topic/166704-net-compiled-dll-assembly-in-autoit-the-simple-approach/. Bạn không cần vào tải thư viện trên vì tôi đã đính kèm Thư viện này + Các ví dụ ở tập tin đính kèm bên dưới. - Cách viết code: + Load Dll bằng hàm _DotNet_Load + Gọi Object bằng hàm ObjCreate với tham số classname là: Namespace.Class + Phần còn lại là phụ thuộc vào bạn vì mỗi DLL sẽ có cấu trúc gọi lệnh hàm COM khác nhau, nhưng nói chung chỉ cần ít kiến thức về COM, class...và đọc ví dụ bên code C# về DLL đó là dễ dàng chuyển đổi sang code AutoIt. - Ví dụ liên kết AutoIt với thư viện khá nổi bên C# là HtmlAgilityPack.dll Code C#: Chuyển sang code AutoIt: TẢI VỀ CODE MẪU + MỘT SỐ DLL C# ĐÃ EDIT SẴN CHẾ ĐỘ COMVISIBLE=TRUE ĐỂ TEST: [Hidden Content]
  9. Code sử dụng UDF _HttpRequest. Nếu ai chưa biết về UDF này thì đọc bài viết tại đây: Mình từng có một bài viết hướng dẫn cách login Garena bằng cách giải thuật thuần tuý, nhìn khá là rối rắm, nội dung tại: http://autoitvn.com/threads/thuat-toan-garena-huong-dan-cach-login-va-phuong-thuc-ma-hoa-mat-khau-cua-no-voi-_httprequest.900/ --------------------------------------------------------------------------------- Hôm nay mình sẽ đăng code sử dụng hàm _JS_Execute để giải quyết công đoạn mã hoá mật khẩu khiến nó trở nên đơn giản hơn rất nhiều. #include <_HttpRequest.au3> $username = '' $password = '' $TimeStamp = _GetTimeStamp() $PreLogin = _HttpRequest(2, 'https://sso.garena.com/api/prelogin?account=' & $username & '&format=json&id=' & $TimeStamp & '&app_id=10000') If StringInStr($PreLogin, 'error_require_captcha') Then ; Nếu bắt điền captcha thì: $UUID = _JS_Execute('', "function uuid() {return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);return v.toString(16);});}; var uuid=uuid()", 'uuid') $sCaptcha = _HttpRequest_SimpleCaptchaGUI(_HttpRequest(2, 'https://captcha.garena.com/image?key=' & $UUID)) $PreLogin = _HttpRequest(2, 'https://sso.garena.com/api/prelogin?account=' & $username & '&format=json&id=' & $TimeStamp & '&app_id=10000&captcha_key=' & $UUID & '&captcha=' & $sCaptcha) EndIf $aV = StringRegExp($PreLogin, '"v[12]": "([^"]+)"', 3) $CodeJS = _ "var password = '" & $password & "';" & _ "var passwordMd5 = CryptoJS.MD5(password);" & _ "var passwordKey = CryptoJS.SHA256(CryptoJS.SHA256(passwordMd5 + '" & $aV[0] & "') + '" & $aV[1] & "');" & _ "var encryptedPassword = CryptoJS.AES.encrypt(passwordMd5, passwordKey, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.NoPadding});" & _ "encryptedPassword = CryptoJS.enc.Base64.parse(encryptedPassword.toString()).toString(CryptoJS.enc.Hex);" $encryptedPassword = _JS_Execute('https://sso.garena.com/js/crypto.js?v=0.60', $CodeJS, 'encryptedPassword') $sLogin = _HttpRequest(2, 'https://sso.garena.com/api/login?account=' & $username & '&password=' & $encryptedPassword & '&redirect_uri=https://www.garena.vn/&format=json&id=1472983484321&app_id=10000') MsgBox(4096, 'Login data', $sLogin) Have fun :v
  10. Mặc định Control Edit của GUI AutoIt không có chức năng Select All (Ctrl + A) nên ta phải thêm code vào. 1. Code khi chế độ GUI là GUIGetMsg() $GUI = GUICreate("Ctrl + A để select all text trong Edit", 310, 210) $Edit1 = GUICtrlCreateEdit("test1", 2, 2, 300, 100) $Edit2 = GUICtrlCreateEdit("test2", 2, 104, 300, 100) GUISetState(@SW_SHOWNOACTIVATE) #Region <Thêm 3 dòng code này> $Ctrl_A = GUICtrlCreateDummy() Local $DefButton[1][2] = [["^a", $Ctrl_A]] GUISetAccelerators($DefButton) #EndRegion While Sleep(40) Switch GUIGetMsg() #region <Thêm 2 dòng code này> Case $Ctrl_A GUICtrlSendMsg(DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", ControlGetHandle("", "", "[CLASSNN:" & ControlGetFocus("") & "]"))[0], 0xB1, 0, -1) #EndRegion Case -3 Exit EndSwitch WEnd 2. Code khi chế độ GUI là SetOnEvent: Opt("GUIOnEventMode", 1) $GUI = GUICreate("Ctrl + A để select all text trong Edit", 310, 210) GUISetOnEvent(-3, "_Exit") $Edit1 = GUICtrlCreateEdit("test1", 2, 2, 300, 100) $Edit2 = GUICtrlCreateEdit("test2", 2, 104, 300, 100) GUISetState(@SW_SHOWNOACTIVATE) #Region <Thêm 3 dòng code này> $Ctrl_A = GUICtrlCreateDummy() GUICtrlSetOnEvent($Ctrl_A, "_SelectAll") Local $DefButton[1][2] = [["^a", $Ctrl_A]] GUISetAccelerators($DefButton) #EndRegion While Sleep(30) WEnd Func _SelectAll() GUICtrlSendMsg(DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", ControlGetHandle("", "", "[CLASSNN:" & ControlGetFocus("") & "]"))[0], 0xB1, 0, -1) EndFunc Func _Exit() Exit EndFunc
  11. * Chú ý: WinHttp trên WinXP không còn support hầu như các trang Https nên UDF chạy tốt nhất từ Win7 trở lên. A/ LỜI NÓI ĐẦU - UDF dựa trên nền tảng của WinHttp.dll có sẵn của Window nên còn hạn chế rất nhiều mặt như tương tác sâu và session, không xài SOCKS để cài đặt proxy được... Còn lại thì nói chung xài rất ổn. - Mình không phải dân lập trình, chỉ là mê AutoIt, tập tành code kiết này nọ nên có thể kiến thức, lý thuyết, cách gọi …trong lập trình của mình không chính xác và chuẩn lắm, mong các bạn thông cảm. - Dùng WinHttp theo mình thì đây là phương thức gửi nhận dữ liệu mạng không cần qua 1 cái Web Browser trung gian. Ví dụ bình thường bạn muốn tải nhạc, bạn vào Chrome, vào ZingMp3, lựa bài muốn tải, bấm Tải về. Còn khi dùng WinHttp, đơn giản, bạn code 1 chương trình gửi 1 thông tin đến ZingMp3 rằng bạn muốn tải bài đó và nhận dữ liệu gửi về, không cần qua một chương trình nào khác nữa.- Đây là bài viết dành cho những ai đang mới bắt đầu tìm hiểu về WinHttp, mình thì chỉ nắm những cái gọi là cơ bản thôi, nói chung là vừa đủ xài để ra cái kết quả cuối cùng hay nói nôm na là thực hành nhiều để ra cái kinh nghiệm, chứ về lý thuyết, trả lời các câu hỏi tại sao, vì sao phải làm như vậy thì…mình không biết. B/ CÁC YÊU CẦU ĐẦU TIÊN1- Trong bài hướng dẫn, toàn bộ thông tin gửi nhận request mình dùng addon Live HTTP Headers trên Firefox để xem. Nếu chưa cài bạn có thể vào đây tải về: (Lưu ý là addon này chỉ chạy trên Firefox bản 57 trở về trước, bản mới sau này không cài được). Nếu đã quen thuộc với request rồi bạn có thể sử dụng chức năng Develop có sẵn của trình duyệt (bấm F12 trên bàn phím, sau đó chọn tab Network) để xem request cho tiện hoặc các phần mềm như HttpAnalysis, Fiddler... https://addons.mozilla.org/vi/firefox/addon/live-http-headers/ Sau khi cài xong ta vào Tab Config, sau đó tích chọn Exclude URLS with regexp và paste vào ô kế bên nội dung sau: Mã (Text): ^https://safebrowsing-cache.google.com|^https://scontent-hk|edge-chat.facebook.com|facebook.com/feed/badge/|facebook.com/a/bz$|^https://pixel.facebook.com|.gif$|.jpg$|.ico$|.css$|.js$|.png$|googleads|eclick.vn|doubleclick.net|ants.vn|\.css\?v=|adsplay|google-analytics.com Mục đích của việc trên là để lọc bớt những request thừa, bởi khi chạy Live HTTP Headers sẽ có rất nhiều request hiển thị và rất rối mắt nếu không quen. 2- Tải về UDF _HttpRequest.au3 + Tập tin trợ giúp _HttpRequest Help.chm: Giờ đây tất cả hướng dẫn, mẹo vặt, code... mình đều đã tổng hợp toàn bộ trong file Help này. Hy vọng nó sẽ giúp ích thật nhiều cho các bạn trong việc học về request bằng WinHttp/_HttpRequest Link tải (14.0.6 - 23/07/2019): https://drive.google.com/open?id=1AS2mWTKMF5btxyULhh8JIGqD_9yxshif Sửa lỗi mở file Help mà chỉ ra trang trắng không có nội dung: Nhấp phải vào file _HttpRequest_Help.chm, chọn Properties, sau đó tích chọn Unblock, cụ thể sẽ như hình hướng dẫn bên dưới: 3- Cài CallTips cho SciTE: Việc này khá quan trọng bởi vì số lượng hàm là rất nhiều, calltips sẽ giúp ích cho việc code nhanh chóng hơn và không mất nhiều thời gian để nhớ đến tên hàm. Thực hiện cài calltips như sau: Mở file _HttpRequest_Help.chm đã tải ở link trên. Vào mục Introduction. Vào mục CallTips. Làm theo hướng dẫn đã nói rất rõ trong mục CallTips vừa mở. 4- Đọc kỹ hướng dẫn về StringRegExp (tách chuỗi) bởi nó sẽ được sử dụng rất nhiều khi làm về request. Ít nhất phải nắm được căn bản của hàm StringRegExp mới có thể đọc hiểu các ví dụ và thực hành. File _HttpRequest_Help.chm đã có 2 bài viết về StringRegExp, 1 bài đơn giản là do mình viết, một bài là do lazycat (diễn đàn hocautoit.com cũ) viết. 5- Đọc thật kỹ nội dung _HttpRequest_Help.chm về hàm chính _HttpRequest và các tham số của nó điều này hết sức quan trọng vì đây là hàm chủ chốt thực hiện request và liên quan đến tất cả các hàm bổ trợ còn lại của UDF. ------------------------------------***---------------------------------------- OK, đó là 5 điều cần làm trước khi đi tiếp vào con đường request rắc rối này. File _HttpRequest_Help.chm đã bao gồm: Ví dụ mẫu trong tất cả các hướng dẫn sử dụng các hàm trong UDF. Phần Practice cung cấp những bài tập request từ cơ bản đến phức tạp hơn. Để chạy thử code mẫu, bạn có thể bấm nút Copy To Clipboard như đã thấy ở hình trên rồi paste vào SciTe là xong. Chúc các bạn học request thành công.
  12. Tài liệu Bootstrap 3 tiếng Việt tốt nhất cho người mới bắt đầu https://drive.google.com/file/d/13pY4erX8FvTEV4WXltXkQDdljbfyuNdN/view
  13. Tài liệu C# tiếng Việt tốt nhất cho người mới bắt đầu https://drive.google.com/file/d/112_0davc-vsstBOjkPBs2EDQAcG0oWpd/view
  14. Share bộ sưu tập hàng chục Video chất lượng cao Hướng dẫn AutoIt của thánh nhân Juno_Okyo, trùm của group J2Team khét tiếng giang hồ, 1 thời nắm trùm bên group AutoIt Guru nay đã quy ẩn AutoIt nhưng vẫn kịp truyền cho thế hệ sau này bộ bí kíp võ lâm siêu quần:
×
×
  • Create New...