0

How to make an API call with OAuth in Perl?

I have the OAuth information, but I just can't seem to figure out how to call the Mail API in Perl now.

I'm currently trying to make the Net::OAuth::Simple module work, but I'm not having much luck. I keep getting this error -
GET on Net::OAuth::ProtectedResourceRequest=HASH(0x8ec0b38) failed: 500 Internal Server Error 88

Can anyone point me in the right direction?

Thanks,
- Jim

by
8 Replies
  • From doing some data dumping in the OAuth::Net::Simple module, looks like here's the url that it assembles ---

    http://mail.yahooapis.com/ws/mail/v1.1/jso...ethod=HMAC-SHA1


    Sorry, I'm a bit lost here. I've worked with other Yahoo API's, just never OAuth or JSON

    Thanks for any help
    0
  • I think I'm getting somewhere, there isn't much doc anywhere on how to do this in Perl.

    Right now I'm getting a response of --
    {"result":null,"error":{"code":"Client.InvalidRequest","message":"No method given.","detail":null}}

    I'm pretty sure the OAuth is signing in correctly, but I'm not sure how to feed in the JSON. Here's how I'm calling it --
    CODE
    	use JSON;
    my $json_getuserdata =
    {
    method => "GetUserData",
    };
    my $encodejson = encode_json $json_getuserdata

    my $request = Net::OAuth->request("protected resource")->new(
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    request_url => $url,
    request_method => 'GET',
    signature_method => 'HMAC-SHA1',
    timestamp => $timestamp,
    nonce => $nonce,
    token => $tokens{access_token},
    token_secret => $tokens{access_token_secret},
    signature => $oauth_signature,
    extra_params => {
    method => 'GetUserData',
    }
    );


    $request->sign;
    my $lwp_request = GET $request->to_url;

    my $lwp_object = LWP::UserAgent->new;
    my $response = $lwp_object->request($lwp_request);
    print $response->content;


    I've tried a few ways to get the JSON added in, nothing seems to be working --- help?
    0
  • For mail endpoint please use HTTP POST. Thanks

    --R

    QUOTE (J @ Apr 16 2011, 03:55 PM) <{POST_SNAPBACK}>
    I think I'm getting somewhere, there isn't much doc anywhere on how to do this in Perl.

    Right now I'm getting a response of --
    {"result":null,"error":{"code":"Client.InvalidRequest","message":"No method given.","detail":null}}

    I'm pretty sure the OAuth is signing in correctly, but I'm not sure how to feed in the JSON. Here's how I'm calling it --
    CODE
    	use JSON;
    my $json_getuserdata =
    {
    method => "GetUserData",
    };
    my $encodejson = encode_json $json_getuserdata

    my $request = Net::OAuth->request("protected resource")->new(
    consumer_key => $consumer_key,
    consumer_secret => $consumer_secret,
    request_url => $url,
    request_method => 'GET',
    signature_method => 'HMAC-SHA1',
    timestamp => $timestamp,
    nonce => $nonce,
    token => $tokens{access_token},
    token_secret => $tokens{access_token_secret},
    signature => $oauth_signature,
    extra_params => {
    method => 'GetUserData',
    }
    );


    $request->sign;
    my $lwp_request = GET $request->to_url;

    my $lwp_object = LWP::UserAgent->new;
    my $response = $lwp_object->request($lwp_request);
    print $response->content;


    I've tried a few ways to get the JSON added in, nothing seems to be working --- help?
    0
  • I read somewhere to use GET ---- anyway, I switched it to POST and I get this error --
    Please provide valid credentials. OAuth oauth_problem="signature_invalid", realm="yahooapis.com"

    A data dump of the response gives me --
    CODE
    $VAR1 = bless( {
    '_protocol' => 'HTTP/1.1',
    '_content' => '

    Please provide valid credentials. OAuth oauth_problem="signature_invalid", realm="yahooapis.com"


    ',
    '_rc' => '401',
    '_headers' => bless( {
    'connection' => 'close',
    'client-response-num' => 1,
    'date' => 'Sun, 17 Apr 2011 13:26:58 GMT',
    'client-peer' => '209.191.69.109:80',
    'age' => '0',
    'client-date' => 'Sun, 17 Apr 2011 13:26:58 GMT',
    'client-warning' => 'Unsupported authentication scheme \'oauth\'',
    'content-type' => 'application/xml',
    'www-authenticate' => 'OAuth oauth_problem="signature_invalid", realm="yahooapis.com"',
    'server' => 'YTS/1.19.5'
    }, 'HTTP::Headers' ),
    '_msg' => 'Authorization Required',
    'handlers' => {
    'response_data' => [
    {
    'callback' => sub { "DUMMY" }
    }
    ]
    },
    '_request' => bless( {
    '_content' => '',
    '_uri' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=1711347395&oauth_signature=caTxBTuFfTVXld5wmymoIn1vTOg%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303046813&oauth_token=A%3Des2_UsLR4DGW5OKEgriZBXxzxhO6DnbYFk9SdRwuGHNWe4CplYmOkLp1MVxX2S9PEJTS_bEYZfJU0c
    VMXYixHlv89TNdv067oefQFpBb0VmDi2XSHI.nu.kLcmxynrdOaSwKAr877SyqzhnQ.B1w89P2YHfE66R
    zjah7PmvLolroeZu1YFZ6OOx1d_WP9VNoVMAo5S77NsnISBB2GedqCVwX8kpL4KLoCLbgV9zjCJ1r0pOM
    MGaUdCfZ6.TwCMZJGBxzf9lIYO0BAPGZKX.lz3Bynyc9qjUoPZbcirVaWDI8N7ftY6lqOW_cPy6uft.rn
    Ocx_mSlFBHI9lCSRqFfGpIWHRUEZ_aN.PsL_HvvfdMPxEMoA2cMwPt_4A._bR.UQGFp7DjR5sgtJd8me5
    ofzIr0EM.ds6ZYWPs17wkDpOtZ7gQsOXYf8M8lbOog.acLlgGPZytwfbcASm4UgfwjpsHhjTAeOmJiQV.
    xB0YHrdXa57_Kw5OI03TaHVjJ675jiQ3.s4o6NOSiU3MeY2MFp4YiKQ96yp9aLw7OkCONxrlD0gHuf5uU
    oeORAv60jbjRy9mXdAfct5iccD3vFqMBzsYw1jfyNIYWJAQOqND8LBjM6ruD9mrE4brC6FjEzPMLgpfGJ
    7MkxpE4ZSQm4cX5HFZ5rbuImUxYIED3tqcPN04J1TFEwVmS86fFShcXWWM8g71n1B.JI7ar2FFdQXVkKb
    V0Mquf2jzLykrbbtCWO3is&oauth_version=1.0')}, 'URI::http' ),
    '_headers' => bless( {
    'user-agent' => 'libwww-perl/5.825',
    '{"method":"getuserdata"}' => undef
    }, 'HTTP::Headers' ),
    '_method' => 'GET',
    '_uri_canonical' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=1711347395&oauth_signature=caTxBTuFfTVXld5wmymoIn1vTOg%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303046813&oauth_token=A%3Des2_UsLR4DGW5OKEgriZBXxzxhO6DnbYFk9SdRwuGHNWe4CplYmOkLp1MVxX2S9PEJTS_bEYZfJU0c
    VMXYixHlv89TNdv067oefQFpBb0VmDi2XSHI.nu.kLcmxynrdOaSwKAr877SyqzhnQ.B1w89P2YHfE66R
    zjah7PmvLolroeZu1YFZ6OOx1d_WP9VNoVMAo5S77NsnISBB2GedqCVwX8kpL4KLoCLbgV9zjCJ1r0pOM
    MGaUdCfZ6.TwCMZJGBxzf9lIYO0BAPGZKX.lz3Bynyc9qjUoPZbcirVaWDI8N7ftY6lqOW_cPy6uft.rn
    Ocx_mSlFBHI9lCSRqFfGpIWHRUEZ_aN.PsL_HvvfdMPxEMoA2cMwPt_4A._bR.UQGFp7DjR5sgtJd8me5
    ofzIr0EM.ds6ZYWPs17wkDpOtZ7gQsOXYf8M8lbOog.acLlgGPZytwfbcASm4UgfwjpsHhjTAeOmJiQV.
    xB0YHrdXa57_Kw5OI03TaHVjJ675jiQ3.s4o6NOSiU3MeY2MFp4YiKQ96yp9aLw7OkCONxrlD0gHuf5uU
    oeORAv60jbjRy9mXdAfct5iccD3vFqMBzsYw1jfyNIYWJAQOqND8LBjM6ruD9mrE4brC6FjEzPMLgpfGJ
    7MkxpE4ZSQm4cX5HFZ5rbuImUxYIED3tqcPN04J1TFEwVmS86fFShcXWWM8g71n1B.JI7ar2FFdQXVkKb
    V0Mquf2jzLykrbbtCWO3is&oauth_version=1.0')}, 'URI::http' )
    }, 'HTTP::Request' )
    }, 'HTTP::Response' );


    Is that because of the content-type?
    0
  • Sorry, ignore that data dump in the post above -- here's what I'm getting with everything switched to POST

    Error -- application/x-www-form-urlencoded not supported with OAuth
    CODE
    $VAR1 = bless( {
    '_protocol' => 'HTTP/1.1',
    '_content' => '

    application/x-www-form-urlencoded not supported with OAuth


    ',
    '_rc' => '501',
    '_headers' => bless( {
    'connection' => 'close',
    'client-response-num' => 1,
    'cache-control' => 'private',
    'date' => 'Sun, 17 Apr 2011 13:48:04 GMT',
    'client-peer' => '209.191.69.94:80',
    'age' => '0',
    'client-date' => 'Sun, 17 Apr 2011 13:48:04 GMT',
    'content-type' => 'application/xml',
    'server' => 'YTS/1.19.5'
    }, 'HTTP::Headers' ),
    '_msg' => 'OAuth Parameter Transmission Not Supported',
    'handlers' => {
    'response_data' => [
    {
    'callback' => sub { "DUMMY" }
    }
    ]
    },
    '_request' => bless( {
    '_content' => '',
    '_uri' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=3513889894&oauth_signature=odqlF6gU%2Fy1OKw%2FzIJU4DpnT1qU%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303048077&oauth_token=A%3DMJ_ocfTpjDjJanJmjnAheEGO0ivdgWrGMsFlrVgW2hSU8hR0uIKBXo9_1brXC76Dj32ALijO9g.Cw8
    tVPvILfn8qyyXWhDCUaXsHP0Flmz7YV2uUXkIgslRb4l6G3.xWGuQiKTULEwM8So.AnqmpUf2DyHpVaKM
    wt4Ul22TRQpBs1tJ7ft7Ay_liLHq8lOkLY8Ve7NCHYAjlStoncI7JzCaKqpmSGZgFqitymN8Ok7agHJ8I
    dBQLsC_S5wJtI7LftWLN4ILYKWTleFggqq7DEqX1K_ToQrCJE.ufiFCaSUmsqa2uE7UlSRiQ_yYAYCHIR
    i5BDqnvWNlmf4NAUaK6wRHNl8vDxPjKiJ30ljMI1DwP8_gRhFbUKPPfEgi7rlXzm4IfJgpLPJxQc9U3GJ
    KQKon6ilrZ9USuK3oySkLyAZXlocTwzUmzA0Uttr3U0sK.Ql5OTfQRBTuSVlQ4ToMI34xA1pka1zYGPOG
    hMEhiFa2YsSzQeEw3I6EATpQATwpjmqvBzYbNK.x6eGnQivVFFsnHPnExxeiOk6ZrAMMz_B9ivJPpqGL9
    kREUCXZG3BUPfftH7KfCU9bsno5H25b30GMOmzfU6sLOxk18JkPFMpN8lHZJtlHscP7MvwDvrCwwsZijc
    FpR1uXUBGvXxfwtX4eqXUCc0OPGcZzfeiQEeYmBCZcPYhf2uQGfYaQh6Z1zC6jBg_BbY9dVqVp2VKVe1k
    tyc7IityTAGDf8Lkqh3a4a&oauth_version=1.0')}, 'URI::http' ),
    '_headers' => bless( {
    'user-agent' => 'libwww-perl/5.825',
    'content-type' => 'application/x-www-form-urlencoded',
    'content-length' => 0,
    '{"method":"getuserdata"}' => undef
    }, 'HTTP::Headers' ),
    '_method' => 'POST',
    '_uri_canonical' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=3513889894&oauth_signature=odqlF6gU%2Fy1OKw%2FzIJU4DpnT1qU%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303048077&oauth_token=A%3DMJ_ocfTpjDjJanJmjnAheEGO0ivdgWrGMsFlrVgW2hSU8hR0uIKBXo9_1brXC76Dj32ALijO9g.Cw8
    tVPvILfn8qyyXWhDCUaXsHP0Flmz7YV2uUXkIgslRb4l6G3.xWGuQiKTULEwM8So.AnqmpUf2DyHpVaKM
    wt4Ul22TRQpBs1tJ7ft7Ay_liLHq8lOkLY8Ve7NCHYAjlStoncI7JzCaKqpmSGZgFqitymN8Ok7agHJ8I
    dBQLsC_S5wJtI7LftWLN4ILYKWTleFggqq7DEqX1K_ToQrCJE.ufiFCaSUmsqa2uE7UlSRiQ_yYAYCHIR
    i5BDqnvWNlmf4NAUaK6wRHNl8vDxPjKiJ30ljMI1DwP8_gRhFbUKPPfEgi7rlXzm4IfJgpLPJxQc9U3GJ
    KQKon6ilrZ9USuK3oySkLyAZXlocTwzUmzA0Uttr3U0sK.Ql5OTfQRBTuSVlQ4ToMI34xA1pka1zYGPOG
    hMEhiFa2YsSzQeEw3I6EATpQATwpjmqvBzYbNK.x6eGnQivVFFsnHPnExxeiOk6ZrAMMz_B9ivJPpqGL9
    kREUCXZG3BUPfftH7KfCU9bsno5H25b30GMOmzfU6sLOxk18JkPFMpN8lHZJtlHscP7MvwDvrCwwsZijc
    FpR1uXUBGvXxfwtX4eqXUCc0OPGcZzfeiQEeYmBCZcPYhf2uQGfYaQh6Z1zC6jBg_BbY9dVqVp2VKVe1k
    tyc7IityTAGDf8Lkqh3a4a&oauth_version=1.0')}, 'URI::http' )
    }, 'HTTP::Request' )
    }, 'HTTP::Response' );
    0
  • Sorry for all the posts, I got the POST to accept the OAuth stuff it seems by changing the content-type. Now I need to figure out how to feed in the JSON data?


    Here's the latest data dump from the response -
    CODE
    $VAR1 = bless( {
    '_protocol' => 'HTTP/1.1',
    '_content' => '{"result":null,"error":{"code":"Client.InvalidRequest","message":"No method given.","detail":null}}',
    '_rc' => '500',
    '_headers' => bless( {
    'connection' => 'close',
    'client-response-num' => 1,
    'cache-control' => 'private',
    'date' => 'Sun, 17 Apr 2011 13:58:12 GMT',
    'vary' => 'Accept-Encoding',
    'client-peer' => '209.191.106.45:80',
    'age' => '0',
    'p3p' => 'policyref="http://info.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC GOV"',
    'client-date' => 'Sun, 17 Apr 2011 13:58:12 GMT',
    'content-type' => 'application/json; charset=UTF-8',
    'server' => 'YTS/1.19.5'
    }, 'HTTP::Headers' ),
    '_msg' => 'Internal Server Error 88',
    'handlers' => {
    'response_data' => [
    {
    'callback' => sub { "DUMMY" }
    }
    ]
    },
    '_request' => bless( {
    '_content' => '',
    '_uri' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=2873471905&oauth_signature=tAu40asHFyoWliRdPy3h0ds8%2F0s%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303048685&oauth_token=A%3DfiUSChTvlC.d3PsfLgxovYADX5CdHEhLlBhYLuwOX_m9Gl89A4kxSTgnjiQxO_NCtpzWvOBkTGU5DP
    P6mF7GcL3cv1pTC5EXMv8q801CygFW6_62SQa3R7HWiLhiE4tNNiy2vhiHKxfeAsF54kOP7zMUztwuapF
    bmQ6OsrZ5GwylOif2tGqEuGJaH7I8DB3s0_wFKXTK2WpL05Fc4SXCskb9yzdcNzTUQAwAvpoxidD7jQlX
    7w0zxRVfCEnsrrRcBLC1yke.c1ZPYJdhf9hrvyazfqXuA.MTzm96ppKkT0aeDkPn59BEDuUVEV5y8.Anf
    e3icxTb7GjKoVdkvYwdgQ2mrBw50Lx3FRDDVirJXp_j5teky7o3f1dntAzUXwFJx2olSIEsuBJnmjZWSG
    sY2YjGMOqxbpcM2ViL2BezTogd3qsQLFo3d8u_FBJT_t10P36ukfLuhQRS240os3rszYyxrHdawX2mW6b
    olohHUNg3CIopzlRSncm8RxZTWGKmZtzl.Jqec8xL_aTOskfQJR9fYwuVPnAarNUsnlfsELX4xhVTRaQE
    5hKyK6ZXSdcMFav2ieCjje1Kqd.SdWGJWecL7zbZgi_fzLvRwDiQwIhf75uDCTu9OcsTkHD.TGRa4Nhiu
    Jlw4Ewgcbs6t1JK6o8kemMIu89nG.E17v1.Bsw34_22TxpiUYZmhMQtObc0cdmpRkD9cNtakYlac7ebEj
    jP8SM2d63QfEAOQLyIODXC&oauth_version=1.0')}, 'URI::http' ),
    '_headers' => bless( {
    'user-agent' => 'libwww-perl/5.825',
    '{"method":"getuserdata"}' => undef
    }, 'HTTP::Headers' ),
    '_method' => 'GET',
    '_uri_canonical' => bless( do{\(my $o = 'http://mail.yahooapis.com/ws/mail/v1.1/jsonrpc?oauth_consumer_key=dj0yJmk9SUJaMzRUeGJmaXBFJmQ9WVdrOVRGcFRjblJMTldrbWNHbzlNemt4T
    0RnMU1qWXkmcz1jb25zdW1lcnNlY3JldCZ4PWY0&oauth_nonce=2873471905&oauth_signature=tAu40asHFyoWliRdPy3h0ds8%2F0s%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1303048685&oauth_token=A%3DfiUSChTvlC.d3PsfLgxovYADX5CdHEhLlBhYLuwOX_m9Gl89A4kxSTgnjiQxO_NCtpzWvOBkTGU5DP
    P6mF7GcL3cv1pTC5EXMv8q801CygFW6_62SQa3R7HWiLhiE4tNNiy2vhiHKxfeAsF54kOP7zMUztwuapF
    bmQ6OsrZ5GwylOif2tGqEuGJaH7I8DB3s0_wFKXTK2WpL05Fc4SXCskb9yzdcNzTUQAwAvpoxidD7jQlX
    7w0zxRVfCEnsrrRcBLC1yke.c1ZPYJdhf9hrvyazfqXuA.MTzm96ppKkT0aeDkPn59BEDuUVEV5y8.Anf
    e3icxTb7GjKoVdkvYwdgQ2mrBw50Lx3FRDDVirJXp_j5teky7o3f1dntAzUXwFJx2olSIEsuBJnmjZWSG
    sY2YjGMOqxbpcM2ViL2BezTogd3qsQLFo3d8u_FBJT_t10P36ukfLuhQRS240os3rszYyxrHdawX2mW6b
    olohHUNg3CIopzlRSncm8RxZTWGKmZtzl.Jqec8xL_aTOskfQJR9fYwuVPnAarNUsnlfsELX4xhVTRaQE
    5hKyK6ZXSdcMFav2ieCjje1Kqd.SdWGJWecL7zbZgi_fzLvRwDiQwIhf75uDCTu9OcsTkHD.TGRa4Nhiu
    Jlw4Ewgcbs6t1JK6o8kemMIu89nG.E17v1.Bsw34_22TxpiUYZmhMQtObc0cdmpRkD9cNtakYlac7ebEj
    jP8SM2d63QfEAOQLyIODXC&oauth_version=1.0')}, 'URI::http' )
    }, 'HTTP::Request' )
    }, 'HTTP::Response' );


    ...so how do I give the JSON data to this?
    0
  • YES!!!!!! I FINALLY GOT THE MAIL API TO TALK TO ME IN PERL!!!! :Dprint "</pre><hr>";
    0
  • Hopefully this will save another Perl coder a lot of time, here's the code I've got so far that gets OAuth variables and then makes the Mail API call.

    I just got this to work after way too many hours of scratching my head. I couldn't find anything close to a working example in Perl of using a 3 leg OAuth to then make an API call using JSON ---- which is what Yahoo wants you to use according to their doc.
    http://developer.yahoo.com/mail/docs/user_guide/index.html
    http://developer.yahoo.com/oauth/guide/
    http://developer.yahoo.com/oauth/guide/oau...ke-request.html

    So anyway, I figured I'd post this Perl code. This would have been a big help to me, hope it helps someone else. Just change out the variables that I typed in CAPS to yours, upload this as one file to a CGI directory and it should work. (It uses a cookie to hold the OAuth variable when it jumps screens.)

    I know this code could use some cleaning up, but I need a shower now... the NASCAR race should be on soon :D}
    0
  • Recent Posts

    in Yahoo! Mail Web Services API