自动化登录网站的流程比较简单,如果不懂 Python、JavaScript、C++ 等编程语言,又没有安装这些编程语言环境软件,我们还要新的点子:用Windows系统自带的 Powershell 运行自编的脚本来实现。
PowerShell 是一种功能强大的自动化工具,除了可以使用 DOS 批处理命令之外,还可以进行计算,网络爬虫,抓取网页数据等骚操作。 在本文中,我们将探讨如何使用 PowerShell 登录一个论坛。
Powershell的好处:
1、Windows自带,不需要安装编程语言环境,用任何一款文本编辑器(如“记事本”)都可以编辑脚本。
2、自带函数,网络编程不需要另外安装库文件或头文件。
3、与DOS的.bat批处理一样是解释型编程,不需要编译成.exe,可以逐行输入一步步运行代码。
第一步:初始化登录页面的 URL 和将用于发出请求的会话对象(Session)。
$login_url = 'http://登录网址'
$username = '登录账号'
$password = '登录密码'
# 创建一个Session,会自动记录Cookies便于后续的网络访问
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
第二步:Invoke-WebRequest 命令发出 GET 请求打开登录的网页,可以使用 -SessionVariable 参数来保存会话对象以备后用。
网页源代码保存在$response1.Content变量中,然后从该变量里通过正则表达式提取登录所需的表单数据,比如某论坛的登录页面源代码里的一个 hash 值。
$response1 = Invoke-WebRequest -Uri $login_url -SessionVariable session
# 发出GET请求后获得的网页源代码保存在$response1.Content变量中
# 正则表达式提取网页源代码 name="hash" value="…………" 中“…………”的内容
if ($response1.Content -match 'name="hash" value="(.*?)"') {
$hash = $Matches[1]
}
$Matches 变量是一个特殊的 PowerShell 变量,它保存正则表达式抓取的结果。
第三步:准备将在登录表单提交中发送的数据。 创建一个包含必填字段的 data 表,包括上面提取到的 hash 值、用户名和密码。
然后再用Invoke-WebRequest 命令传入数据( -Body $data)和会话对象。必须使用 -WebSession $session 参数以保持会话连接(延续使用上面网络访问后产生的 cookies)。
$data = @{
hash = $hash
username = $username
password = $password
}
# "POST"发送表单数据来登录网站
$response2 = Invoke-WebRequest -Uri $login_url -Method POST -Body $data -WebSession $session
第四步:发出 POST 请求后,服务器返回的信息形式可能如下:
{"status":1,"msg":"\u767b\u5f55\u6210\u529f","redirect":{"timeout":2,"subject":"\u9996\u9875","href":"\/"}}
很明显这是一个 JSON 对象,其中的“msg”就是我们需要了解的登录结果文本,由于文本被编码成Unicode,要转换为人能看懂的文字,就需要使用 ConvertFrom-Json cmdlet 解析该对象再来输出正确的文本消息。
# 将服务器返回的网页源代码文本转换为JSOn格式
$json1 = $response2.Content
$obj = $json1 | ConvertFrom-Json
# 从JSON中提取 "msg" 的文本并输出
$msg1 = $obj.msg
Write-Output $msg1
由于 PowerShell 是解释型运行代码,因此上述的代码可以在 PowerShell 提示符里直接粘贴运行。也可以像 DOS 的 .bat 批处理文件那样先把以上的代码保存成 Powershell 的脚本格式,扩展名是 .ps1,文件名任意,比如:my login test.ps1,保存在 D:\Documents。然后在开始菜单选择打开 Powershell,运行步骤如下:
cd "d:\documents"
.\"my login test.ps1"
文件名、目录名加双引号为了防止有空格而出错,运行脚本的命令是文件名前面必须要有 .\
注意:如果你是第一次运行 .ps1 脚本文件,很可能 PowerShell 会提示以下的错误信息:
无法加载文件 D:\documents\my login test.ps1,因为在此系统上禁止运行脚本。
有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies。
所在位置 行:1 字符: 3
+ .\"my login test.ps1"
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
原因是首次启动 PowerShell 时,现用执行策略很可能是 Restricted(不允许任何脚本运行)。需要开启运行脚本,在 PowerShell 里输入命令:
set-ExecutionPolicy RemoteSigned
然后按提示输入 A (永久生效)或 Y (临时生效)即可继续运行脚本。