Python请求在控制台中工作,但不在应用程序中

时间:2015-09-14 21:26:42

标签: python http request python-3.4 intercom

我构建了一个Python脚本,用于使用python请求库将数据上传到名为Intercom的应用程序。我们的想法是在自定义属性中插入一个全新的字段,其中包含我们需要关闭的数据以用于自动消息传递。

脚本很长,但正在破解的方法如下:

def post_user(self, input_user, session=None):
    """
    :param user: a JSON object with all the user pieces needed to be posted to the endpoint
    :param session: a Requests session to be used. If None we'll create one
    """
    if not session:
        session = self.create_requests_session()
    else:
        session = session

    # JSON encode the user
    payload = json.dumps(input_user, sort_keys=True, indent=2, separators=(',', ': '))

    print(payload)  # DEBUG CODE

    # Post the data to endpoint
    response = session.post(self.endpoint, data=payload)

    # This will raise a status code on a bad status code
    response.raise_for_status()

以下是create_requests_session()的方法:

def create_requests_session(self):
    """
    Start a requests session. Set Auth & Headers so we don't have to send it with each request
    :return: A new requests.Session object with auth & header values prepopulated.
    """

    session = requests.Session()
    session.auth = (self.app_id, self.api_key)
    session.headers = {'Content-Type': 'application/json', 'accept': 'application/json'}

    return session

当我运行整个脚本并逐步执行第一个input_user时,它会像dict一样进入,看起来像。 (注意:数据是匿名的,但结构仍然完全相同):

 {'user_id': '123456', 
  'email': 'foo@bar.com', 
  'custom_attributes': {
      'test_cell' : 'Variation'}
 }

但是,在将用户交付给json.dumps(user)然后通过POST请求发送之后,我收到了404错误。

这是奇怪的部分。我使用完全相同的JSON发送了这个完全相同的用户,除了我使用Python控制台创建了所有部分(注意,隐藏了一些行以保持用户数据的匿名性):

In[82]: sesh = requests.session()
In[86]: header
Out[86]: {'Content-Type': 'application/json', 'accept': 'application/json'}
In[87]: sesh.headers = header
In[89]: payload = json.dumps(update_user)
In[91]: response = sesh.post(endpoint, data=payload)
In[92]: response
Out[92]: <Response [200]>

此时,我完全迷失了。我试图设置一个代理来尝试逐字节地比较请求,但是没有太多运气。非常感谢任何帮助或见解。

1 个答案:

答案 0 :(得分:0)

您确定您的身份验证有效吗?

session.auth = (self.app_id, self.api_key)

特别是,应将app_id设置为与API密钥对应的app_id(如果您正在使用测试应用,那么测试应用的app_id就会如此)。

如果内部通信收到应用ID,则无法识别它(当前)会返回404,这就是您所看到的内容。现在应该修复它以返回401。