flask post json_Flask 和 requests 搭建一个简单的API服务!

路由器为腾达路由器,使用requests来进行数据的获取,使用flask来进行实现api的搭建

requests我就不介绍了,这个大家都很熟悉了,这篇文章主要是来提供一个编写爬虫的思路以及flask怎么搭建一个简单的api服务。

1.分析页面

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

889346681a69e7df5dbc83dc165515f4.png

2875a0e23e24d7c9eb7fc53bda91aea8.png

进入之后的页面长这样
按下F12进入开发者页面选择network选项可以看到下面的样子

b5ab84721241e88ebc0bb69f42855510.gif

通过分析会发现,路由器是采用轮询(按照一定的时间间隔来向服务器来获取数据)的方式来获取数据,从这里可以获取发送请求的类型==>是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 ,可以发现这里应该是从路由器获取的各个参数,我们换一个页面来看一下,是不是会有其他的参数

d35b746b6f7b6421cf75f450fe99d2f6.gif

从上面的gif发现这里出现了其他参数,甚至连url的地址都变了。所以现在当务之急的找到一个确定的url来使用requests发送请求,获取数据。到这里,来分析network这里的内容会让工作变得困难,不如来分析一个js文件(因为前面发现所有的GET请求都是xhr类型的,也就是ajax来进行发送的数据)

0c7b80633a0751ddfb8133bdca722a53.png

从这里发现了好几个js文件,打开后分析

19e142e47933dc0a5a1a94ebf2bb7d6b.png

ee4ce72f74cb45052929986fb7473533.png

dbdd79aad1af9cd4100b976a86a9aec2.png

c94923549ca960ab25900637c512bc7e.png

8312a7bfb7bf3f4dd5958a527e573312.png

f88cec6c0ed6a64f5751cbcbcfc05df9.png

b0da51ef5ca9211e816f19e022c7c286.png

分别在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_name>")定义了这个路径需要做的事情,这里的的路径是router/<config_name>
#当浏览器像这个地址发送请求的时候,get函数就会被调用,同时<config_name>会作为一个参数,传入get函数
#method规定了请求的类型
@app.route("/api/<config_name>",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)

运行app.py文件,测试可以发现

7fb3fbe224e7340f7e0e0581257d0f07.png

68fd74650e24cbfb16f51ce7c73d606e.png

上面的方法是使用面向对象的方法来写的
下面是一个普通的函数式的写法

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_name>")定义了这个路径需要做的事情,这里的的路径是router/<config_name>
#当浏览器像这个地址发送请求的时候,get函数就会被调用,同时<config_name>会作为一个参数,传入get函数
#method规定了请求的类型
@app.route("/api/<config_name>",methods=['POST','GET'])
def get_(config_name):
    try:
        #返回json格式的数据
        return jsonify(get(config_name))
    except:
        return "404"
if __name__ == "__main__":
    app.run(debug=True)

79c5690c507c49b4079cc1461f4eb25b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值