1. Tải bản cài đặt AutoIT mới nhất

    Chào Khách. Nếu bạn mới tham gia và chưa cài đặt AutoIT.
    Vui lòng vào topic trên để tải bản AutoIT mới nhất nhé
    Dismiss Notice
  2. Quy định và nội quy

    Chào Khách. Vui lòng đọc kỹ nội quy và quy định của diễn đàn
    Để tránh bị ban một cách đáng tiếc nhé!
    Dismiss Notice
  3. Hướng dẫn chèn mã AutoIT trong diễn đàn

    Chào Khách. Vui lòng xem qua bài viết này
    Để biết cách chèn mã AutoIT trong diễn đàn bạn nhé :)
    Dismiss Notice

UDF Tương tác với Facebook bằng WinHttp

Thảo luận trong 'Chia sẻ mã nguồn' bắt đầu bởi Nguyễn Quốc Tuấn, 3/8/16.

  1. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Hàm FB_Login_Ex mình làm lại dựa trên hàm FB_Login, khác ở chỗ thêm chế độ ghi nhớ Cookie (đã được mã hoá nên yên tâm, sau lần login đầu tiên nó sẽ lưu lại Cookie đó và sử dụng lại ở lần đăng nhập sau, không cần chờ gửi Request đăng nhập nữa); URL request là trang m.facebook nên tốc độ login nhanh gấp đôi :3 Để sử dụng bạn Include FB_Login_Ex.au3 vào đầu code hoặc copy hàm FB_Login_Ex và paste vào UDF Facebook.au3 để xài cũng được :D

    Hàm đính kèm bên dưới không dùng được nữa, đã cập nhật ở #1
     

    Các file đính kèm:

    Chỉnh sửa cuối: 3/3/17
    kamsamita1, cao and sgdavid like this.
  2. sgdavid

    sgdavid Thành viên
    • 8/11

    Tham gia ngày:
    23/10/15
    Bài viết:
    28
    Đã được thích:
    12
    Thanks a nhìu nhìu :D
     
    kamsamita1 thích bài này.
  3. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    Bác ơi cho em hỏi khi gặp phải trường hợp datatosend của nó dài mà tìm trong source ko thấy thì làm thế nào ạ.Làm sao để biết biến nào ko quan trọng để bỏ đi ạ.Ví dụ trường hợp login facebook e thấy data to send của nó rất dài nhưng sao e lấy ngắn gọn còn mỗi email và pass thôi ạ.e cảm ơn :D
     
    kamsamita1 thích bài này.
  4. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Thực ra cái login FB này mới đầu mình cũng nạp vào data2send dài lắm, sau @Nguyễn Quốc Tuấn public cái UDF này mình mới biết là chỉ cần 1 dòng ngắn là ra =)) Có lẽ trường hợp này bạn thử bỏ dần các thành phần trong data2send (giữa các ký tự &) nếu gửi được thì OK, không được thì gửi theo nguyên si như cũ :))
     
    kamsamita1 and Ngọc Yến like this.
  5. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    Cảm ơn bác ạ.Bác làm nốt cái fb chat nữa cho mọi người tham khảo nữa đi ạ=)) Trước hình như có bác nào share rồi mà em mò mãi không thấy @@
     
    kamsamita1 thích bài này.
  6. Hồ Khánh Vũ

    Hồ Khánh Vũ Thành viên mới
    • 3/6

    Tham gia ngày:
    24/1/16
    Bài viết:
    13
    Đã được thích:
    22
    Bác ơi viết được thêm cái Follow và Check If Followed nữa đi :v hoặc là check nếu là Friend ấy :3
     
    kamsamita1 thích bài này.
  7. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    @Hồ Khánh Vũ Hồi trước làm về FB nhiều khi thấy nó khó khăn, chứ giờ có đc cái Cookie đăng nhập do FB_Login() trả về thì làm dễ lắm. Bạn cứ áp dụng bài viết về WinHttp: Mở Firefox, đăng nhập FB, xong ví dụ muốn Auto Follow, mở Live HTTP Header (LHH) lên trước, bấm Follow đại 1 người nào đó, thì LHH sẽ hiện request liên quan đến việc Follow, truyền request đó vào hàm _httprequest với: $Handle = FB_Login()
    Trong đó:
    $Handle[0] = Cookie dữ liệu đăng nhập
    $Handle[1] = UserID
    $Handle[2] = DTSG

    Ví dụ:
    (LHH) facebook.com/...follow...<ID của acc mình>....<ID của acc muốn follow>....dtsg=.....
    => _HttpRequest(1, 'facebook.com/...follow...' & Handle[1] & '....<ID của acc muốn follow>....dtsg=' & Handle[2], '', $Handle[0])

    Lưu ý là trong request của thằng FB thường dài và có các thành phần sau:
    userID=...&__a=1&__timestamp=....&__bc=....&__xyz=...&dtsg=.....
    Thì userID=, dtsg=, __a=1 (thằng __a này liên quan đến async trong api graph fb) là quan trọng và phải giữ lại, còn mấy thằng __abcxyz khác bỏ đi cũng đc.

    Còn làm sao để có được danh sách ID của bạn bè hoặc từ tường nhà bất kỳ thì mình sẽ đăng Hàm sau khi về :p:p
     
    kamsamita1 and Hồ Khánh Vũ like this.
  8. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    Bổ sung 3 hàm:

    - FB_TimeLineURLToUserID: Từ địa chỉ Timeline bất kì trả về 1 mảng - array Tên và ID của người dùng đó, ví dụ:
    $aInfo = FB_TimeLineURLToUserID($Handle, 'https://www.facebook.com/duyanh.official')
    _ArrayDisplay($aInfo)​

    - FB_Friend_List: Trả về 1 mảng - array Tên và ID danh sách bạn bè của mình, ví dụ:
    $aFriendsList = FB_Friend_List($Handle)
    _ArrayDisplay($aFriendsList)​
    Lưu ý: Acc của những người trong danh sách bạn bè đã bị Vô hiệu hoá hoặc bị Xoá bởi FB sẽ không có trong mảng trả về, vì vậy nếu thấy danh sách trả về bị thiếu thì đó không phải là lỗi.

    - FB_Friend_Add: Thêm Bạn bè nếu đã có UserID của người đó, ví dụ:
    Ví dụ 1:
    FB_Friend_Add($Handle, '1234567')​
    Ví dụ 2:
    $aInfo = FB_TimeLineURLToUserID($Handle, 'https://www.facebook.com/duyanh.official')
    FB_Friend_Add($Handle, $aInfo[1])​

    Thêm 3 hàm này vào cuối UDF Facebook.au3
    Mã (AutoIt):
         
         Func FB_TimeLineURLToUserID($Handle, $TimelineURL)
            If Not IsArray($Handle) Then Return SetError(1, 0, False)
            $TimelineURL = StringMid($TimelineURL, StringInStr($TimelineURL, '/', 1, -1) + 1)
            Local $Request = _HttpRequest(2, 'https://m.facebook.com/' & $TimelineURL, '', $Handle[0])
            If @error Or StringInStr($Request, 'href="/bugnub/?source=ErrorPage"', 0, 1) Then Return SetError(1, '', 'Tài khoản không tồn tại')
            Local $aRegexp, $aResult[2]
            $aRegexp = StringRegExp($Request, '<title>(.*?)</title>', 1)
            If @error Then Return SetError(2, '', 'Tài khoản không tồn tại')
            $aResult[0] = $aRegexp[0]
            $aRegexp = StringRegExp($Request, 'confirm/\?bid=(\d+)', 1)
            If @error Then Return SetError(2, '', 'Tài khoản không tồn tại')
            $aResult[1] = $aRegexp[0]
            Return $aResult
        EndFunc


        Func FB_Friend_List($Handle, $iStartSearch = 0, $iEndSearch = -1)
            If $Handle = False Or Not IsArray($Handle) Then Return SetError(1, '', False)
            If $iEndSearch = -1 Then $iEndSearch = 999999999
            If $iStartSearch > $iEndSearch Then Return SetError(2, '', 0)
            Local $aRet[0], $Request, $aListFr, $uBound, $iCount = 0, $iError = 0
            Local $TotalFr = StringRegExp(_HttpRequest(2, 'https://m.facebook.com/friends/center/mbasic/?fb_ref=tn&sr=1&ref_component=mbasic_home_header&ref_page=MFriendsCenterFriendsController', '', $Handle[0]), '\Q/friends/?mff_nav=1">\E.*?\((\d+?)\)\<\/a\>', 1)
            $TotalFr = (@error ? 0 : Int(StringRegExpReplace($TotalFr[0], '[\,\.]', '', 1)))
            If $TotalFr <> 0 And $iEndSearch = 999999999 Then $iEndSearch = Ceiling($TotalFr / 10)
            For $i = $iStartSearch To $iEndSearch
                $Request = _HttpRequest(2, 'https://m.facebook.com/friends/center/friends/?ppk=' & $i & '&bph=' & $i, '', $Handle[0])
                $aListFr = StringRegExp($Request, '\Qhref="/friends/hovercard/mbasic/?uid=\E(\d+)&amp;.*?last_acted">(.*?)\Q</a>\E', 3)
                If Not @error Then
                    $uBound = UBound($aListFr)
                    ReDim $aRet[$iCount + $uBound]
                    For $k = 0 To $uBound - 1
                        $aRet[$k + $iCount] = $aListFr[$k]
                    Next
                    $iCount += $uBound
                    ToolTip('Loading...' & Round(100 * $i / $iEndSearch, 1) & '%', 0, 0, 'Status', 1)
                EndIf
                If Not StringInStr($Request, '/friends/?ppk=' & ($i + 1) & '&amp;tid=u_0_0&amp;bph=' & ($i + 1) & '#friends', 1, 1) Then ExitLoop
            Next
            ToolTip('')
            ToolTip('Loading...100%', 0, 0, 'Status', 1)
            Return $aRet
        EndFunc


        Func FB_Friend_Add($Handle, $ID_User)
            If Not IsArray($Handle) Then Return SetError(1, 0, False)
            _HttpRequest(0, 'https://www.facebook.com/ajax/add_friend/action.php', 'to_friend=' & $ID_User & '&action=add_friend&how_found=hovercard&ref_param=hc_ufi&fb_dtsg=' & $Handle[2], $Handle[0])
        EndFunc
     
    thuandinh, kamsamita1, cao and 2 others like this.
  9. emga9xkc

    emga9xkc Thành viên năng động
    • 43/45

    Tham gia ngày:
    7/3/16
    Bài viết:
    232
    Đã được thích:
    205
    Cảm ơn bác :)
     
    kamsamita1 thích bài này.
  10. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    Xác nhận các bác đã phá đảo Facebook bằng win http. Nhờ thế mà có những cái Facebook ko cấp api, các bác bổ sung hết =))
     
    kamsamita1 thích bài này.
  11. kakanet

    kakanet Thành viên năng động
    • 43/45

    Tham gia ngày:
    24/2/16
    Bài viết:
    203
    Đã được thích:
    211
    Theo mình nghĩ thì nhiều người đã làm về fb bằng winhttp rồi nhưng dạng như họ giấu vì những mục đích như làm của riêng, có thể bán kiếm tiền... (bởi người cần code hầu hết là người ăn xổi, không biết nhiều về autoit cũng như cái mảng winhttp này) Tks team đã công khai udf này, nhờ nó mình làm được vài tool nhỏ phục vụ cho mình, đỡ làm bằng tay nhiều lắm (y)
     
    kamsamita1 thích bài này.
  12. Hồ Khánh Vũ

    Hồ Khánh Vũ Thành viên mới
    • 3/6

    Tham gia ngày:
    24/1/16
    Bài viết:
    13
    Đã được thích:
    22
    ok bác
     
    kamsamita1 thích bài này.
  13. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    các bác cho e hỏi là em thử gửi tin nhắn facebook cho người khác bằng winhttp nhưng cứ bị vướng cái messege_id trong data2send. e mò mãi không ra.Nếu e bỏ qua cái message_id thì nó ko hiện ra gì còn nếu bỏ vào thì ko biết lấy ở đâu.Cái data2send của lúc gửi tin nhắn "hello " đây ạ.Các bác xem giúp em với.E định get time lúc gửi tin nhắn mà bây giờ gửi cũng ko gửi đc :3

    Mã (Text):
    client=mercury&action_type=ma-type%3Auser-generated-message&body=hello&ephemeral_ttl_mode=0&has_attachment=false&message_id=6192975830618035629&offline_threading_id=6192975830618035629&other_user_fbid=100013188132006&signature_id=4d500e95&source=source%3Achat%3Aweb&specific_to_list[0]=fbid%3A100013188132006&specific_to_list[1]=fbid%3A100006526419466&timestamp=1476520497946&ui_push_phase=V3&__user=100006526419466&__a=1&__dyn=aKTyAW8-aFoFxp2uu4aEyAy965oR6yXoOUKiWFami8Vpt9LFGEkJpu5VJp9GzonAzQryAijyd7yWCHAxbGfKqqUDyVGwwyKbQubACkzAVFUG5uAUWVpfLKtojF3Ami4FeEKqFS7o9paryVUpKqiUCLQjDLzA5KuiaAz98KjDgHy4mEgzWyoK49kF9ah8zy448hyWgG9o9kEGu_x2p_mchAJ12Vpo-9GqfKrAyd3qBg&__af=o&__req=15&__be=-1&__pc=PHASED%3ADEFAULT&fb_dtsg=AQG_uzhedJI0%3AAQEyl-NgEJXe&ttstamp=265817195117122104101100747348586581691211084578103697488101&__rev=2624182&__srp_t=1476520452
    sau mã dài quá bạn cho vào thẻ CODE nhé bạn, mình sửa cho bạn nhé, thân
    aKiD
     
    Last edited by a moderator: 23/10/16
    kamsamita1 thích bài này.
  14. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    các bác cho em hỏi câu nữa ạ.Khi e get source tường nhà facebook của người khác nhưng nó chỉ trả về khoảng 3-4 bài post trên tường nhà nó thôi.Nhưng em muốn get được nhiều hơn thì làm thế à ạ @@ Nếu bình thường muốn xem nhiều bài hơn thì mình kéo xuống thì bài post cũ sẽ load ra.em ko biết request kiểu gì để nó load được nhiều hơn ạ.Chủ nhật hơi rảnh nên làm phiền các bác quá @@
     
    kamsamita1 thích bài này.
  15. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    1/ Gửi tin nhắn FB rất dễ, data2send chỉ cần 1 dòng ngắn là ra rồi, nhưng nếu công khai thì nguy cơ xì-pam là rất lớn=))
    Mình chỉ gợi ý là:
    - Message_id có thể là 1 trong những trường hợp sau đây, không bắt buộc như mẫu request nhìn thấy từ LHH:
    + Là user_id của người mình chat cùng.
    + Là thread_id (ID mà FB đặt cho cuộc hội thoại của mình và người hoặc nhóm mình chat)​
    - Xem lại cái lưu ý của mình khi trả lời cmt câu hỏi auto Follow của Hồ Vũ ở trên là sẽ biết những thứ nào có thể bỏ được trong data2send (à, timestamp cũng bỏ được luôn nhé)
    - Nếu vẫn làm chưa được nữa thì bạn hãy inb FB mình, mình sẽ chỉ cho bạn gợi ý quan trọng nhất :p


    2/ Dùng graph api hay dùng UDF này thì đều có vấn đề là: FB nó chỉ load thông tin nào đó như lấy danh sách bạn bè, list hình ảnh trong 1 album, list Nhóm đã tham gia ... dựa trên trang. 1 trang sẽ lấy được 1 lượng item (số bạn, số hình...) nhất định và nó sẽ cung cấp cho mình:
    - 1 Token key để request trang kế. (graph api)
    - 1 URL để request trang kế. (UDF)​
    Ví dụ: mình get source tường nhà nó trả về tầm 4-10 post gì đó, trong source nó sẽ bonus cho 1 cái URL có id là "next_page", "more_item",... đại loại thế, tiếp tục request với cái url đó, mình lại lấy thêm được những post tiếp theo và 1 cái url "trang kế", cứ tiếp tục thế đến khi hết thì thôi :v Tóm tắt lại như sau:
    Local $URL = 'https://fb.com....'
    Local $Ketqua[0]
    While 1

    $source = _HttpRequest(2, $URL)
    $Array_ItemCanLay= stringregexp(...) / _StringBetween(...)
    If @error then exitloop ;(nếu không tách được item cần lấy nào thì thoát lặp)
    _ArrayConcatenate($Ketqua, $Array_ItemCanLay) ;(Thêm items đã tách được vào biến $Ketqua)
    $next_page = stringregexp(...) / _StringBetween(...)
    If @error then exiloop ;(không có url kế thì thoát lặp)
    $URL = $next_page[0]
    Wend
     
    kamsamita1 and Ngọc Yến like this.
  16. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    thank bác nhiều.Mấy ngày e mò ko ra.Cái gì ko hiểu em lại hỏi bác tiếp :v
     
    kamsamita1 thích bài này.
  17. Tungtata

    Tungtata Tà tà mà sống ~ Thành viên BQT Administrator
    • 93/113

    Tham gia ngày:
    25/8/15
    Bài viết:
    289
    Đã được thích:
    924
    Nơi ở:
    Hà Nội
    Hay lắm bạn, chỉ có 1 điều là request dạng này sẽ bị ảnh hưởng nhiều bởi giao diện, nên sẽ bị lỗi khi fb thay đổi giao diện hoặc cấu trúc mã.
     
    kamsamita1 thích bài này.
  18. Huân Hoàng

    Huân Hoàng Administrator Thành viên BQT Administrator Super Moderator
    • 93/113

    Tham gia ngày:
    29/9/15
    Bài viết:
    642
    Đã được thích:
    1,181
    à, iêm thấy đổi gì thì đổi chứ đám id, class thì chắc không ảnh hưởng đâu, regexp khéo tí thì không lo :p:p:p
     
    kamsamita1 and Tungtata like this.
  19. Ngọc Yến

    Ngọc Yến Thành viên
    • 13/23

    Tham gia ngày:
    11/6/16
    Bài viết:
    24
    Đã được thích:
    27
    thank bác nhé.e làm như bác nói và đã ok.Em cảm ơn :D
     
    kamsamita1 thích bài này.
  20. minhvnnhut

    minhvnnhut Thành viên mới
    • 3/6

    Tham gia ngày:
    28/10/16
    Bài viết:
    25
    Đã được thích:
    5
    có bác nào giúp mình với :o mình đã ghi tài khoản và mật khầu mà chạy thử thì báo đăng nhập thất bại
     
    kamsamita1 thích bài này.

Chia sẻ trang này

Đang tải...