Index: VKontakte.pm =================================================================== --- VKontakte.pm (revision 512) +++ VKontakte.pm (revision 513) @@ -20,7 +20,7 @@ app_secret: 32 hex digits authorize_url: http://api.vkontakte.ru/oauth/authorize access_token_url: https://api.vkontakte.ru/oauth/access_token - user_info_url: https://api.vkontakte.ru/method/getProfiles + user_info_url: https://api.vkontakte.ru/method/account.getProfileInfo user_post_url: ~ =cut @@ -122,6 +122,7 @@ return undef; } my $info = $JSON->decode($res->content); + warn Dumper $info if $DEBUG; unless ( ref $info eq 'HASH' && ($access_token = $info->{access_token}) ) { warn "No access token in response: ".$res->content."\n"; return undef; @@ -128,6 +129,10 @@ } $local_session->set( vk_access_token => $access_token ); $local_session->set( vk_user_id => $info->{user_id} ); + if ( exists $info->{email} ) { + $local_session->set( vk_email => $info->{email} ); + $local_session->set( email => $info->{email} ) unless exists $local_session->{email}; + } if ( my $expires = $info->{expires_in} ) { $local_session->set( vk_expires => time + $expires ); } else { @@ -138,9 +143,10 @@ warn "VK: have access token" if $DEBUG; } + my @fields = qw( uid first_name last_name nickname domain sex bdate city country timezone photo photo_medium photo_big ); my $req = URI->new( $self->{vk_user_info_url} ); $req->query_param( uid => $local_session->{vk_user_id} ); - $req->query_param( fields => 'uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big' ); + $req->query_param( fields => join ',', @fields ); $req->query_param( access_token => $access_token ); warn "VK: Fetching user $req\n" if $DEBUG; @@ -174,6 +180,9 @@ $user = $keeper->{users}->get_profile( vkontakte => $user_info->{uid} ); } } + if ( !ref $user && (exists $local_session->{vk_email} || exists $local_session->{email}) ) { + $user = $keeper->{users}->get_profile( email => exists $local_session->{vk_email} ? $local_session->{vk_email} : $local_session->{email} ); + } unless ( ref $user ) { $user = $keeper->{users}->get_profile( login => 'vkontakte:'.$user_info->{uid} ); } @@ -181,7 +190,7 @@ my $user_class = $state->{users}->profile_document_class; $user = $user_class->new( $keeper ); my %props = map { $_->{attr} => $_ } $user->structure; - $user->login( 'vkontakte:'.$user_info->{uid} ); + $user->login( exists $local_session->{vk_email} ? $local_session->{vk_email} : 'vkontakte:'.$user_info->{uid} ); $user->name( $user_info->{last_name}.', '.$user_info->{first_name} ); $user->nickname( $user_info->{nickname} ); $user->status( 1 ); @@ -190,7 +199,7 @@ if ( exists $props{country} ) { $user->country( $user_info->{country} ); } - $user->email( $email ); + $user->email( $local_session->{vk_email} ? $local_session->{vk_email} : undef ); my ($prop_ava) = grep { $_->{attr} eq 'avatar' && $_->{type} eq 'image' } $user->structure; if ( ref $prop_ava ) {