49 KiB
49 KiB
In [1]:
from requests import get,post
import hashlibIn [3]:
accessToken = "4a1c3f90c2d6483286a79d9e88cfaf0d"
In [4]:
post("http://door.hxzhxy.cn:1314/demo",json={"demo":1},timeout=5)Out [4]:
<Response [400]>
In [5]:
post("http://100.64.0.1:9000",json={"demo":1},timeout=5)[1;31m---------------------------------------------------------------------------[0m [1;31mConnectionRefusedError[0m Traceback (most recent call last) File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connection.py:196[0m, in [0;36mHTTPConnection._new_conn[1;34m(self)[0m [0;32m 195[0m [38;5;28;01mtry[39;00m: [1;32m--> 196[0m sock [38;5;241m=[39m connection[38;5;241m.[39mcreate_connection( [0;32m 197[0m ([38;5;28mself[39m[38;5;241m.[39m_dns_host, [38;5;28mself[39m[38;5;241m.[39mport), [0;32m 198[0m [38;5;28mself[39m[38;5;241m.[39mtimeout, [0;32m 199[0m source_address[38;5;241m=[39m[38;5;28mself[39m[38;5;241m.[39msource_address, [0;32m 200[0m socket_options[38;5;241m=[39m[38;5;28mself[39m[38;5;241m.[39msocket_options, [0;32m 201[0m ) [0;32m 202[0m [38;5;28;01mexcept[39;00m socket[38;5;241m.[39mgaierror [38;5;28;01mas[39;00m e: File [1;32md:\Anaconda3\Lib\site-packages\urllib3\util\connection.py:85[0m, in [0;36mcreate_connection[1;34m(address, timeout, source_address, socket_options)[0m [0;32m 84[0m [38;5;28;01mtry[39;00m: [1;32m---> 85[0m [38;5;28;01mraise[39;00m err [0;32m 86[0m [38;5;28;01mfinally[39;00m: [0;32m 87[0m [38;5;66;03m# Break explicitly a reference cycle[39;00m File [1;32md:\Anaconda3\Lib\site-packages\urllib3\util\connection.py:73[0m, in [0;36mcreate_connection[1;34m(address, timeout, source_address, socket_options)[0m [0;32m 72[0m sock[38;5;241m.[39mbind(source_address) [1;32m---> 73[0m sock[38;5;241m.[39mconnect(sa) [0;32m 74[0m [38;5;66;03m# Break explicitly a reference cycle[39;00m [1;31mConnectionRefusedError[0m: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 The above exception was the direct cause of the following exception: [1;31mNewConnectionError[0m Traceback (most recent call last) File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connectionpool.py:789[0m, in [0;36mHTTPConnectionPool.urlopen[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)[0m [0;32m 788[0m [38;5;66;03m# Make the request on the HTTPConnection object[39;00m [1;32m--> 789[0m response [38;5;241m=[39m [38;5;28mself[39m[38;5;241m.[39m_make_request( [0;32m 790[0m conn, [0;32m 791[0m method, [0;32m 792[0m url, [0;32m 793[0m timeout[38;5;241m=[39mtimeout_obj, [0;32m 794[0m body[38;5;241m=[39mbody, [0;32m 795[0m headers[38;5;241m=[39mheaders, [0;32m 796[0m chunked[38;5;241m=[39mchunked, [0;32m 797[0m retries[38;5;241m=[39mretries, [0;32m 798[0m response_conn[38;5;241m=[39mresponse_conn, [0;32m 799[0m preload_content[38;5;241m=[39mpreload_content, [0;32m 800[0m decode_content[38;5;241m=[39mdecode_content, [0;32m 801[0m [38;5;241m*[39m[38;5;241m*[39mresponse_kw, [0;32m 802[0m ) [0;32m 804[0m [38;5;66;03m# Everything went great![39;00m File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connectionpool.py:495[0m, in [0;36mHTTPConnectionPool._make_request[1;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)[0m [0;32m 494[0m [38;5;28;01mtry[39;00m: [1;32m--> 495[0m conn[38;5;241m.[39mrequest( [0;32m 496[0m method, [0;32m 497[0m url, [0;32m 498[0m body[38;5;241m=[39mbody, [0;32m 499[0m headers[38;5;241m=[39mheaders, [0;32m 500[0m chunked[38;5;241m=[39mchunked, [0;32m 501[0m preload_content[38;5;241m=[39mpreload_content, [0;32m 502[0m decode_content[38;5;241m=[39mdecode_content, [0;32m 503[0m enforce_content_length[38;5;241m=[39menforce_content_length, [0;32m 504[0m ) [0;32m 506[0m [38;5;66;03m# We are swallowing BrokenPipeError (errno.EPIPE) since the server is[39;00m [0;32m 507[0m [38;5;66;03m# legitimately able to close the connection after sending a valid response.[39;00m [0;32m 508[0m [38;5;66;03m# With this behaviour, the received response is still readable.[39;00m File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connection.py:398[0m, in [0;36mHTTPConnection.request[1;34m(self, method, url, body, headers, chunked, preload_content, decode_content, enforce_content_length)[0m [0;32m 397[0m [38;5;28mself[39m[38;5;241m.[39mputheader(header, value) [1;32m--> 398[0m [38;5;28mself[39m[38;5;241m.[39mendheaders() [0;32m 400[0m [38;5;66;03m# If we're given a body we start sending that in chunks.[39;00m File [1;32md:\Anaconda3\Lib\http\client.py:1331[0m, in [0;36mHTTPConnection.endheaders[1;34m(self, message_body, encode_chunked)[0m [0;32m 1330[0m [38;5;28;01mraise[39;00m CannotSendHeader() [1;32m-> 1331[0m [38;5;28mself[39m[38;5;241m.[39m_send_output(message_body, encode_chunked[38;5;241m=[39mencode_chunked) File [1;32md:\Anaconda3\Lib\http\client.py:1091[0m, in [0;36mHTTPConnection._send_output[1;34m(self, message_body, encode_chunked)[0m [0;32m 1090[0m [38;5;28;01mdel[39;00m [38;5;28mself[39m[38;5;241m.[39m_buffer[:] [1;32m-> 1091[0m [38;5;28mself[39m[38;5;241m.[39msend(msg) [0;32m 1093[0m [38;5;28;01mif[39;00m message_body [38;5;129;01mis[39;00m [38;5;129;01mnot[39;00m [38;5;28;01mNone[39;00m: [0;32m 1094[0m [0;32m 1095[0m [38;5;66;03m# create a consistent interface to message_body[39;00m File [1;32md:\Anaconda3\Lib\http\client.py:1035[0m, in [0;36mHTTPConnection.send[1;34m(self, data)[0m [0;32m 1034[0m [38;5;28;01mif[39;00m [38;5;28mself[39m[38;5;241m.[39mauto_open: [1;32m-> 1035[0m [38;5;28mself[39m[38;5;241m.[39mconnect() [0;32m 1036[0m [38;5;28;01melse[39;00m: File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connection.py:236[0m, in [0;36mHTTPConnection.connect[1;34m(self)[0m [0;32m 235[0m [38;5;28;01mdef[39;00m [38;5;21mconnect[39m([38;5;28mself[39m) [38;5;241m-[39m[38;5;241m>[39m [38;5;28;01mNone[39;00m: [1;32m--> 236[0m [38;5;28mself[39m[38;5;241m.[39msock [38;5;241m=[39m [38;5;28mself[39m[38;5;241m.[39m_new_conn() [0;32m 237[0m [38;5;28;01mif[39;00m [38;5;28mself[39m[38;5;241m.[39m_tunnel_host: [0;32m 238[0m [38;5;66;03m# If we're tunneling it means we're connected to our proxy.[39;00m File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connection.py:211[0m, in [0;36mHTTPConnection._new_conn[1;34m(self)[0m [0;32m 210[0m [38;5;28;01mexcept[39;00m [38;5;167;01mOSError[39;00m [38;5;28;01mas[39;00m e: [1;32m--> 211[0m [38;5;28;01mraise[39;00m NewConnectionError( [0;32m 212[0m [38;5;28mself[39m, [38;5;124mf[39m[38;5;124m"[39m[38;5;124mFailed to establish a new connection: [39m[38;5;132;01m{[39;00me[38;5;132;01m}[39;00m[38;5;124m"[39m [0;32m 213[0m ) [38;5;28;01mfrom[39;00m [38;5;21;01me[39;00m [0;32m 215[0m [38;5;66;03m# Audit hooks are only available in Python 3.8+[39;00m [1;31mNewConnectionError[0m: <urllib3.connection.HTTPConnection object at 0x0000016E573E2C90>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 The above exception was the direct cause of the following exception: [1;31mMaxRetryError[0m Traceback (most recent call last) File [1;32md:\Anaconda3\Lib\site-packages\requests\adapters.py:589[0m, in [0;36mHTTPAdapter.send[1;34m(self, request, stream, timeout, verify, cert, proxies)[0m [0;32m 588[0m [38;5;28;01mtry[39;00m: [1;32m--> 589[0m resp [38;5;241m=[39m conn[38;5;241m.[39murlopen( [0;32m 590[0m method[38;5;241m=[39mrequest[38;5;241m.[39mmethod, [0;32m 591[0m url[38;5;241m=[39murl, [0;32m 592[0m body[38;5;241m=[39mrequest[38;5;241m.[39mbody, [0;32m 593[0m headers[38;5;241m=[39mrequest[38;5;241m.[39mheaders, [0;32m 594[0m redirect[38;5;241m=[39m[38;5;28;01mFalse[39;00m, [0;32m 595[0m assert_same_host[38;5;241m=[39m[38;5;28;01mFalse[39;00m, [0;32m 596[0m preload_content[38;5;241m=[39m[38;5;28;01mFalse[39;00m, [0;32m 597[0m decode_content[38;5;241m=[39m[38;5;28;01mFalse[39;00m, [0;32m 598[0m retries[38;5;241m=[39m[38;5;28mself[39m[38;5;241m.[39mmax_retries, [0;32m 599[0m timeout[38;5;241m=[39mtimeout, [0;32m 600[0m chunked[38;5;241m=[39mchunked, [0;32m 601[0m ) [0;32m 603[0m [38;5;28;01mexcept[39;00m (ProtocolError, [38;5;167;01mOSError[39;00m) [38;5;28;01mas[39;00m err: File [1;32md:\Anaconda3\Lib\site-packages\urllib3\connectionpool.py:843[0m, in [0;36mHTTPConnectionPool.urlopen[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)[0m [0;32m 841[0m new_e [38;5;241m=[39m ProtocolError([38;5;124m"[39m[38;5;124mConnection aborted.[39m[38;5;124m"[39m, new_e) [1;32m--> 843[0m retries [38;5;241m=[39m retries[38;5;241m.[39mincrement( [0;32m 844[0m method, url, error[38;5;241m=[39mnew_e, _pool[38;5;241m=[39m[38;5;28mself[39m, _stacktrace[38;5;241m=[39msys[38;5;241m.[39mexc_info()[[38;5;241m2[39m] [0;32m 845[0m ) [0;32m 846[0m retries[38;5;241m.[39msleep() File [1;32md:\Anaconda3\Lib\site-packages\urllib3\util\retry.py:519[0m, in [0;36mRetry.increment[1;34m(self, method, url, response, error, _pool, _stacktrace)[0m [0;32m 518[0m reason [38;5;241m=[39m error [38;5;129;01mor[39;00m ResponseError(cause) [1;32m--> 519[0m [38;5;28;01mraise[39;00m MaxRetryError(_pool, url, reason) [38;5;28;01mfrom[39;00m [38;5;21;01mreason[39;00m [38;5;66;03m# type: ignore[arg-type][39;00m [0;32m 521[0m log[38;5;241m.[39mdebug([38;5;124m"[39m[38;5;124mIncremented Retry for (url=[39m[38;5;124m'[39m[38;5;132;01m%s[39;00m[38;5;124m'[39m[38;5;124m): [39m[38;5;132;01m%r[39;00m[38;5;124m"[39m, url, new_retry) [1;31mMaxRetryError[0m: HTTPConnectionPool(host='100.64.0.1', port=9000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000016E573E2C90>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。')) During handling of the above exception, another exception occurred: [1;31mConnectionError[0m Traceback (most recent call last) Cell [1;32mIn[5], line 1[0m [1;32m----> 1[0m post([38;5;124m"[39m[38;5;124mhttp://100.64.0.1:9000[39m[38;5;124m"[39m,json[38;5;241m=[39m{[38;5;124m"[39m[38;5;124mdemo[39m[38;5;124m"[39m:[38;5;241m1[39m},timeout[38;5;241m=[39m[38;5;241m5[39m) File [1;32md:\Anaconda3\Lib\site-packages\requests\api.py:115[0m, in [0;36mpost[1;34m(url, data, json, **kwargs)[0m [0;32m 103[0m [38;5;28;01mdef[39;00m [38;5;21mpost[39m(url, data[38;5;241m=[39m[38;5;28;01mNone[39;00m, json[38;5;241m=[39m[38;5;28;01mNone[39;00m, [38;5;241m*[39m[38;5;241m*[39mkwargs): [0;32m 104[0m [38;5;250m [39m[38;5;124mr[39m[38;5;124;03m"""Sends a POST request.[39;00m [0;32m 105[0m [0;32m 106[0m [38;5;124;03m :param url: URL for the new :class:`Request` object.[39;00m [1;32m (...)[0m [0;32m 112[0m [38;5;124;03m :rtype: requests.Response[39;00m [0;32m 113[0m [38;5;124;03m """[39;00m [1;32m--> 115[0m [38;5;28;01mreturn[39;00m request([38;5;124m"[39m[38;5;124mpost[39m[38;5;124m"[39m, url, data[38;5;241m=[39mdata, json[38;5;241m=[39mjson, [38;5;241m*[39m[38;5;241m*[39mkwargs) File [1;32md:\Anaconda3\Lib\site-packages\requests\api.py:59[0m, in [0;36mrequest[1;34m(method, url, **kwargs)[0m [0;32m 55[0m [38;5;66;03m# By using the 'with' statement we are sure the session is closed, thus we[39;00m [0;32m 56[0m [38;5;66;03m# avoid leaving sockets open which can trigger a ResourceWarning in some[39;00m [0;32m 57[0m [38;5;66;03m# cases, and look like a memory leak in others.[39;00m [0;32m 58[0m [38;5;28;01mwith[39;00m sessions[38;5;241m.[39mSession() [38;5;28;01mas[39;00m session: [1;32m---> 59[0m [38;5;28;01mreturn[39;00m session[38;5;241m.[39mrequest(method[38;5;241m=[39mmethod, url[38;5;241m=[39murl, [38;5;241m*[39m[38;5;241m*[39mkwargs) File [1;32md:\Anaconda3\Lib\site-packages\requests\sessions.py:589[0m, in [0;36mSession.request[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)[0m [0;32m 584[0m send_kwargs [38;5;241m=[39m { [0;32m 585[0m [38;5;124m"[39m[38;5;124mtimeout[39m[38;5;124m"[39m: timeout, [0;32m 586[0m [38;5;124m"[39m[38;5;124mallow_redirects[39m[38;5;124m"[39m: allow_redirects, [0;32m 587[0m } [0;32m 588[0m send_kwargs[38;5;241m.[39mupdate(settings) [1;32m--> 589[0m resp [38;5;241m=[39m [38;5;28mself[39m[38;5;241m.[39msend(prep, [38;5;241m*[39m[38;5;241m*[39msend_kwargs) [0;32m 591[0m [38;5;28;01mreturn[39;00m resp File [1;32md:\Anaconda3\Lib\site-packages\requests\sessions.py:703[0m, in [0;36mSession.send[1;34m(self, request, **kwargs)[0m [0;32m 700[0m start [38;5;241m=[39m preferred_clock() [0;32m 702[0m [38;5;66;03m# Send the request[39;00m [1;32m--> 703[0m r [38;5;241m=[39m adapter[38;5;241m.[39msend(request, [38;5;241m*[39m[38;5;241m*[39mkwargs) [0;32m 705[0m [38;5;66;03m# Total elapsed time of the request (approximately)[39;00m [0;32m 706[0m elapsed [38;5;241m=[39m preferred_clock() [38;5;241m-[39m start File [1;32md:\Anaconda3\Lib\site-packages\requests\adapters.py:622[0m, in [0;36mHTTPAdapter.send[1;34m(self, request, stream, timeout, verify, cert, proxies)[0m [0;32m 618[0m [38;5;28;01mif[39;00m [38;5;28misinstance[39m(e[38;5;241m.[39mreason, _SSLError): [0;32m 619[0m [38;5;66;03m# This branch is for urllib3 v1.22 and later.[39;00m [0;32m 620[0m [38;5;28;01mraise[39;00m SSLError(e, request[38;5;241m=[39mrequest) [1;32m--> 622[0m [38;5;28;01mraise[39;00m [38;5;167;01mConnectionError[39;00m(e, request[38;5;241m=[39mrequest) [0;32m 624[0m [38;5;28;01mexcept[39;00m ClosedPoolError [38;5;28;01mas[39;00m e: [0;32m 625[0m [38;5;28;01mraise[39;00m [38;5;167;01mConnectionError[39;00m(e, request[38;5;241m=[39mrequest) [1;31mConnectionError[0m: HTTPConnectionPool(host='100.64.0.1', port=9000): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000016E573E2C90>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
In [2]:
def md5_encrypt(text:str):
"""将字符串转换为 MD5 32位小写格式"""
# 创建 MD5 对象
md5 = hashlib.md5()
# 将文本编码为字节并更新哈希
md5.update(text.encode('utf-8'))
# 返回十六进制哈希值的32位小写字符串
return md5.hexdigest()
md5_encrypt("123456")Out [2]:
'e10adc3949ba59abbe56e057f20f883e'
In [3]:
# a5f7f040e35d5d21abbb8c40c0d26e07In [4]:
clientId = "4a1c3f90c2d6483286a79d9e88cfaf0d"
clientSecret = "82743c825b3ba0d8671bef0a466b8eb9"
proxy={
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
data={
"clientId":clientId,
"clientSecret":clientSecret,
"username":"xtlft@qq.com",
"password":md5_encrypt("Xia2431384218"),
}
data = post("https://cnapi.ttlock.com/oauth2/token",data=data).json()
access_token = data["access_token"]
refresh_token = data["refresh_token"]In [5]:
dataOut [5]:
{'access_token': 'a5f7f040e35d5d21abbb8c40c0d26e07',
'refresh_token': 'a486a831275bfabdb714471e4f363efc',
'uid': 42665043,
'openid': 1889897261,
'scope': 'user,key,room',
'token_type': 'Bearer',
'expires_in': 7157645}In [6]:
# access_token = 'a5f7f040e35d5d21abbb8c40c0d26e07'In [7]:
keyId = "244371333"In [7]:
import timeIn [6]:
#获取锁详情
lockId = "8686987"
get("https://cnapi.ttlock.com/v3/lock/detail ",params={
"accessToken":access_token,
"clientId":"4a1c3f90c2d6483286a79d9e88cfaf0d",
"lockId":lockId,
"date":int(time.time()*1000),
}).json()[1;31m---------------------------------------------------------------------------[0m [1;31mNameError[0m Traceback (most recent call last) Cell [1;32mIn[6], line 7[0m [0;32m 1[0m [38;5;66;03m#获取锁详情[39;00m [0;32m 2[0m lockId [38;5;241m=[39m [38;5;124m"[39m[38;5;124m8686987[39m[38;5;124m"[39m [0;32m 3[0m get([38;5;124m"[39m[38;5;124mhttps://cnapi.ttlock.com/v3/lock/detail [39m[38;5;124m"[39m,params[38;5;241m=[39m{ [0;32m 4[0m [38;5;124m"[39m[38;5;124maccessToken[39m[38;5;124m"[39m:access_token, [0;32m 5[0m [38;5;124m"[39m[38;5;124mclientId[39m[38;5;124m"[39m:[38;5;124m"[39m[38;5;124m4a1c3f90c2d6483286a79d9e88cfaf0d[39m[38;5;124m"[39m, [0;32m 6[0m [38;5;124m"[39m[38;5;124mlockId[39m[38;5;124m"[39m:lockId, [1;32m----> 7[0m [38;5;124m"[39m[38;5;124mdate[39m[38;5;124m"[39m:[38;5;28mint[39m(time[38;5;241m.[39mtime()[38;5;241m*[39m[38;5;241m1000[39m), [0;32m 8[0m })[38;5;241m.[39mjson() [1;31mNameError[0m: name 'time' is not defined
Cell:
[Cell type raw - unsupported, skipped]
In [48]:
#更新锁数据
post("https://cnapi.ttlock.com/v3/lock/updateLockData",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"date":int(time.time()*1000),
"lockData":''
},proxies=proxy,verify=False
).textOut [48]:
d:\Anaconda3\Lib\site-packages\urllib3\connectionpool.py:1099: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warnings warnings.warn(
'{"errcode":-3,"errmsg":"Invalid Parameter.","description":"参数不合法。"}'In [22]:
#开锁
post("https://cnapi.ttlock.com/v3/lock/unlock",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"date":int(time.time()*1000),
}).json()Out [22]:
{'errcode': 0,
'errmsg': 'none error message or means yes',
'description': '表示成功或是'}In [37]:
#关锁
post("https://cnapi.ttlock.com/v3/lock/lock",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"date":int(time.time()*1000),
}).json()Out [37]:
{'errcode': 0,
'errmsg': 'none error message or means yes',
'description': '表示成功或是'}In [8]:
from datetime import datetime
import timeIn [ ]:
#校准时间
data = post("https://cnapi.ttlock.com/v3/lock/updateDate",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"date":int(time.time()*1000),
},timeout=10).json()
datetime.fromtimestamp(data['date']/1000).strftime('%Y-%m-%d %H:%M:%S')'2025-09-11 16:25:45'
In [32]:
#查询电量
data = get("https://cnapi.ttlock.com/v3/lock/queryElectricQuantity",params={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"date":int(time.time()*1000),
}
).json()
electricQuantity = data['electricQuantity']
electricQuantity[1;31m---------------------------------------------------------------------------[0m [1;31mKeyError[0m Traceback (most recent call last) Cell [1;32mIn[32], line 9[0m [0;32m 1[0m [38;5;66;03m#查询电量[39;00m [0;32m 2[0m data [38;5;241m=[39m get([38;5;124m"[39m[38;5;124mhttps://cnapi.ttlock.com/v3/lock/queryElectricQuantity[39m[38;5;124m"[39m,params[38;5;241m=[39m{ [0;32m 3[0m [38;5;124m"[39m[38;5;124mclientId[39m[38;5;124m"[39m:clientId, [0;32m 4[0m [38;5;124m"[39m[38;5;124maccessToken[39m[38;5;124m"[39m:access_token, [1;32m (...)[0m [0;32m 7[0m } [0;32m 8[0m )[38;5;241m.[39mjson() [1;32m----> 9[0m electricQuantity [38;5;241m=[39m data[[38;5;124m'[39m[38;5;124melectricQuantity[39m[38;5;124m'[39m] [0;32m 10[0m electricQuantity [1;31mKeyError[0m: 'electricQuantity'
In [9]:
def getTimeStamp(date):
return int(datetime.strptime(date,"%Y-%m-%d %H:%M:%S").timestamp()*1000)In [10]:
#锁操作记录
get("https://cnapi.ttlock.com/v3/lockRecord/list",params={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"startDate":getTimeStamp("2025-09-01 16:34:38"),
"endDate":getTimeStamp("2025-09-11 16:34:38"),
"pageNo":1,
"pageSize":100,
"date":int(time.time()*1000),
}).json()Out [10]:
{'total': 14,
'pages': 1,
'pageNo': 1,
'pageSize': 100,
'list': [{'recordId': 1963990433,
'lockId': 8686987,
'serverDate': 1757579128000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757579106000,
'username': 'xtlft@qq.com'},
{'recordId': 1963989469,
'lockId': 8686987,
'serverDate': 1757579099000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757579088000,
'username': 'xtlft@qq.com'},
{'recordId': 1963989457,
'lockId': 8686987,
'serverDate': 1757579098000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757579077000,
'username': 'xtlft@qq.com'},
{'recordId': 1963969537,
'lockId': 8686987,
'serverDate': 1757578767000,
'recordTypeFromLock': 1,
'hotelUsername': 'xtlft@qq.com',
'recordType': 1,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578763000,
'username': 'xtlft@qq.com'},
{'recordId': 1963963397,
'lockId': 8686987,
'serverDate': 1757578644000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578625000,
'username': 'xtlft@qq.com'},
{'recordId': 1963944763,
'lockId': 8686987,
'serverDate': 1757578368000,
'recordTypeFromLock': 26,
'hotelUsername': 'xtlft@qq.com',
'recordType': 11,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578333000,
'username': 'xtlft@qq.com'},
{'recordId': 1963944755,
'lockId': 8686987,
'serverDate': 1757578367000,
'recordTypeFromLock': 26,
'hotelUsername': 'xtlft@qq.com',
'recordType': 11,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578324000,
'username': 'xtlft@qq.com'},
{'recordId': 1963940805,
'lockId': 8686987,
'serverDate': 1757578293000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578278000,
'username': 'xtlft@qq.com'},
{'recordId': 1963940781,
'lockId': 8686987,
'serverDate': 1757578292000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578246000,
'username': 'xtlft@qq.com'},
{'recordId': 1963938539,
'lockId': 8686987,
'serverDate': 1757578250000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757578233000,
'username': 'xtlft@qq.com'},
{'recordId': 1963921293,
'lockId': 8686987,
'serverDate': 1757577937000,
'recordTypeFromLock': 28,
'hotelUsername': 'xtlft@qq.com',
'recordType': 12,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757577919000,
'username': 'xtlft@qq.com'},
{'recordId': 1963811969,
'lockId': 8686987,
'serverDate': 1757575916000,
'recordTypeFromLock': 1,
'hotelUsername': 'xtlft@qq.com',
'recordType': 1,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757575914000,
'username': 'xtlft@qq.com'},
{'recordId': 1963637709,
'lockId': 8686987,
'serverDate': 1757572596000,
'recordTypeFromLock': 1,
'hotelUsername': 'xtlft@qq.com',
'recordType': 1,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757572594000,
'username': 'xtlft@qq.com'},
{'recordId': 1963066001,
'lockId': 8686987,
'serverDate': 1757562495000,
'recordTypeFromLock': 1,
'hotelUsername': 'xtlft@qq.com',
'recordType': 1,
'success': 1,
'keyName': 'xtlft',
'keyboardPwd': '',
'lockDate': 1757562493000,
'username': 'xtlft@qq.com'}]}In [25]:
post("https://cnapi.ttlock.com/v3/identityCard/addForReversedCardNumber",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"cardNumber":"0022818748",
"cardName":"测试",
"startDate":0,
"endDate":0,
"addType":2,
"date":int(time.time()*1000),
}).json()Out [25]:
{'cardId': 114762009}In [26]:
data = get("https://cnapi.ttlock.com/v3/identityCard/list",params={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"pageNo":1,
"pageSize":100,
"date":int(time.time()*1000),
}).json()
print(data)
data = data["list"]
dataOut [26]:
{'total': 1, 'pages': 1, 'pageNo': 1, 'pageSize': 100, 'list': [{'lockId': 8686987, 'cardName': '测试', 'endDate': 0, 'nickName': 'xtlft', 'cardId': 114762009, 'cardType': 1, 'userId': 'xtlft@qq.com', 'cardNumber': '3157220353', 'startDate': 0, 'senderUsername': 'xtlft@qq.com', 'createDate': 1758193960000, 'status': 1}]}
[{'lockId': 8686987,
'cardName': '测试',
'endDate': 0,
'nickName': 'xtlft',
'cardId': 114762009,
'cardType': 1,
'userId': 'xtlft@qq.com',
'cardNumber': '3157220353',
'startDate': 0,
'senderUsername': 'xtlft@qq.com',
'createDate': 1758193960000,
'status': 1}]In [32]:
access_tokenOut [32]:
'a5f7f040e35d5d21abbb8c40c0d26e07'
In [ ]:
post("https://cnapi.ttlock.com/v3/identityCard/addForReversedCardNumber",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"cardNumber":"0022818748",
"cardName":"夏天乐带0",
"startDate":0,
"endDate":0,
"addType":2,
"date":int(time.time()*1000),
}).json(){'cardId': 114619437}In [38]:
post("https://cnapi.ttlock.com/v3/keyboardPwd/add",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"keyboardPwd":"123456",
"keyboardPwdName":"密码测试",
"keyboardPwdType":2,
"addType":2,
"date":int(time.time()*1000),
}).json()Out [38]:
{'keyboardPwdId': 96034855}In [40]:
post("https://cnapi.ttlock.com/v3/keyboardPwd/change",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"keyboardPwdId":96034855,
"newKeyboardPwd":12345677,
"date":int(time.time()*1000),
}).textOut [40]:
'{"errcode":0,"errmsg":"none error message or means yes","description":"表示成功或是"}'In [51]:
get("https://cnapi.ttlock.com/v3/lock/listKeyboardPwd",params={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"pageNo":1,
"pageSize":100,
"orderBy":1,
"date":int(time.time()*1000),
}).json()Out [51]:
{'list': [], 'pageNo': 1, 'pageSize': 100, 'pages': 0, 'total': 0}In [ ]:
post('https://cnapi.ttlock.com/v3/keyboardPwd/delete',data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"keyboardPwdId":96034855,
"date":int(time.time()*1000),
})In [47]:
post("https://cnapi.ttlock.com/v3/identityCard/addForReversedCardNumber",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":lockId,
"cardNumber":"1869101204",
"cardName":"夏天乐手",
"startDate":0,
"endDate":0,
"addType":2,
"date":int(time.time()*1000),
}).json()Out [47]:
{'cardId': 114339443}In [ ]:
{'total': 0, 'pages': 0, 'pageNo': 1, 'pageSize': 100, 'list': []}
[]
In [ ]:
#3157220353In [22]:
for item in data:
#删除卡,
tem = post("https://cnapi.ttlock.com/v3/identityCard/delete",data={
"clientId":clientId,
"accessToken":access_token,
"lockId":int(item["lockId"]),
"cardId":int(item["cardId"]),
"deleteType":2,
"date":int(time.time()*1000),
}).json()
print(tem){'errcode': 0, 'errmsg': 'none error message or means yes', 'description': '表示成功或是'}
In [24]:
post("https://www.xtleto.cn:1314/demo",json={"demo":1},timeout=10).textOut [24]:
'{\n "received_data": {\n "demo": 1\n },\n "received_headers": {\n "Accept": "*/*",\n "Accept-Encoding": "gzip, deflate, br, zstd",\n "Connection": "close",\n "Content-Length": "11",\n "Content-Type": "application/json",\n "Host": "www.xtleto.cn",\n "User-Agent": "python-requests/2.32.2",\n "X-Forwarded-For": "183.220.92.154",\n "X-Real-Ip": "183.220.92.154"\n },\n "status": "success"\n}\n'In [ ]:
post("https://example.com/lockRecord/callback",data={
"notifyType":1,
"lockId":lockId,
})