2016-11-10 106 views
0

我發現華爲移動路由器有趣的文章: https://blog.hqcodeshop.fi/archives/259-Huawei-E5186-AJAX-API.html 在第二條評論中,有人命名rvl提供了他的腳本,以便通過API自動重啓,如果需要的話。Python - 華爲重啓腳本

我試圖自己修復縮進。這是一個結果http://pastebin.com/KqF5RsS0 我不確定它是否正確。甚至不知道我應該使用哪個版本的Python來運行它。

[email protected] ~> /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 

[[email protected] ~]$ 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的技能。有人能幫我弄清楚如何運行它嗎?

編輯

[[email protected] ~]$ 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. 
[[email protected] ~]$ 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 
[[email protected] ~]$ sudo pip install requests 
Requirement already satisfied: requests in /usr/lib/python3.5/site-packages 
[[email protected] ~]$ 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__') 
[[email protected] ~]$ python router-reboot-script.py 

我應該使用哪個版本的Python我應該使用的,什麼樣的參數(如-m)?

+3

從第一個錯誤,好像你就錯過了請求模塊。你嘗試過'pip安裝請求'然後再運行一次嗎? –

+0

用您的問題的答案編輯。 – sabbath

回答

1

兩個問題:

  1. 這是蟒蛇2.x中,你看不到from __future__ import print_function在Python 3
  2. 有在你的引擎收錄代碼中的一些格式問題。 Python使用空格來指示哪些代碼塊被分組到一起,形成函數,類等等。白色空間不太正確。我已經修復了以下(見this 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,USERNAMEPASS。然後,您需要取消註釋從if __name__ == "__main__":開始的3條線,如上所述。

如果你仍然得到錯誤,因爲你錯過了請求包,檢查出the answer to this question.