12.17 Flask 和 requests 搭建一個簡單的API服務

路由器為騰達路由器,使用requests來進行數據的獲取,使用flask來進行實現api的搭建

requests我就不介紹了,這個大家都很熟悉了,這篇文章主要是來提供一個編寫爬蟲的思路以及flask怎麼搭建一個簡單的api服務。

1.分析頁面

我使用的是騰達路由器,一般路由器的管理ip地址是 192.168.0.1

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

進入之後的頁面長這樣
按下F12進入開發者頁面選擇network選項可以看到下面的樣子

Flask 和 requests 搭建一個簡單的API服務

通過分析會發現,路由器是採用輪詢(按照一定的時間間隔來向服務器來獲取數據)的方式來獲取數據,從這裡可以獲取發送請求的類型==>是GET類型,以及一些發送的參數 http://192.168.0.1/goform/getStatus?random=0.46529553086082265&modules=internetStatus%2CdeviceStatistics%2CsystemInfo%2CwanAdvCfg%2CwifiRelay%2CwifiBasicCfg%2CsysTime 在問號後面的有兩個參數,分別是 random 、 modules ,通過測試發現, random 這個參數不影響數據的獲取,所以將其刪去,剩下的url部分變成了 http://192.168.0.1/goform/getStatus?modules=XXX ,接下來確定XXX 的值從上面的gif可以發現,這裡 modules 的值是 internetStatus,deviceStatistics,systemInfo,wanAdvCfg,wifiRelay,wifiBasicCfg,sysTime ,可以發現這裡應該是從路由器獲取的各個參數,我們換一個頁面來看一下,是不是會有其他的參數

Flask 和 requests 搭建一個簡單的API服務

從上面的gif發現這裡出現了其他參數,甚至連url的地址都變了。所以現在當務之急的找到一個確定的url來使用requests發送請求,獲取數據。到這裡,來分析network這裡的內容會讓工作變得困難,不如來分析一個js文件(因為前面發現所有的GET請求都是xhr類型的,也就是ajax來進行發送的數據)

Flask 和 requests 搭建一個簡單的API服務

從這裡發現了好幾個js文件,打開後分析

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

分別在js文件裡面獲得了幾乎所有的參數,而且發現了url的規律, gofrom/ 後面的路徑不起作用,真正起作用的是 modules

的值,路由器根據值的不同來返回不同的數據。

把上面所有的

modules 的值收集起來,經過去重後獲得了下面 33

個參數

wifiBasicCfg wifiAdvCfg wifiPower wifiWPS wifiGuest wifiBeamforming loginAuth wanAdvCfg lanCfg softWare wifiRelay sysTime remoteWeb isWifiClients systemInfo hasNewSoftVersion internetStatus deviceStatistics parentCtrlList parentAccessCtrl wanBasicCfg localhost onlineList macFilter guestList staticIPList IPTV portList ddns dmz upnp ping
到這裡基本上分析的差不多了,來整理一下

url是 http://192.168.0.1/goform/getStatus?modules=XXX ,其中 getStatus 這個路徑可以是上面的js裡面的任意一個 getUrl 的值,返回的值是由modules的值來確定的。

2.發送請求(上代碼)

import requests

import json

module = [
"wifiBasicCfg",
"wifiAdvCfg",
"wifiPower",
"wifiWPS",
"wifiGuest",
"wifiBeamforming",
"loginAuth",
"wanAdvCfg",
"lanCfg",
"softWare",
"wifiRelay",
"sysTime",
"remoteWeb",
"isWifiClients",
"systemInfo",
"hasNewSoftVersion",
"internetStatus",
"deviceStatistics",
"parentCtrlList",
"parentAccessCtrl",
"wanBasicCfg",
"localhost",
"onlineList",
"macFilter",
"guestList",
"staticIPList",
"IPTV",
"portList",
"ddns",
"dmz",
"upnp",

"ping"
]


class Wifi:
"""獲取連接本WiFi的其他設備信息"""

def __init__(self, IP='192.168.0.1'):
self.IP = IP
self.data = self.req()

def req(self):
"""獲取WiFi數據"""
req = requests.session()
module_args = ",".join(module)
url = f'http://{self.IP}/goform/getStatus?&modules={module_args}'
try:
req = req.get(url).json()
'''with open("wifi.json", 'r') as data:
req = json.loads(data.read())'''
self.status = True
except:
self.status = False
return req

#用於為後面flask搭建api來提供接口
def get(self, config_name):
if self.status:
if config_name =="all":
data = self.data
else:
try:
data = self.data[config_name]
except:
data = f"no_{config_name}_data"
else:
data = f"no_{config_name}_data"
return data

3.使用flask來搭建一個簡單的api接口,便於在瀏覽器中發起請求

from flask import Flask,render_template,jsonify

app = Flask(__name__)


from wifi import Wifi

#實例化一個對象
w = Wifi()

#@app.route("/api/<config>")定義了這個路徑需要做的事情,這裡的的路徑是router/<config>
#當瀏覽器像這個地址發送請求的時候,get函數就會被調用,同時<config>會作為一個參數,傳入get函數
#method規定了請求的類型
@app.route("/api/<config>",methods=['POST','GET'])
def get(config_name):
try:
#返回json格式的數據
return jsonify(w.get(config_name))
except:
return "404"
if __name__ == "__main__":
app.run(debug=True)
/<config>/<config>/<config>/<config>

運行app.py文件,測試可以發現

Flask 和 requests 搭建一個簡單的API服務

Flask 和 requests 搭建一個簡單的API服務

上面的方法是使用面向對象的方法來寫的
下面是一個普通的函數式的寫法

import requests
import json
module = [
...
]
IP = "192.168.0.1"
status = ""
data = ""
def req():
"""獲取WiFi數據"""
req = requests.session()
module_args = ",".join(module)

url = f'http://{IP}/goform/getStatus?&modules={module_args}'
try:
req = req.get(url).json()
status = True
except:
status = False
return req

#用於為後面flask搭建api來提供接口
def get(config_name):
if status:
if config_name =="all":
data = data
else:
try:
data = data[config_name]
except:
data = f"no_{config_name}_data"
else:
data = f"no_{config_name}_data"
return data
#flask部分
from flask import Flask,render_template,jsonify
app = Flask(__name__)
#@app.route("/api/<config>")定義了這個路徑需要做的事情,這裡的的路徑是router/<config>
#當瀏覽器像這個地址發送請求的時候,get函數就會被調用,同時<config>會作為一個參數,傳入get函數
#method規定了請求的類型
@app.route("/api/<config>",methods=['POST','GET'])
def get_(config_name):
try:
#返回json格式的數據
return jsonify(get(config_name))
except:
return "404"
if __name__ == "__main__":
app.run(debug=True)/<config>/<config>/<config>/<config>


分享到:


相關文章: