首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WinHttpRequest COM进行登录?

如何使用WinHttpRequest COM进行登录?
EN

Stack Overflow用户
提问于 2015-04-05 15:29:29
回答 1查看 2.9K关注 0票数 4

你可以看到很多人在网站上使用鼠标和按键模拟在浏览器窗口或使用IE来实现自动化,但是对于一些应用程序来说,你不希望你的应用程序占用上百兆内存,并且使用负载的CPU来渲染网站等等。

所以问题是:

如何在没有浏览器但使用AutoHotkey COM的情况下使用WinHttpRequest登录网站/ the服务?

EN

回答 1

Stack Overflow用户

发布于 2015-04-05 15:29:29

我已经在AHK论坛上发布了这个信息,但是我认为这些信息是足够有用的,可以在Stackoverflow上存档。:)

工具与开始

首先,如果您想做诸如登录之类的事情,您可能应该学习一些HTML和HTTP协议的基础知识。费德勒SetProxy(2,localhost:8888)将对您的调试和反向工程提供很大帮助。我还建议您的浏览器使用add on以快速实现清理你的饼干

实例1(知识产权委员会论坛)

好了,现在让我们来看看一些例子。登录到autohotkey.com论坛会是什么样子?

为了反向工程that站点的登录,我简单地分析了autohotkey.com的浏览器HTTP请求(为此在浏览器中使用Fiddler或F12 ),通过一些尝试和错误,我能够将其最小化到最基本的水平。我们需要两个请求,登录需要一个请求头,以及3个POST数据参数。

以下是我们要做的事情:

  1. ion=login上执行一个简单的GET请求
  2. 从响应体(ResponseText)中提取登录表单中的auth_key参数
  3. 创建包含auth_key参数以及登录的用户名、密码和rememberMe参数的POST数据字符串
  4. 为下一个请求设置内容类型标头
  5. 将POST数据字符串发送到ion=login&do=process
  6. 分析响应体,检查HTML文档标题是否以“登录”开头。如果是这样,那么显然没有登录(登录失败/登录数据错误)。如果标题不同,则登录成功。

示例1代码

代码语言:javascript
复制
;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects

;Set our URLs
loginSiteURL := "http://www.autohotkey.com/board/index.php?app=core&module=global&section=login"
loginURL := "http://www.autohotkey.com/board/index.php?app=core&module=global&section=login&do=process"

;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
rememberMe := "1"

;Step 1
HttpObj.Open("GET",loginSiteURL)
HttpObj.Send()

;Step 2
RegExMatch(HttpObj.ResponseText,"<input\stype='hidden'\sname='auth_key'\svalue='(\w+)'\s/>",match)
auth_key := match1

;Step 3
loginBody := "auth_key=" auth_key "&ips_username=" username "&ips_password=" password "&rememberMe=" rememberMe

;Step 4/5
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)

;Step 6
If (InStr(HttpObj.ResponseText,"<title>Sign In"))
    MsgBox, The login failed!
Else
    MsgBox, Login was successfull!

如果正确地更改URL,这可能对大多数IPB论坛都有效。

例2 (phpbb论坛)

让我们再次登录到新的/其他AHK论坛(这将更容易)。

  1. 创建包含用户名、密码和autologin参数的POST数据
  2. 设置内容类型标头
  3. 将POST数据发送到http://ahkscript.org/boards/ucp.php?mode=login
  4. 分析响应体,检查HTML文档标题是否以单词"Login“开头。如果是这样,那么您显然还没有登录(登录失败/登录数据错误)。如果标题不同,则登录成功。

示例2代码

代码语言:javascript
复制
;Prepare our WinHttpRequest object
HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
;HttpObj.SetProxy(2,"localhost:8888") ;Send data through Fiddler
HttpObj.SetTimeouts(6000,6000,6000,6000) ;Set timeouts to 6 seconds
;HttpObj.Option(6) := False ;disable location-header rediects

;Set our URLs
loginURL := "http://ahkscript.org/boards/ucp.php?mode=login"

;Set our login data
username := "Brutosozialprodukt"
password := "xxxxxxxxxxxxxx"
autologin := "on"

;Step 1
loginBody := "username=" username "&password=" password "&autologin=" autologin "&login=Login"

;Step 2/3
HttpObj.Open("POST",loginURL)
HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
HttpObj.Send(loginBody)

;Step 4
If (InStr(HttpObj.ResponseText,"<title>Login"))
    MsgBox, The login failed!
Else
    MsgBox, Login was successfull!

如果正确地更改URL,这可能对大多数phpbb论坛都有效。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29458900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档