Aplicația VK vă obligă să vă conectați

Totuși, acest articol ia în considerare o aplicație desktop în Java ca exemplu principii generale iar schema va fi similară pentru orice altă limbă.

Cum apare autorizarea?

Autorizarea pe VKontakte nu este diferită de orice altă autorizare prin intermediul unui server terță parte. Acest proces a fost descris perfect de un utilizator StackOverflow qnub:

  1. Pe serviciu (în în acest caz, VK) trebuie să înregistrați aplicația și să obțineți o cheie API.
  2. După aceasta, aplicația (site-ul) poate solicita datele personale ale utilizatorului de la un serviciu terță parte prin același API, pentru care:
    • redirecționează utilizatorul (browserul utilizatorului trimițându-i un răspuns HTTP de redirecționare 302) prin link special generat la un serviciu care furnizează un API;
    • utilizatorul va efectua unele acțiuni acolo, probabil se va autentifica și va permite accesul la date.
  3. La finalizarea acțiunilor, utilizatorul va fi redirecționat serviciu terț folosind aceeași redirecționare 302 către adresa URL transmisă în parametri link special generat.

Primul pas. Înregistrați-vă aplicația și obțineți o cheie

Acest pas este cel mai simplu. Trebuie să accesați pagina VK pentru dezvoltatori: https://vk.com/dev- și faceți clic pe butonul „Creați aplicație”. Indicăm tipul ca „Aplicație autonomă”; numele, desigur, este arbitrar. După aceasta, în secțiunea „Aplicațiile mele”(ce crezi?) va apărea aplicația ta. Simțiți-vă liber să faceți clic pe „editați”, apoi accesați secțiunea „Setări” - acolo, în prima linie, veți vedea inscripția „ID aplicație: 1234567 " Aceste numere sunt tot ce trebuie să vă amintiți pentru a vă conecta.

Rețineți că nu are rost să ascundeți ID-ul aplicației - acesta este afișat public, de exemplu, atunci când postați un mesaj pe perete prin această aplicație. Nici jetoanele și nici alte informații nu pot fi furate folosind un ID. În general, puteți chiar să utilizați ID-ul aplicației mele (dacă trebuie să scrieți scenariu mic pentru mine).

Pasul doi. Generarea unei legături speciale

În continuare, trebuie să direcționați utilizatorul către o adresă special generată (mențiunile acesteia sunt evidențiate cu caractere aldine în prima secțiune a articolului), unde acesta va confirma că dorește să permită aplicației dumneavoastră să efectueze unele acțiuni cu contul său. Cum se formează această legătură?

Acest proces este descris în detaliu în documentație. Cu toate acestea, dacă ați apelat la acest articol, presupun că nu ați avut suficiente informații în documentație și, prin urmare, voi repeta totul în propriile mele cuvinte. Link-ul are următoarea vedere: gazdă?parametri. Parametrii iau forma mai multor perechi cheie=valoare separate prin simboluri &.

Gazda rămâne întotdeauna aceeași: https://oauth.vk.com/authorize. Setul de parametri este, de asemenea, neschimbat:

  • client_id. Aici merită să indicați aceleași numere pe care le-am obținut în primul pas.
  • redirect_uri. Adresa către care va fi redirecționat utilizatorul. Pentru aplicațiile autonome, acesta este doar https://oauth.vk.com/blank.html.
  • afişa. Acest parametru determină modul în care va fi afișată pagina de conectare. Există trei opțiuni disponibile: pagină, pop-up și mobil. Dacă nu ești sigur, folosește pagina .
  • domeniul de aplicare. În acest parametru, ar trebui să enumerați parametrii de acces de care aveți nevoie, separați prin virgule. Lista plina parametri disponibili dat pe pagina corespunzătoare documentație. Vă rugăm să rețineți că nu trebuie să specificați absolut nimic și pur și simplu nu scrieți acest parametru. Pentru a afla ce opțiuni de acces aveți nevoie, uitați-vă la documentarea metodei pe care urmează să-l folosești.
  • tip_răspuns. Specificăm jetonul și mergem mai departe.
  • v. Versiunea API. Actual - 5.59 .

https://oauth.vk.com/authorize?client_id=1&display=page&redirect_uri=http://example.com/callback&scope=friends&response_type=token&v=5.59

Pasul trei. Ce urmeaza?

http://REDIRECT_URI#access_token= JETON 3&expires_in= TIMP&user_id= ID

Suntem interesati de JETON. Cum să direcționați utilizatorul către o pagină dintr-o aplicație Java și cum să obțineți adresa paginii către care VK îl va redirecționa (pentru a extrage un token din aceasta)? Există două moduri.

Dacă decideți să mergeți pe această rută, atunci pur și simplu deschideți browserul implicit al sistemului cu linkul pe care l-ați primit mai sus și spuneți cumva utilizatorului că ar trebui să copieze jetonul de pe adresa URL și să-l lipiți într-un câmp. Evident, această metodă are UX teribil, dar poate fi implementată rapid și ușor. Este destul de potrivit dacă scrieți o aplicație pentru dvs. - pentru a descărca muzică sau a primi notificări. Se implementează după cum urmează:

Public String askToken(String link) aruncă IOException, URISyntaxException( //Deschide linkul în browser implicit Desktop.getDesktop().browse(new URI(link)); //Solicită utilizatorului să introducă simbolul din browser manual return JOptionPane.showInputDialog(" Vă rugăm să introduceți access_token param din browser: "); )

Burghez, prin componente web

Dacă decideți să mergeți pe această cale, va trebui să utilizați o bibliotecă GUI terță parte (sau cel puțin JavaFX) care are propria sa componentă de browser. Programul dvs. va avea putere deplină asupra unui astfel de browser și veți putea recupera adresa către care VK v-a redirecționat, software. În JavaFX, acest lucru poate fi implementat după cum urmează:

Import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Scene; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; public class Main extinde Aplicația (public final static String REDIRECT_URL = "https://oauth.vk.com/blank.html"; public static final String VK_AUTH_URL = ""; //A FACE!!! public static String tokenUrl; public static void main(String args)( System.out.println(Main.getTokenUrl()); ) public static String getTokenUrl())( lansare(Main.class); return tokenUrl; ) @Override public void start(Stage primaryStage ) aruncă Excepție ( vizualizare finală WebView = nou WebView(); motor final WebEngine = view.getEngine(); engine.load(VK_AUTH_URL); primaryStage.setScene(new Scene(view)); primaryStage.show(); engine.locationProperty ( ).addListener(nou ChangeListener ()( @Override public void a fost modificat (ObservableValueobservabil, String oldValue, String newValue) (​if(newValue.startsWith(REDIRECT_URL))( tokenUrl=newValue; primaryStage.close(); ) ) ); ) )

Concluzie

Astfel, am învățat cum să obținem un token de acces VKontakte, cu ajutorul căruia puteți apela metode API. Dacă acest articol trezește interesul comunității, în articolul următor voi descrie cum să apelezi anumite metode API folosind un token, cum să verifici validitatea unui token (metoda secure.checkToken(), desigur) și să scriu câteva un fel de aplicație demonstrativă, de exemplu, pentru a salva toată muzica dintr-o listă de redare pe computer. Apropo, nu uitați că, de fapt, totul a fost inventat înaintea noastră și există deja biblioteci pentru lucrul cu API-ul VK pentru aproape orice limbă. Avem, în care am încercat să colectăm cele mai bune dintre ele.

Dacă aveți idei sau întrebări, bine ați venit la comentarii (le citesc și răspund tuturor). De asemenea, puteți pune întrebări

O zi bună, dragi cititori! Astăzi vom vorbi despre API-ul VKontakte, sau mai precis despre utilizarea API-ului în Delphi. Voi folosi Delphi 2010 in acest articol, in principiu nu trebuie sa il folositi, acest material va fi aplicabil oricarei versiuni de Delphi. Și așa, astăzi ne vom uita la metoda de autorizare în VK.COM folosind indy, configurarea componentelor indy pentru a funcționa cu API-ul VK. De fapt, totul este foarte, foarte simplu și se găsește de 100 de ori în Google Yandex și alte motoare de căutare. Dar cele mai multe dintre ele au fost scrise sub vkontakte.ru; atunci API-ul era diferit în mod natural. Ei bine, hai să începem. Mai întâi avem nevoie de componente:

  • IdHTTP
  • IdSSLIOHandlerSocketOpenSSL
  • IdCookieManager

Ei bine, standard:

  • TLabel
  • TEdit
  • TBbuton

Configurarea componentelor

IMPORTANT! Copiați aceste DLL-uri în folderul cu fișierul executabil al programului

Sunt în arhiva pentru acest material.
Și astfel, configurarea componentelor pentru autorizarea VKontakte este finalizată, bibliotecile DLL necesare au fost copiate, acum să scriem un mic cod.

Procedura TForm1.Button1Click(Expeditor: TObject); var TmpStr: șir ; json: TJSONObject ; client_id ,client_secret: șir ; Token, IdUser: șir ; begin client_id:= ID-ul dvs. primit pe site-ul web VKontakte; client_secret:= Secret de acolo; încercați TmpStr:= IdHTTP.Get("https://oauth.vk.com/token?grant_type=password&client_id="+client_id+"&client_secret="+client_secret+"&username="+EdtEmail.Text+"&parola="+EdtPass.Text. ); cu excepția E: Excepția începe MessageBox(Application.Handle, PChar(Format("Eroare: %s",)), "Eroare", MB_ICONHAND); Ieșire ; Sfârşit; Sfârşit; json:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TmpStr),0) ca TJSONObject; Token:= json.Get(0).JsonValue.ToString; Token:= StringReplace(Token, """, "", ); IdUser:= json.Get(2).JsonValue.ToString; end;

Omit în mod deliberat partea în care se vorbește de obicei despre cum să obțineți un ID și un secret de la VKontakte, ați citit deja acest lucru în postările anterioare. Vom avea doar cele mai necesare lucruri, nu orice material rămas).
O sa explic codul:
Primul lucru pe care probabil nu l-ați văzut în alte lecții este json: TJSONObject, da, da, analizez corect răspunsurile de pe server, așa cum o cere religia ;). Cu alte cuvinte, aceasta este variabila corectă pentru a stoca răspunsul de la server la cererea noastră GET. Este initializat simplu: json:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(TmpStr),0) ca TJSONObject; De asemenea, nu este dificil să scoți câmpuri din el: Token:= json.Get(0).JsonValue.ToString;
Tokenul și ID-ul utilizatorului sunt necesare pentru execuția ulterioară a funcțiilor API, despre care vom vorbi în articolele următoare.
Ei bine, asta e tot pentru cod. Nu verific autorizația, vă las asta)))

Deci, să trecem la partea tehnică. Pentru a face acest lucru, vom crea și configura o nouă aplicație pe rețeaua socială. Apoi vom scrie o clasă care va interacționa cu API-ul VKontakte: stabiliți o conexiune și primiți datele utilizatorului. Ca urmare a acțiunilor întreprinse, vom putea autoriza utilizatorul pe site-ul nostru.

Crearea unei noi aplicații VKontakte

Înainte de a scrie orice cod, trebuie să înregistrăm noua aplicație. Acest lucru se face simplu, accesați profilul dvs., accesați secțiunea aplicație și faceți clic pe butonul „Gestionați” din ea. În această secțiune veți vedea o listă cu toate aplicațiile pe care le utilizați și butonul „Creați aplicație”, faceți clic pe el. Completați numele și selectați „Site web”.

După aceasta, vor apărea două câmpuri noi, pe care le completăm și noi și facem clic pe „Conectează site-ul”. În fereastra următoare va trebui să vă confirmați înregistrarea.


Așa se înregistrează rapid și ușor noua aplicație VKontakte. Acum mergeți la setări și copiați ID-ul aplicației și cheia de securitate în notepad. Aici se termină munca cu rețeaua de socializare.


Scrierea unei clase pentru a lucra cu API

Înainte de a scrie clasa, vom defini logica acesteia, care va conține 3 proprietăți și 3 metode (inclusiv constructorul).

Clasa VKAuth( public $settings = array(); public $auth_status = false; public $user_info = array(); public function __construct($settings)( ) public function auth($code)( ) public function get_link())( ) )

  • setări – este responsabil pentru stocarea setărilor pentru conectarea la API;
  • auth_status – starea de autentificare, dacă utilizatorul trece, valoarea se schimbă în true;
  • În constructor vom accepta setările pentru conexiune și le vom salva în variabila setări;
  • auth – o metodă care se va conecta la API și va prelua datele de care avem nevoie (acceptă cod pentru a obține o cheie de acces);
  • get_link – metodă care generează calea linkului pentru autentificare.

Acum să ne uităm la fiecare dintre metode în detaliu:

1. Constructor:

După cum sa menționat anterior, acceptăm setările și le salvăm în variabila setări. Pentru fiabilitate, verificăm prezența lor folosind funcția isset().

Funcția publică __construct($settings)( if(isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"]))( $this->settings = $settings; ) )

În primul rând, verificăm prezența variabilelor de cod și setări. Dacă totul este în regulă, atunci formăm prima solicitare, care va consta dintr-o serie de date împachetate în două funcții.

urldecode() – decodifică %## caractere în url.

http_build_query() – generează un șir de interogare.

După ce contactăm adresa generată, vom primi un șir json ca răspuns. Pentru comoditate, convertim datele primite într-o matrice; acest lucru se face prin trecerea celui de-al doilea parametru adevărat la funcția json_decode(). Această matrice va conține trei celule: access_token, expires_in și user_id.

Să mergem mai departe, să verificăm prezența token-ului și să creăm o nouă solicitare pentru a primi datele utilizatorului. În funcția noastră vom salva: id, prenume, prenume și avatar. Pentru a face acest lucru, plasați o linie cu parametrii „uid,first_name, last_name,photo_100” în celula câmpurilor, separate prin virgule. Ce alte date despre utilizator pot fi obținute sunt descrise în documentația obiectului utilizatorului. Contactăm noul link și primim un răspuns sub forma unei matrice. Verificăm prezența datelor primite și le salvăm în variabila user_info (matricea primită este multidimensională, datele vor fi stocate în celula zero a răspunsului) și, de asemenea, schimbăm valoarea auth_status la true și returnăm true.

Funcție publică auth($code)( if($code && $this->settings)( $query = urldecode(http_build_query(array("client_id" => $this->settings["client_id"], "client_secret" => $this->settings["client_secret"], "code" => $code, "redirect_uri" => $this->settings["redirect_uri"]))); $token = json_decode(file_get_contents("https:// oauth.vk.com/access_token?".$query), true); if(isset($token["access_token"]))( $query = urldecode(http_build_query(array("uids" => $token["user_id") "], "fields" => "uid,first_name, last_name,photo_100", "access_token" => $token["access_token"]))); $this->user_info = json_decode(file_get_contents("https://api") .vk.com/method/users.get?".$query), true); if(isset($this->user_info["response"]["uid"]))( $this->user_info = $this ->user_info["răspuns"]; $this->auth_status = true; return true; ) ) ) return false; )

În primul rând, verificăm prezența setărilor și apoi creăm calea pentru link. Funcțiile utilizate sunt descrise mai sus. Când utilizatorul face clic pe un link cu această cale, el va fi redirecționat către o pagină cu parametrul cod în bara de adrese - codul pentru primirea unui token.

Funcția publică get_link())( if($this->settings)( $query = urldecode(http_build_query(array("client_id" => $this->settings["client_id"], "redirect_uri" => $this->) setări ["redirect_uri"], "response_type" => "cod"))); returnează "https://oauth.vk.com/authorize?".$query; ) return false; )

Autorizare simplă

În această etapă, totul este destul de rațional. După ce conectați clasa la fișier, tot ce rămâne este să obțineți instanța VKAuth trecându-i setările. Mai jos descriem un handler simplu care prinde variabila $_GET și verifică autentificarea.

Require_once("VKAuth.php"); $vk = new VKAuth(array("client_id" => "Application_ID", "client_secret" => "protected_key", "redirect_uri" => "site_address")); if(isset($_GET["cod"]))( if($vk->auth($_GET["cod"]))( // Ne facem afacerea ) )

În continuare, pentru a autoriza, va trebui să verificați prezența utilizatorului în baza de date și, dacă nu, să îl adăugați. În caz contrar, actualizați datele acestuia (înainte de actualizare, este indicat să verificați dacă acestea s-au modificat). În ceea ce privește baza de date, de obicei se adaugă două câmpuri: tipul de autorizare și id-ul de utilizator pe rețeaua de socializare. Acesta este modul în care se realizează autentificarea și autorizarea prin intermediul rețelei de socializare VKontakte.

În arhivă veți găsi un exemplu gata făcut de lucru cu clasa VKAuth, unde sunt afișate datele utilizatorului.

Bună, dragi prieteni! Cumva, recent a trebuit să mă conectez la unul dintre site-urile mele prin VKontakte. Acest lucru este foarte convenabil, deoarece nu este nevoie să vă înregistrați pe site-ul în sine, dar puteți utiliza imediat toate capacitățile sale din contul dvs. VKontakte. A trebuit să mă adâncesc în complexitățile pentru a îndeplini această sarcină. Apropo, în documentația oficială despre API-ul VK în sine, se scrie puțin și totul este foarte confuz.

Deci, pentru a începe să folosim API-ul VK, trebuie să creăm o nouă aplicație VKontakte. O facem astfel: urmați linkul: http://vk.com/editapp?act=create, selectați „site web”, introduceți numele aplicației noastre, precum și adresa site-ului la care este legată și domeniul de bază al site-ului nostru.

După creare, am luat cunoștință de ID-ul aplicației create de noi, precum și de codul secret, care, prin urmare, este „secret”, deoarece nu ar trebui publicat, prin urmare id-ul și codul secret scris mai jos sunt fictive. :)

ID: 3328234
Cod secret: Q5f2PSwkiFw23TysdDgr

Acum să începem să codificăm. Creăm un fișier „vklogin.php”, de exemplu, în rădăcina site-ului. Și inserați șablonul sau codul în următorul link:

https://oauth.vk.com/authorize?client_id=3328234&scope=1&redirect_uri=http://www.mydomain.ru/vklogin.php&response_type=code

Acesta ar putea fi un link text pe site, un link imagine sau chiar o redirecționare dintr-un script js. Principalul lucru este că făcând clic pe el, utilizatorul a mers la această adresă. Acum despre parametrii trecuți: client_id este identificatorul aplicației noastre VK, redirect_uri este adresa de pe site-ul nostru unde utilizatorul va fi redirecționat după primirea drepturilor VKontakte, response_type este tipul de autorizare, care în cazul nostru utilizează un cod. După ce face clic pe acest link, utilizatorul va vedea următoarea pagină a site-ului web VKontakte:


După ce utilizatorul face clic pe „Permite”, delegând astfel drepturi site-ului tău, el va fi redirecționat către scriptul nostru „vklogin.php”. Mai jos este scenariul în sine, o explicație mai târziu.

‹?php $VK_APP_ID = "3328234"; $VK_SECRET_CODE = "Q5f2PSwkiFw23TysdDgr"; if(!empty($_GET["code"])) ( $vk_grand_url = "https://api.vk.com/oauth/access_token?client_id=".$VK_APP_ID."&client_secret=".$VK_SECRET_CODE."&code =".$_GET["code"]."&redirect_uri=http://www.mydomain.ru/vklogin.php"; // trimite o solicitare pentru a primi un token de acces $resp = file_get_contents($vk_grand_url); $data = json_decode ($resp, true); $vk_access_token = $data["access_token"]; $vk_uid = $data["user_id"]; // accesați VK Api, obțineți prenume, prenume și ID utilizator VKontakte // utilizatori Metoda .get $res = file_get_contents("https://api.vk.com/method/users.get?uids=".$vk_uid."&access_token=".$vk_access_token."&fields=uid,first_name,last_name,nickname ,foto" ); $date = json_decode($res, true); $user_info = $data["răspuns"]; echo $user_info["first_name"]." ".$user_info["last_name"]."
"; echo "‹img .$user_info["photo"]."" border="0" /›"; ) ?›

Deci, cred că totul este clar cu variabilele ID și Sercet Code. Apoi, verificăm dacă VK ne-a trimis parametrul „cod” în timpul redirecționării, pe care îl adăugăm la adresa URL nou creată și accesăm din nou „contact”, dar direct din scriptul nostru. Pentru a face acest lucru, folosim funcția „file_get_contents”.

În această etapă, ar trebui să vă concentrați pe câteva note importante:

1. Este puțin probabil ca acest cod să poată fi testat pe un server local (de exemplu, pe „Derver”), precum și pe serverul utilizat, în setarea php.ini, directiva „allow_url_fopen” ar trebui să fie setată la „ 1”.
2. Extensia json pentru PHP trebuie instalată pe serverul pe care îl utilizați.
3. Și cel mai insidios lucru de care m-am împiedicat. Parametrii „redirect_uri” din ambele solicitări API trebuie să fie exact aceiași.

Rămâne doar să menționăm munca cu API-ul VK în sine. După cum ați observat, după a doua solicitare către VK, am primit parametrii „access_token” și „user_id”. În această etapă, suntem deja autorizați pe VK și putem accesa API-ul folosind aceste 2 variabile.

În ultima solicitare către API-ul VK, folosind metoda „users.get”, obținem numele utilizatorului VK, numele și ID-ul utilizatorului și pur și simplu le afișăm. Pentru o implementare specifică de conectare pe un site web prin VK, totul depinde de CMS-ul utilizat. Dacă aveți un CMS scris de dvs., puteți face următoarele. De exemplu, stocați ID-ul utilizatorului în variabilele de sesiune $_SESSION[‘vk_id’] și $_SESSION[‘vk_login’] după prima resetare a primei. Și vor verifica autorizarea utilizatorului folosind valoarea „vk_id”.

Puteți citi mai multe despre lucrul cu API-ul VK utilizând următoarele link-uri:

Documentație oficială pe VK API.

De ce este necesar acest lucru? Pentru a apela unele funcții VKontakte care nu sunt disponibile prin API-ul VKontakte sau din cauza restricțiilor existente.

Anterior, era suficient să trimiteți o solicitare GET către http://login.vk.com/?act=login trecând parametrii &email=*** (login) și &pass=*** (parolă). Recent, autorizarea nu are loc; în schimb, se face redirecționarea către adresa:

Http://vk.com/login.php?&to=&s=0&m=1&email=

Soluţie

Pentru a autoriza, trebuie să trimiteți o cerere de autorizare la https://login.vk.com/?act=login. Pentru a face acest lucru, trebuie să utilizați o solicitare POST, în care, pe lângă autentificare și parolă, trebuie să specificați următorii parametri:

Act: rol de conectare: al_frame ip_h: lg_h: e-mail:<логин>trece:<пароль>expire: captcha_sid: captcha_key: _origin: http://vk.com q: 1

1. Folosind CURL, deschideți http://vk.com și analizați valorile ip_h și lg_h. Modelele regulate simple vor arăta astfel:

Preg_match("/ /i", $vk_html, $ip_h); preg_match("/ /i", $vk_html, $lg_h)

2. Transferăm valorile primite împreună cu restul parametrilor cu o solicitare POST la adresa URL https://login.vk.com/?act=login. Ca urmare, cererea va arăta cam așa:

Https://login.vk.com/?act=login&ip_h=***&lg_h=***&role=al_frame&email=***&pass=***&expire=&captcha_sid=&captcha_key=&_origin=http://vk.com&q =1

3. Salvați cookie-urile într-un fișier și apelați pagina VKontakte necesară pentru analizare, de exemplu https://vk.com/feed?section=photos

Curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt");

Faceți mai întâi manual pașii 1 și 2 pentru a vă asigura că totul funcționează, obținând mai întâi valorile ip_h și lg_h prin codul sursă a paginii (combinația Ctrl+U în browser). Ca rezultat, ar trebui să fiți redirecționat către o pagină goală, iar bara de adrese ar trebui să conțină o valoare __q_hash.