如何仅使用python-requests

时间:2017-05-30 18:22:59

标签: python python-requests

我正在尝试编写一个快速脚本来检查我的Presto卡(加拿大安大略省的公共交通支付卡)的余额,仅使用python请求。

在他们的网站(prestocard.ca)上,如果您点击"登录"在右上角,它会弹出一个浮动的标签菜单。如果您点击"没有帐户"它允许您输入您的卡号并单击"登录"然后它会将您带到另一个页面(/仪表板),从中可以很容易地刮掉卡片余额。但是,我无法弄清楚如何使用python-requests来提供我的卡#并加载仪表板页面。

以下是浮动标签式菜单的网页来源的重要/相关部分:

<form action="/api/sitecore/AFMSAuthentication/SignInWithFareMedia" id="sign-in-without-account" method="post">
<div class="form-group signinwithoutaccount13">
<label for="fareMediaId">PRESTO Card Number*</label>
<input type="text" class="signin-input form-control signin-tabs_input" id="fareMediaId" name="fareMediaId" aria-describedby="frmError" aria-required="true">
<span class="errorMsg" id="frmError"></span>
</div>
<div class="form-group">
<button type="submit" class="green-btn signin-modal-signin-btn btn__background--emphasis btn__border--emphasis btn__text--white" id="Numsignin">Sign In</button>
<button type="reset" id="btncancelmodal_wa" data-dismiss="modal" class="green-btn signin-modal-signin-btn btn__background--white btn__border--grey btn__text--black">Cancel</button>
</div>
</form>

似乎应该很简单,但我还没有能够让它发挥作用。也许是因为https ...我对POST / GET请求,cookie和/或SSL的了解不够充分。我尝试了这些方面没有成功的事情(<Response [200]>):

import requests
url = 'https://www.prestocard.ca/api/sitecore/AFMSAuthentication/SignInWithFareMedia'
payload = {}
payload['fareMediaId'] = # MY card ID
with requests.Session() as s:
    bob = s.post(url, data=payload)
    bob = s.get('https://www.prestocard.ca/en/dashboard')
print bob.text

我找到了this github代码,但它仅用于使用帐户登录(因此我无法对其进行测试),并且它使用了比我认为必要的更多python模块(尽管我可能是错的)。任何写一个只需要python请求的python脚本的帮助/建议都会非常感激。

1 个答案:

答案 0 :(得分:0)

问题中的代码实际上运行得很好。下面的代码略有改进:它从返回的网站上检索确切的Presto卡余额作为浮点数(只要您输入自己的Presto卡ID作为一系列没有破折号的数字):

import requests

url = 'https://www.prestocard.ca/en/api/sitecore/AFMSAuthentication/SignInWithFareMedia'
with requests.Session() as s:
    prestopage = s.post(url, data={'fareMediaId': 'ENTERYOURPRESTONUMBERHERE'})
    prestopage = s.get('https://www.prestocard.ca/en/dashboard')
print float(prestopage.text.split(r'<span class="rob-cart-amount">$')[1].split(r"</span>")[0])