使用PHP使用API​​ v3将活动上传到Strava

时间:2014-07-23 00:22:01

标签: php curl

我正在开发一个应用程序,我希望能够使用它的API v3将活动(GPX文件)上传到Strava。

我的应用程序成功处理了OAuth流程 - 我能够成功请求活动等。

然而,当我尝试上传活动时 - 它失败了。

这是我的代码的相关示例:

// $filename is the name of the GPX file
// $actual_file contains the full path

$actual_file = realpath($filename);
$url="https://www.strava.com/api/v3/uploads";
$postdata = "activity_type=ride&file=". "@" . $actual_file . ";filename=" . $filename . "&data_type=gpx";

$headers = array('Authorization: Bearer ' . $strava_access_token);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_POST, 3);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec ($ch);

这是我得到的回应:

{"message":"Bad Request", "errors":[{"resource":"Upload", "field":"file","code":"not a file"}]}

然后我尝试了这个:

// $filename is the name of the GPX file
// $actual_file contains the full path

$actual_file = realpath($filename);

$url="https://www.strava.com/api/v3/uploads";

$postfields = array(
    "activity_type" => "ride",
    "data_type" => "gpx",
    "file" => "@" . $filename
);
$postdata = http_build_query($postfields);

$headers = array('Authorization: Bearer ' . $strava_access_token, "Content-Type: application/octet-stream");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_POST, count($postfields));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$fp = fopen($filename, 'r');
curl_setopt($ch, CURLOPT_INFILE, $fp);

$json = curl_exec ($ch);
$error = curl_error ($ch);

这是我得到的回应:

{"message":"Bad Request", "errors":[{"resource":"Upload", "field":"data","code":"empty"}]}

显然,我在尝试传递GPX文件时做错了。

是否可以提供一些示例PHP代码来说明这应该如何工作?

为了它的价值 - 我非常确定GPX文件是有效的(它实际上是我使用Strava的导出功能下载的文件)。

2 个答案:

答案 0 :(得分:1)

我希望在发布之后不到一天回答我自己的问题并不是一个糟糕的形式。但是我已经开始工作了,所以我也可以,以防万一其他人发现它有用......

// $filename is the name of the file
// $actual_file includes the filename and the full path to the file
// $strava_access_token contains the access token

$actual_file = realpath($filename);

$url="https://www.strava.com/api/v3/uploads";

$postfields = array(
    "activity_type" => "ride",
    "data_type" => "gpx",
    "file" => '@' . $actual_file . ";type=application/xml"
);

$headers = array('Authorization: Bearer ' . $strava_access_token);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

$response = curl_exec ($ch);

显然,重要的 不要包含 CURLOPT_POST选项。

答案 1 :(得分:0)

Here is also a working Python example

import os
import requests

headers = {
    'accept': 'application/json',
    'authorization': 'Bearer <Token>',
    }

dir = os.getcwd() + '/files/'
for filename in os.listdir(dir):
    file = open(dir + filename, 'rb') 
    files = {
        "file": (filename, file, 'application/gpx+xml'),
        "data_type": (None, 'gpx'),
    }

    try:
        response = requests.post('http://www.strava.com/api/v3/uploads',files=files, headers=headers)
        print(filename)
        print(response.text)
        print(response.headers)

    except requests.exceptions.RequestException as e:  # This is the correct syntax
        print(e)
        sys.exit(1)