簡體   English   中英

以與 Perl LWP::UserAgent 相同的方式使用 Python 請求發送表單

[英]Send form with Python requests the same way as Perl LWP::UserAgent does

用於對 Cisco Systems 防火牆進行身份驗證的腳本需要從 perl 轉換為 Python。

這個 perl 腳本需要轉換為 python 等價物。

#!/usr/bin/perl

$login=$ARGV[0];
$pass=$ARGV[1];

# load necessary perl modules
use HTTP::Request::Common;
use LWP::UserAgent;

$url="https://<ip>/netaccess/loginuser.html";

my $ua = LWP::UserAgent->new(ssl_opts => { verify_hostname => 0 });

# POST credentials

my $res = $ua->request(POST "$url", [username => "$login", password => "$pass", sid => "0"]);
$res->is_success or die "Failed to POST credentials to '$url': ", $res->status_line;
#!/bin/python
import requests
import urllib3
import sys

from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

session = requests.Session()

payload = {'sid' : '0', "username" : sys.argv[1], "password" : sys.argv[2]}

r_post = session.post("https://<ip>/netaccess/loginuser.html",
   data=payload,
   verify=False,
   )

print(r_post.text)

結果其實不太一樣。 我看起來 python 正在將它作為 URL 中的參數發送,而 perl 這是在表單中。

更新 :

我嘗試使用的頁面是:

</style>
</head>
<body bgcolor=white alink="#333366" vlink="#333366" link="#333366">

<script language="JavaScript1.1">
function doRefresh()
{
    location.replace("/netaccess/connstatus.html");
}
</script>

<FORM method=post ACTION="/netaccess/connstatus.html">

<INPUT type=hidden name=sid VALUE="0">



<h3>Network User Authentication</h3><p><p>Network User Authentication is <i>required</i>.</p> <table border cellpadding=5><tr><td><input type=submit width=120 style="width:120" name=login value="Log In Now"></td><td><b>You are not logged in.</b><br>User IP: <br></td></tr></table><script language="JavaScript">document.forms[0].login.focus()</script>

</FORM>
</body>
</html>

python程序運行良好。 我在 requestbin 上進行了測試,通過在 request bin 上創建一個 bin 並查看兩個程序的結果,在這里查看結果。

另一方面,您粘貼的表單具有不同的表單提交 URL ( /netaccess/connstatus.html )。

我試圖從類似的 perl 腳本到 Python 做同樣的事情。 最后,我設法通過先執行 GET 然后執行 POST 使其工作

url = "https://ip_address/netaccess/loginuser.html"

auth = {"username":user ,"password": passw, "sid": 0}

login = requests.Session()

req_login = login.get(url, verify=False)
send_login = login.post(url, data=auth, verify=False)

如果您想在會話超時之前定期進行身份驗證,則需要在 req_login 之前添加:

 status_url = "https://ip_address/netaccess/connstatus.html"
 logout = {"sid": 0, "logout": "Log+Out+Now"}
 req_logout = login.post(status_url, data=logout, verify=False)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM