[英]Why do I get “405: Method Not Allowed” when I send a POST request with Perl's REST::Client, but not with Perl's LWP::UserAgent or 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.