我发现了一篇关于华为移动路由器的有趣文章:https://blog.hqcodeshop.fi/archives/259-Huawei-E5186-AJAX-API.html在第二条评论中,一个名叫rvl的人提供了他的脚本,如果需要,可以通过API自动重启。
我试图自己修复缩进。这是一个结果http://pastebin.com/KqF5RsS0我不确定它是否正确。我甚至不知道应该用哪个版本的Python来运行它。
sabbath@dell ~> /usr/bin/python2 router-reboot-script.py
Traceback (most recent call last):
File "router-reboot-script.py", line 6, in <module>
import requests
ImportError: No module named requests
或
[sabbath@dell ~]$ python -m router-reboot-script.py
/usr/bin/python: Error while finding spec for 'router-reboot-script.py' (AttributeError: module 'router-reboot-script' has no attribute '__path__')
我没有Python技能。有人能帮我弄清楚怎么操作吗?
<标题>编辑[sabbath@dell ~]$ sudo pip install requests
Requirement already satisfied (use --upgrade to upgrade): requests in /usr/lib/python3.5/site-packages
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[sabbath@dell ~]$ sudo pip install --upgrade pip
Collecting pip
Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 686kB/s
Installing collected packages: pip
Found existing installation: pip 8.1.2
Uninstalling pip-8.1.2:
Successfully uninstalled pip-8.1.2
Successfully installed pip-9.0.1
[sabbath@dell ~]$ sudo pip install requests
Requirement already satisfied: requests in /usr/lib/python3.5/site-packages
[sabbath@dell ~]$ python -m router-reboot-script.py
/usr/bin/python: Error while finding spec for 'router-reboot-script.py' (AttributeError: module 'router-reboot-script' has no attribute '__path__')
[sabbath@dell ~]$ python router-reboot-script.py
我应该使用哪个版本的python,我应该使用什么样的参数(比如-m) ?
标题>两个问题:
- 这是python 2。在python 3中,你看不到
from __future__ import print_function
。 - 在你的粘贴目录中有一些格式问题。Python使用空白来指示哪些代码块被组合成函数、类等。留白的地方不太对。我已经修复了下面(也见这个pastebin)
###########################
#!/usr/bin/python
from __future__ import print_function
import requests
import re
import hashlib
import base64
def login(baseurl, username, password):
s = requests.Session()
r = s.get(baseurl + "html/index.html")
csrf_tokens = grep_csrf(r.text)
s.headers.update({'__RequestVerificationToken': csrf_tokens[0]})
# test token on statistics api
# r = s.get(baseurl + "api/monitoring/statistic-server")
data = login_data(username, password, csrf_tokens[0])
r = s.post(baseurl + "api/user/login", data=data)
s.headers.update({'__RequestVerificationToken': r.headers["__RequestVerificationTokenone"]})
return s
def reboot(baseurl, session):
s.post(baseurl + "api/device/control", data='1')
def grep_csrf(html):
pat = re.compile(r".*meta name="csrf_token" content="(.*)"", re.I)
matches = (pat.match(line) for line in html.splitlines())
return [m.group(1) for m in matches if m]
def login_data(username, password, csrf_token):
def encrypt(text):
m = hashlib.sha256()
m.update(text)
return base64.b64encode(m.hexdigest())
password_hash = encrypt(username + encrypt(password) + csrf_token)
return '%s%s4' % (username, password_hash)
WEB = "http://192.168.1.1/"
USERNAME = "admin"
PASSWORD = "admin"
if __name__ == "__main__":
s = login(WEB, USERNAME, PASSWORD)
reboot(WEB, s)
#########################
最后,注意最后10行(除了空行和#####)需要根据您自己的目的进行更新。您需要为路由器设置正确的WEB
, USERNAME
和PASS
。然后你需要像我上面所做的那样取消以if __name__ == "__main__":
开头的3行注释。
如果您仍然因为缺少请求包而出现错误,请查看此问题的答案