2017-03-31 53 views
1

我在ESP8266上运行MicroPython。代码应该向Twilio的restAPI发送一个SMS HTTP POST请求。我试图让它与urequests合作。但我始终得到401 UNAUTHORIZED回应。请一些建议。代码:Micropython ESP8266 Twilio 401 UNAUTHORIZED

import urequests 

def send_sms(): 
    twilio_account_sid = "{AcctSID}" 
    twilio_auth_token = "{AuthToken}" 
    from_phn_nbr = "+{FromPhoneNbr}" 
    to_phn_nbr = "+{ToPhoneNbr")) 

    twilio_proto = "https://" 
    twilio_host = "api.twilio.com" 
    twilio_path = "/2010-04-01/Accounts/{AcctSID}/Messages" 
    twilio_url = twilio_proto + twilio_host + twilio_path 
    twilio_data = "'From': '{from_phn_nbr}', \ 
        'To': '{to_phn_nbr}', \ 
        'Body': 'Hai'" 

    twilio_headers = { 
     'Authorization': 'Basic {AcctSID}:{AuthToken}', 
     'Content-Type': 'application/x-www-form-urlencoded', 
     'WWW - Authenticate': 'Basic realm = "Twilio API' 
    } 

    try: 
     resp = urequests.post(url=twilio_url, 
            data=twilio_data, 
            headers=twilio_headers) 
     print(resp.status_code, resp.reason) 

    except Exception as exc: 
     print("\nException occured.") 
     sys.print_exceptin(exc) 

回答

2

Twilio开发人员传道这里。

我不知道urequests库,但使用HTTP基本身份验证时,仅仅连接用户名,冒号和密码是不够的。你也需要base 64 encode that concatenated string

这就是我能从你的实现中想到的。让我知道它是否有帮助。

+0

我实施了,和它的作品。感谢您的建议。顺便说一句:我用[邮差](https://www.getpostman.com)生成基地64编码认证字符串。 BTW2:[urequests](https://pypi.python.org/pypi/micropython-urllib.urequest)是Micropython用于发送HTTP请求的模块。 – andere

+0

太棒了!很高兴现在正在工作。因为我的回答可能是模糊的,你会介意将其标记为正确的,以便其他人可以看到吗? – philnash

+0

@andere你介意发布你如何解决这个问题吗?我有(我想)与'urequests'相同的问题:请参阅https://stackoverflow.com/questions/46939183/micropython-urequests-post-failures谢谢 – dentex

0

@dentex

使用邮差:在标签

  • 填写验证

enter image description here

  • 转到标签头
  • 复制 '授权' 值

enter image description here

过去的 '授权' 值到你的代码是这样的:

twilio_headers = { 
'Authorization': 'Basic QUMxMmZhNzFlYzU5MzZkNzYyMDYzNWM2Njg1NzNlZWNkNDo2OTBiY2Q5OTA2MDc3NmIzYmQ0NzgwOGE5ZTc2NmM5Yg==', 
'Content-Type': 'application/x-www-form-urlencoded', 
'WWW-Authenticate': 'Basic realm = Twilio API' 

}