1. 程式人生 > >個人支付寶支付系統 ---- 獲取賬單資訊

個人支付寶支付系統 ---- 獲取賬單資訊

解決思路

  1. 使用者通過轉賬碼給支付寶賬號轉賬。
  2. 轉賬之後提交轉賬 「流水號」給後臺伺服器
  3. 後臺伺服器模擬登入支付寶網頁版,查詢最近的訂單
  4. 比較資料,成功則自動發貨

支付寶賬單的查詢

一開始的思路是,通過 POST 資料登入支付寶 web 版。 後來嘗試了一下,發現。支付寶關閉了 POST。 想要登入獲取資訊的話, 那麼只剩下一條路了: 通過『 cookies 』登入

訂單查詢 v1:

手動登入支付寶 web 版本, 開啟 chrome 開發工具,找到 cookies, 複製出來。

上述步驟很我們在 爬取螺紋鋼資料 這篇文章裡已經詳細的描述過了, 我就不過多介紹了。

我就說一個將字串快速轉換為字典型別的技巧

# 將複製到 cookies 轉換為字典,方便呼叫
raw_cookies = 'JSESSIONID=RZ13thOM1d   後面省略了,調式的話用自己的  '
cookie = SimpleCookie(raw_cookies)
cookies = {i.key: i.value for i in cookie.values()}

得到了 cookies,我們就能在登入狀態下獲取資料了。 主要用到的是: requests 模組的 session 下面就看看 v1 版本的整體程式碼吧 整體程式碼:

'''
嘗試登入支付寶
並獲賬單記錄
'''

import requests
from
http.cookies import SimpleCookie from bs4 import BeautifulSoup # 自定義 headers HEADERS = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36', 'Referer': 'https://consumeprod.alipay.com/record/advanced.htm', 'Host'
: 'consumeprod.alipay.com', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Connection': 'keep-alive' } # 將複製到 cookies 轉換為字典,方便呼叫 raw_cookies = 'JSESSIONID=RZ13thOM1dM5K05460101"; 中間省略了 one=RZ250AATO/mr4CZ1cRnxgFmVR' cookie = SimpleCookie(raw_cookies) cookies = {i.key: i.value for i in cookie.values()} # 嘗試使用面向物件的方式來造爬蟲 class Alipay_Bill_Info(object): '''支付寶賬單資訊''' def __init__(self, headers, cookies): ''' 類的初始化 headers:請求頭 cookies: 持久化訪問 info_list: 儲存賬單資訊的列表 ''' self.headers = headers self.cookies = cookies # 利用 requests 庫構造持久化請求 self.session = requests.Session() # 將請求頭和 cookies 新增到快取之中 self.session.headers = self.headers self.session.cookies.update(self.cookies) self.info_list = [] def login_status(self): '''判斷登入狀態''' status = self.session.get( 'https://consumeprod.alipay.com/record/standard.htm', timeout=5, allow_redirects=False).status_code print(status) if status == 200: return True else: return False def get_data(self): ''' 利用 bs4 庫解析 html 並抓取資料, 資料以字典格式儲存在列表裡 ''' status = self.login_status() url = 'https://consumeprod.alipay.com/record/standard.htm' if status: html = self.session.get(url).text soup = BeautifulSoup(html, 'lxml') # 抓取前五個交易記錄 trades = soup.find_all('tr', class_='J-item ')[:5] for trade in trades: # 做一個 try except 避免異常中斷 try: # 分別找到賬單的 時間 金額 以及流水號 time = trade.find('p', class_='text-muted').text.strip() amount = trade.find( 'span', class_='amount-pay').text.strip() code = trade.find( 'a', class_='J-tradeNo-copy J-tradeNo')['title'] self.info_list.append( dict(time=time, amount=amount, code=code)) except: self.info_list.append({'error': '出現錯誤,請加站長支付寶好友獲取充值碼'}) else: self.info_list.append({'error': '出現錯誤,請加站長支付寶好友獲取充值碼'}) # 測試一下: test = Alipay_Bill_Info(HEADERS, cookies) test.get_data() print(test.info_list) ''' OUT: 200 [{'time': '07:34', 'amount': '- 3.00', 'code': '2017081521001004100329637047'}, {'time': '07:08', 'amount': '- 100.00', 'code': '2017081521001004100329622812'}, {'time': '05:37', 'amount': '+ 0.14', 'code': '20170815344111650101'}, {'time': '01:08', 'amount': '+ 10.00','code': '20170815200040011100040078948930'}, {'time': '22:23', 'amount': '+ 10.00', 'code': '20170814200040011100060079678223'}] '''