如何将此curl命令转换为执行相同操作的某些Python代码?

时间:2016-06-15 06:58:44

标签: python curl request urllib2

我正在尝试使用Fitbit API下载我的数据。我已经想出如何获得某一天的数据,这很好。这是我使用的curl命令:

curl -i -H "Authorization: Bearer (here goes a very long token)" https://api.fitbit.com/1/user/-/activities/heart/date/2016-6-14/1d/1sec/time/00:00/23:59.json >> heart_rate_20160614.json

但是,我想收集数百天的数据,我不想手动这样做。所以我想我可以使用Python循环。我读了一些其他主题,如this onethis one,但仍然不知道如何使用urllib2将这些curl命令“转换”为python语言。

我试过这个:

import urllib2
url = 'https://api.fitbit.com/1/user/-/activities/heart/date/today/1d/1sec/time/00:00/00:01.json'
data = '{Authorization: Bearer (here goes a very long token)}'
req = urllib2.Request(url,data)
f = urllib2.urlopen(req)

但是出现错误“HTTP错误404:未找到”

那么将这个curl命令“翻译”为python语言的正确方法是什么?谢谢!

2 个答案:

答案 0 :(得分:3)

问题来自class Message extends React.Component { constructor(props) { this.state = { subject: this.props.subject, body: this.props.body, type: this.props.type, messageIndex: this.props.messageIndex }; } componentDidUpdate() { this.props.updateHandler(messageIndex, { subject: this.state.subject, body: this.state.body, type: this.state.type }); } render() { return ( <div> <input type="text" defaultValue={this.state.subject} onBlur={e => this.setState({subject: e.target.value})} /> <input type="text" defaultValue={this.state.subject} onBlur={e => this.setState({body: e.target.value})} /> <select type="text" value={this.state.subject} onChange={e => this.setState({type: e.target.value})}> <option>Type 1</option> <option>Type 2</option> </select> </div> ) } } class MessageBox extends React.Component { constructor(props) { this.state = { messages: aListOfMessageObjects } } updateHandler(message) { // Message update happens here and returns a list updatedMessages this.setState({ messages: updatedMessages }); } render() { let _this = this; var messagesDOM = this.state.messages.map((m) => { return ( <Message message={m} updateHandler={_this.updateHandler.bind(_this)} /> ); }) return ( <div> {messagesDOM} </div> ); } } 对象的构造:默认情况下,第二个参数是您要与请求一起传递的数据。相反,您必须指定要传递标头。这是正确的方法:

Request

这样就可以使用401,但是应该使用你的令牌。

您可以在urllib2(以及Request类)here

上获得更多信息

但是,我建议你看一下Requests,我认为这更容易使用,并且有很好的记录。

希望它会有所帮助。

答案 1 :(得分:1)

在我看来,您可以使用比requests更容易使用的优秀的库urllib

首先,pip install requests,然后在你的翻译中:

import requests
response = requests.get(url='https://api.fitbit.com/1/user/-/activities/heart/date/2016-6-14/1d/1sec/time/00:00/23:59.json', headers={'Authorization':'Bearer <TOKEN>'})
if response.ok:
  print response.content
else:
  print "error", response.content

从这里,您可以通过response.contentresponse.json()轻松获取响应内容(如果它是JSON),并将其写入文件。