大多時候,人們在使用不同的線上服務平台時,沒辦法拿到 API,以及無法擴充功能,此時,自己找到 API ,然後繼承使用才是解決之道。

Requests

Requests 是一個強而有力的 python http套件之一,透過這個套件來取得 API。

安裝:

pip install requests  

找 Header

看看請求的 Header ,然後嘗試一些登入的協定規範:

測試一下 API,果然就直接 dump 出來了。

到 Postman 來看看(這部分要另外安裝 Postman Interceptor)

測試 Requests

首先,如果直接傳 auth ,他會吐給你不支援瀏覽器之類的問題:

import requests

url = "http://url"  
r = requests.get(url,auth=('user','pass'))


print r.text  
print r.request.headers  
print s.cookies

這個時候,加上 user-agent 就解決了! 但是你依然會遇到一些問題!

import requests

headers = {  
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'
}

url = "http://url"  
r = requests.get(url,auth=('user','pass'),headers=headers)


print r.text  
print r.request.headers  
print s.cookies

主要原因是沒有原先的 Cookie,原封不動把 Chrome 上的 Header Request 拿下來,然後我另外用 base64 產生對應帳號的 Authorization,放到 header,就成功了!

import requests  
from requests.auth import HTTPDigestAuth

headers = {  
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36',
    'Pragma':'no-cache',
    'Cache-Control':'no-cache',
    'Accept':'application/json, text/javascript, */*; q=0.01',
    'authorizationtoken':'[自行填寫]',
    'X-Requested-With':'XMLHttpRequest',
    'Referer':'http://url',
    'Accept-Encoding':'gzip, deflate, sdch',
    'Accept-Language':'zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4,de-DE;q=0.2,de;q=0.2',
    'Cookie':'Cookie String',
}

url = "http://URL"

s = requests.Session()

#A1
r = s.get(url,auth=HTTPDigestAuth('user','pass'),headers=headers)  
https://vector4.jp/ghost/about/  
#A2
#r = s.get(url,auth=('user','pass'),headers=headers)


print r.text  
print r.request.headers  
print s.cookies

此外,特別注意 A1, A2這兩個註解,因為他們產生出來的 auth 不一樣,你最好比對一下有沒有跟 postman 上的一樣,如果不一樣,就從 postman 把 Authorization 複製下來,放到 header:

header = {  
'Authorization':'xxxxxxx='  
}