Скрипт Python с wget и внешним API - PullRequest
0 голосов
/ 01 ноября 2018

Я уже задавал этот вопрос, но мне кажется, что я задал его неправильно, или, по крайней мере, я ошибаюсь не тем деревом, в котором лежит проблема.

У меня есть скрипт 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, который анализирует для устройств Bluetooth, увеличивается как оценка, если он находит устройство и записывает оценку в таблицу MySQL. Это чтобы увидеть, есть ли кто-нибудь дома.

Этот маршрут считывает счет и отключает отопление с помощью API Hive, если дом пуст. Вызванный по URL, он делает именно то, что должен, и я вижу, что отопление отключено.

Однако я пытаюсь вызвать скрипт с помощью wget из crontab.

Запускается crontab, и я вижу его в системном журнале. Журнал доступа apache показывает вызываемый URL.

Но отопление не отключается, как если бы я вызывал ту же самую вещь через браузер.

У меня есть подозрение из-за чего-то другого, что я видел, что, возможно, было бы плохо, если бы не понравился тот факт, что другой URL называется.

Может кто-нибудь сказать мне, верно ли мое подозрение? Я видел еще кое-что об использовании urllib вместо wget, но я не знаю, что мне нужно изменить, чтобы вызывать URL с заголовками.

1 Ответ

0 голосов
/ 01 ноября 2018

Я предполагаю, что запрос wget не предоставляет файл cookie сеанса и, следовательно, hiveSessionId в session отсутствует. Потому что тогда 'X-Omnia-Access-token': None запрос к службе Omnia будет отклонен.

(Меня немного смущают два параметра, hiveSessionId и score. Идентификатор сеанса улья перезаписывается значением из сеанса, если оно существует, и счет равен всегда перезаписывается значением из базы данных.)

Примечание: вы можете использовать json.dumps() для создания полезной нагрузки:

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