我已经问过这个问题,但是我想我以错误的方式提出了问题,或者至少我可能是用错误的树种掩盖了问题所在。
我有一个使用以下路由的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。
答案 0 :(得分:1)
我的猜测是wget
请求没有提供会话cookie,因此hiveSessionId
中没有session
。因为那样'X-Omnia-Access-token': None
之后,对Omnia服务的请求将被拒绝。
(我对hiveSessionId
和score
这两个参数有点困惑。配置单元会话ID被会话中的值覆盖(如果存在),并且得分为总是被数据库中的值覆盖。)
旁注:您可以使用json.dumps()
来构建有效负载:
payload = json.dumps({
"nodes": [
{
"attributes": {"targetHeatTemperature": {"targetValue": 18}}
}
]
})