带wget和外部api的Python脚本

时间:2018-11-01 20:34:56

标签: python api wget

我已经问过这个问题,但是我想我以错误的方式提出了问题,或者至少我可能是用错误的树种掩盖了问题所在。

我有一个使用以下路由的Python / Flask脚本:

@app.route('/heatingadjust')
def heatingadjust(hiveSessionId=None, score=None):
        import requests
        import time
        import datetime
        import MySQLdb
        conn = MySQLdb.connect(host="localhost", user = "admin", passwd = "xxxxxxxxxx", db = "mydb")
        cursor = conn.cursor()
        cursor.execute("select score from OccScore")
        data = cursor.fetchone()
        score = data[0]

        url = "https://api.prod.bgchprod.info:443/omnia/users"
        if 'hiveSessionId' in session:
                hiveSessionId = session['hiveSessionId']
                headers = {
                    'Content-Type': "application/vnd.alertme.zoo-6.1+json",
                    'Accept': "application/vnd.alertme.zoo-6.1+json",
                    'X-Omnia-Client': "Hive Web Dashboard",
                    'X-Omnia-Access-Token': hiveSessionId,
                    'Cache-Control': "no-cache"
                    }
                response = requests.request("GET", url, headers=headers)
                data=response.json()
                if 'errors' in data:
                        return redirect(url_for('hivelogin'))
        if (score == 0):
            url = "https://api-prod.bgchprod.info:443/omnia/nodes/xxxxxxxxxx"
            payload = "{\n    \"nodes\": [{\n        \"attributes\": {\n            \"targetHeatTemperature\": {\n                \"targetValue\": 15\n            }\n        }\n    }]\n}"        
            headers = {
                'Content-Type': "application/vnd.alertme.zoo-6.1+json",
                'Accept': "application/vnd.alertme.zoo-6.1+json",
                'X-Omnia-Client': "Dashboard",
                'X-Omnia-Access-token': hiveSessionId,
                'Cache-Control': "no-cache",
             }
            response = requests.request("PUT", url, data=payload, headers=headers)
        else:
            url = "https://api-prod.bgchprod.info:443/omnia/nodes/xxxxxxx"
            payload = "{\n    \"nodes\": [{\n        \"attributes\": {\n            \"targetHeatTemperature\": {\n                \"targetValue\": 18\n            }\n        }\n    }]\n}"        
            headers = {
                'Content-Type': "application/vnd.alertme.zoo-6.1+json",
                'Accept': "application/vnd.alertme.zoo-6.1+json",
                'X-Omnia-Client': "Dashboard",
                'X-Omnia-Access-token': hiveSessionId,
                'Cache-Control': "no-cache",
             }
            response = requests.request("PUT", url, data=payload, headers=headers)

        return str(score)

基本上,我使用一种嗅探蓝牙设备的wget调用了一条路由,如果找到设备并将分数写入MySQL表,则该分数会增加。这是看家里是否有人。

如果房子是空的,此路线将读取分数并使用Hive api关闭暖气。从URL调用后,它可以正常工作,并且可以看到加热装置已关闭。

但是,我要执行的操作是使用crontab中的wget调用脚本。

crontab运行,我可以在syslog中看到它。 apache访问日志显示正在调用的URL。

但是如果我通过浏览器调用完全一样的东西,加热并不会关闭。

我怀疑其他原因,可能是因为我不喜欢另一个URL被调用的事实。

有人可以告诉我我的怀疑是否正确吗?我已经看到了其他一些有关使用urllib而不是wget的信息,但是我不知道需要更改什么以使用标头调用URL。

1 个答案:

答案 0 :(得分:1)

我的猜测是wget请求没有提供会话cookie,因此hiveSessionId中没有session。因为那样'X-Omnia-Access-token': None之后,对Omnia服务的请求将被拒绝。

(我对hiveSessionIdscore这两个参数有点困惑。配置单元会话ID被会话中的值覆盖(如果存在),并且得分为总是被数据库中的值覆盖。)

旁注:您可以使用json.dumps()来构建有效负载:

payload = json.dumps({
    "nodes": [
        {
            "attributes": {"targetHeatTemperature": {"targetValue": 18}}
        }
    ]
})