Python 3,urllib POST 提交

7 投票
2 回答
16294 浏览
提问于 2025-04-16 16:42

我想写一个Python脚本,自动登录到我的宽带使用计量账户。之前我从来没有做过POST提交,所以遇到了一些问题。

import urllib.request, urllib.parse, urllib.error
import socket

try:
    details = urllib.parse.urlencode({ 'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD' })
    url = urllib.request.Request('https://login1.telecom.co.nz/distauth/UI/Login?realm=XtraUsers&goto=https%3A%2F%2Fwww.telecom.co.nz%3A443%2Fjetstreamum%2FxtraSum%3Flink%3Drdt', details)
    url.add_header("User-Agent","Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13")

    responseData = urllib.request.urlopen(url).read().decode('utf8', 'ignore')
    responseFail = False

except urllib.error.HTTPError as e:
    responseData = e.read().decode('utf8', 'ignore')
    responseFail = False

except urllib.error.URLError:
    responseFail = True

except socket.error:
    responseFail = True

except socket.timeout:
    responseFail = True

except UnicodeEncodeError:
    print("[x]  Encoding Error")
    responseFail = True

print(responseData)

从HTML中我发现,IDToken1是用户名的标识,IDToken2是密码的标识。

我的问题是:

  • 当我输入正确的用户名和密码时,登录页面会加载,但:

  • 当我输入错误的用户名或密码时,我会看到一个页面,上面写着:

    这个服务器遇到了内部错误,无法满足你的请求。最可能的原因是配置错误。请让管理员查看服务器的错误日志。

2 个回答

0

这可能是故意这样设计的。你在浏览器里试试会发生什么?如果用正确的数据能正常工作,那说明你做得没错。

8
details = urllib.parse.urlencode({'IDToken1': 'USERNAME', 'IDToken2': 'PASSWORD'})

添加以下这一行:

details = details.encode('UTF-8')

撰写回答