使用Python请求发送表单的方式与Perl LWP::UserAgent相同

使用Python请求发送表单的方式与Perl LWP::UserAgent相同,python,perl,python-requests,Python,Perl,Python Requests,需要将用于向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";

需要将用于向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;
#/usr/bin/perl
$login=$ARGV[0];
$pass=$ARGV[1];
#加载必要的perl模块
使用HTTP::Request::Common;
使用LWP::UserAgent;
$url=”https:///netaccess/loginuser.html";
my$ua=LWP::UserAgent->new(ssl\u opts=>{verify\u hostname=>0});
#张贴凭证
我的$res=$ua->请求(发布“$url”、[username=>“$login”、password=>“$pass”、sid=>“0”]);
$res->is_success or die“未能将凭据发布到“$url”:“,$res->status_行;
#/bin/python
导入请求
导入urllib3
导入系统
从requests.packages.urllib3.exceptions导入不安全请求警告
requests.packages.urllib3.disable_警告(不安全的RequestWarning)
会话=请求。会话()
有效负载={'sid':'0',“用户名”:sys.argv[1],“密码”:sys.argv[2]}
r_post=会话。post(“https:///netaccess/loginuser.html",
数据=有效载荷,
验证=错误,
)
打印(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>

函数doRefresh()
{
location.replace(“/netaccess/connstatus.html”);
}
网络用户身份验证需要网络用户身份验证。

您未登录。
用户IP:
文档。表单[0]。登录。焦点()
python程序运行良好。 我在requestbin上进行了测试,通过在requestbin上创建一个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_登录之前添加此项:

 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)

提示:将密码作为参数传递是不安全的。机器上的其他用户可以看到它们。请详细说明“结果实际上不一样”。代码看起来不错,但可能需要一些特殊的表单编码或其他东西。默认情况下,
LWP::UserAgent
请求的可能重复使用
应用程序/x-www-form-urlencoded
MIME。所以我不知道什么是“不一样的”。Re“我看起来像python在URL中以参数的形式发送这个”,用于POST请求?我不懂Python,更不用说这个特定的模块(或者Python如何称呼它们),但这似乎不太可能。你是怎么得出这个结论的?