找回密码
 加入
搜索
查看: 15668|回复: 16

[求购] 30RBM求一个能获取完整cookies的方法

  [复制链接]
发表于 2016-9-29 16:43:25 | 显示全部楼层 |阅读模式
悬赏1金钱未解决
一句话描述:用ie登录阿里妈妈网站后通过ie对象获取完整cookies来被winhttp使用

困难:网站无法post登录,必须模拟,cookies包含httponly

请大牛指教一下 ,难度大的我加

示例代码如下:

#include <IE.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 623, 600, 192, 114)
$ieobj = _IECreateEmbedded()
GUICtrlCreateObj($ieobj, 0, 0, 617, 393)
_IENavigate($ieobj, "https://login.taobao.com/member/login.jhtml?style=mini&from=alimama")
$Edit1 = GUICtrlCreateEdit("", 0, 400, 617, 140, $WS_VSCROLL)
$button = GUICtrlCreateButton("提交", 270, 560, 80, 30)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        getjson()
        EndSwitch
        $cookies = _IEDocGetObj($ieobj).cookie
        If GUICtrlRead($Edit1) <> $cookies Then GUICtrlSetData($Edit1, $cookies)
WEnd
Func getjson()
        $url = "http://pub.alimama.com/pubauc/getCommonCampaignByItemId.json?itemId=528423266110"
        $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
        $oHTTP.Open("get", $url, False)
        $oHTTP.setRequestHeader("Cookie", $cookies)
        $oHTTP.Send()
        $dxjson = $oHTTP.responsebody
        MsgBox(0,0,BinaryToString($dxjson, 4))
EndFunc   ;==>getjson

 楼主| 发表于 2016-9-29 20:38:47 | 显示全部楼层
用InternetGetCookieEx 应该可以实现,
应为对dllcall完全不懂,临时突击了一下

$url = _IEPropertyGet($ieobj ,"locationurl")
$dllsize = "1024"
$getcookies = DllCall("wininet.dll" ,"wstr" ,"InternetGetCookieEx" ,"wstr" ,$url ,"PTR" ,"NULL" ,"wstr" "" ,"DWORD" ,$dllsize ,"DWORD" ,"INTERNET_COOKIE_HTTPONLY" ,"PTR" ,"NULL")
_ArrayDisplay($getcookies)

然后还是获取不到
BOOL InternetGetCookieEx(
  _In_        LPCTSTR lpszURL,
  _In_        LPCTSTR lpszCookieName,
  _Inout_opt_ LPTSTR  lpszCookieData,
  _Inout_     LPDWORD lpdwSize,
  _In_        DWORD   dwFlags,
  _In_        LPVOID  lpReserved
);
发表于 2016-9-29 21:00:25 | 显示全部楼层
按部就班一步一步post呗
 楼主| 发表于 2016-9-29 21:50:34 | 显示全部楼层
回复 3# haijie1223


    阿里系的网站要能post成功  简直是比登天还难
发表于 2016-9-29 21:57:17 | 显示全部楼层
回复 4# cxlater


    对Cookies不太明白,不过那个api应该是这么写:
#include <ARRAY.AU3>
#include <WinAPI.au3>
Global $INTERNET_COOKIE_HTTPONLY = 8192 ;Requires IE 8 or higher
Global $INTERNET_COOKIE_THIRD_PARTY = 131072
Global $INTERNET_FLAG_RESTRICTED_ZONE = 16
Global $sUrl = '你的网址'
Global $sCookieName = '网站的cookies名称'
Global $tSize = DllStructCreate("dword[10000]")
Global $tBuffer = DllStructCreate('char[10000]')
Global $getcookies = DllCall("wininet.dll", _
                "bool", "InternetGetCookieExW", _
                'wstr', $sUrl, _
                'wstr', $sCookieName, _
                "ptr", DllStructGetPtr($tBuffer), _
                "ptr", DllStructGetPtr($tSize), _
                "dword", $INTERNET_COOKIE_HTTPONLY, _
                "ptr", Null _
                )
If Not _WinAPI_GetLastError() Then ConsoleWrite(DllStructGetData($tBuffer, 1) & @CRLF)
ConsoleWrite(_WinAPI_GetLastError() & @CRLF)
_ArrayDisplay($getcookies)
发表于 2016-9-30 10:02:22 | 显示全部楼层
好像有另外一个API函数,忘了什么了
 楼主| 发表于 2016-9-30 10:18:39 | 显示全部楼层
还是,淘宝的登录页面,有一个cookie2的cookie字段, 只要能获取到他就ok了

完整可重现代码:

#include <IE.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ARRAY.AU3>
#include <WinAPI.au3>
$Form1 = GUICreate("Form1", 623, 600, 192, 114)
$ieobj = _IECreateEmbedded()
GUICtrlCreateObj($ieobj, 0, 0, 617, 393)
_IENavigate($ieobj, "https://login.taobao.com/member/login.jhtml?style=mini&from=alimama")
$Edit1 = GUICtrlCreateEdit("", 0, 400, 617, 140, $WS_VSCROLL)
$button = GUICtrlCreateButton("提交", 270, 560, 80, 30)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        getjson()
        EndSwitch
        $cookies = _IEDocGetObj($ieobj).cookie
        If GUICtrlRead($Edit1) <> $cookies Then GUICtrlSetData($Edit1, $cookies)
WEnd
Func getjson()
        Global $INTERNET_COOKIE_HTTPONLY = 8192 ;Requires IE 8 or higher
        Global $INTERNET_COOKIE_THIRD_PARTY = 131072
        Global $INTERNET_FLAG_RESTRICTED_ZONE = 16
        Global $sUrl = _IEPropertyGet($ieobj ,"locationurl")
        Global $sCookieName = 'cookie2'
        Global $tSize = DllStructCreate("dword[10000]")
        Global $tBuffer = DllStructCreate('char[10000]')
        Global $getcookies = DllCall("wininet.dll", _
                        "bool", "InternetGetCookieExW", _
                        'wstr', $sUrl, _
                        'wstr', $sCookieName, _
                        "ptr", DllStructGetPtr($tBuffer), _
                        "ptr", DllStructGetPtr($tSize), _
                        "dword", $INTERNET_COOKIE_HTTPONLY, _
                        "ptr", Null _
                        )
        If Not _WinAPI_GetLastError() Then ConsoleWrite(DllStructGetData($tBuffer, 1) & @CRLF)
        ConsoleWrite(_WinAPI_GetLastError() & @CRLF)
        _ArrayDisplay($getcookies)
;~         
;~         $url = "http://pub.alimama.com/pubauc/getCommonCampaignByItemId.json?itemId=528423266110"
;~         $oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
;~         $oHTTP.Open("get", $url, False)
;~         $oHTTP.setRequestHeader("Cookie", ClipGet())
;~         $oHTTP.Send()
;~         $dxjson = $oHTTP.responsebody
;~         MsgBox(0, 0, BinaryToString($dxjson, 4))
EndFunc   ;==>getjson

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-10-1 07:49:11 | 显示全部楼层
是做阿里妈妈链接转换吗?
做好的代码分我!
发表于 2016-10-1 07:52:54 | 显示全部楼层
淘宝的我做过httponly 的COOKIE,当时弄了很多天
我发的浏览器 XIE里面好像有的
_WinINet_InternetSetCookie
必须在内嵌窗口内,我好像记得
_IEEx_InternetSetCookie("http://www.iqiyi.com/", $__IQIYI)
Func _IEEx_InternetSetCookie($__URL, $__VALUE)
        $__COOKIE = StringRegExp($__VALUE, "\S+\=[^;]*", 3)
        For $i = 0 To UBound($__COOKIE) - 1
                $___COOKIE = StringRegExp($__COOKIE[$i], "(\A\S+?)=([^;]*)", 3)
                _WinINet_InternetSetCookie($__URL, $___COOKIE[1], $___COOKIE[0])
        Next
EndFunc   ;==>_IEEx_InternetSetCookie
还可以把COOKIE 自定义路径
发表于 2016-10-1 07:55:29 | 显示全部楼层
session 无法保存在本地,但是可以自己读取,保存,然后用我上面的代码来恢复!
 楼主| 发表于 2016-10-1 14:04:12 | 显示全部楼层
回复 8# heavenm


过程很简单   我目前已经用xmlhttp实现了,因为他跟ie共享cookies,所以不存在提取cookies的问题.  只是xmlhttp有诸多不变,想改用winhttp.

用fiddler抓包过程,无非就申请计划   判断最高佣   退出定向 生成连接   这些半天就搞定了

你也是做淘客的?
发表于 2016-10-1 14:18:46 | 显示全部楼层
嗯啊!有什么交流的!~~~
你有转换链接的不
发表于 2016-12-20 22:38:58 | 显示全部楼层
淘宝的我做过httponly 的COOKIE,当时弄了很多天
我发的浏览器 XIE里面好像有的
_WinINet_InternetSetCoo ...
heavenm 发表于 2016-10-1 07:52


H大,是否可以分享下这个函数呢 _WinINet_InternetSetCookie   
发表于 2017-3-12 14:42:36 | 显示全部楼层
回复 7# cxlater


你好,我按照你的代码,发现取不了一号店的 ut 这个cookie,能帮我看下是为什么么





ut 在登陆后能用httpwatch 看到
#include <IE.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ARRAY.AU3>
#include <WinAPI.au3>
$Form1 = GUICreate("Form1", 623, 600, 192, 114)
$ieobj = _IECreateEmbedded()
GUICtrlCreateObj($ieobj, 0, 0, 617, 393)
_IENavigate($ieobj, "https://passport.yhd.com/passport/login_input.do?")
$Ele = _IEGetObjById($ieobj,"un")
_IEFormElementSetValue($Ele,"13078480989")
$Ele = _IEGetObjById($ieobj,"pwd")
_IEFormElementSetValue($Ele,"9zuzz4yk9")
;账号:13078480989        密码:9zuzz4yk9

$Edit1 = GUICtrlCreateEdit("", 0, 400, 617, 140, $WS_VSCROLL)
$button = GUICtrlCreateButton("提交", 270, 560, 80, 30)
GUISetState(@SW_SHOW)
 
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $button
                        getjson()
        EndSwitch
        $cookies = _IEDocGetObj($ieobj).cookie
        If GUICtrlRead($Edit1) <> $cookies Then GUICtrlSetData($Edit1, $cookies)
WEnd
Func getjson()
        Global $INTERNET_COOKIE_HTTPONLY = 8192 ;Requires IE 8 or higher
        Global $INTERNET_COOKIE_THIRD_PARTY = 131072
        Global $INTERNET_FLAG_RESTRICTED_ZONE = 16
        Global $sUrl = _IEPropertyGet($ieobj ,"locationurl")
        Global $sCookieName = 'ut'
        Global $tSize = DllStructCreate("dword[10000]")
        Global $tBuffer = DllStructCreate('char[10000]')
        Global $getcookies = DllCall("wininet.dll", _
                        "bool", "InternetGetCookieExW", _
                        'wstr', $sUrl, _
                        'wstr', $sCookieName, _
                        "ptr", DllStructGetPtr($tBuffer), _
                        "ptr", DllStructGetPtr($tSize), _
                        "dword", $INTERNET_COOKIE_HTTPONLY, _
                        "ptr", Null _
                        )
        If Not _WinAPI_GetLastError() Then ConsoleWrite(DllStructGetData($tBuffer, 1) & @CRLF)
        ConsoleWrite(_WinAPI_GetLastError() & @CRLF)
        _ArrayDisplay($getcookies)
EndFunc   ;==>getjson

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2017-3-12 22:28:32 | 显示全部楼层
请问  _IEDocGetObj($ieobj).cookie
获取httponly的cookie, 有解决了这个问题么
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-22 10:45 , Processed in 0.077774 second(s), 18 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表