Vkontakte APIを使用する正しいアプローチ

こんにちは、Habr!



かつて、Vkontakte APIを合理的に使用するためにインターネットをサーフィンしていたのですが、わかりやすいものは見つかりませんでした。見つけた唯一のライブラリは、一般に受け入れられている慣習や美しいコードなしで実装されたものです。 私は既存の誤解を修正することに決め、Vkontakte APIを操作するためのライブラリを作成しました。

habrakatの下での燃焼の詳細とアプローチ。





そのため、VK APIは、いくつかの矛盾する点を除いて、かなりうまく実装されています。これについては、後で説明します。 しかし、今日のスピーチは品質に関するものではなく、特定のアプリケーションに関するものです。



すぐに予約が必要です。説明に加えて、作業コードをライブラリに持ち込みます。リンクは記事の最後に提供します。 ライブラリは、最新の安定バージョン5.5で動作します。バッチ受信からジェネレーターを切断した場合、5.4で動作するはずです。



承認を行う方法から始めましょう。

アクセストークン(アクセストークン)の取得に関しては、次の3つの方法でこれを行うことができます



開発者にとって最も興味深いのは、最初の2つです。 最初の方法では、サイト上のユーザーを許可してアクセスキーを取得できます。2番目の方法では、DekstopやMobileなどのアプリケーションを許可できます。 将来に目を向けると、2番目のオプションは私たちに素晴らしい機会を提供し、最初のオプションはそのほんの一部です。



最初のケースの受信アルゴリズムは、以下のポイントの履行まで削減されます。





これを実行できるサンプルコードは、トリッキーなビジネスではありません。



$auth = getjump\Vk\Auth::getInstance(); $auth->setAppId('3470411')->setScope('SCOPE')->setSecret('SECRET CODE')->setRedirectUri('http://localhost/test.php'); $token=$auth->startCallback(); printf("<a href='%s' target='_top'>LINK</a>", $auth->getUrl());
      
      







ドメインはlocalhostであり、現在のファイルはtest.phpであると想定されています。 すべてがうまくいった場合、$トークン変数には認証に合格したユーザーのアクセスキーが含まれます。



アクセスキーを取得した瞬間から、 APIリクエストを実行できます 。 リクエストの一般的なロジックは単純で、特別に形成されたリクエストをURL APIに渡します。 要求には、メソッドの名前と引数が含まれている必要があります。

api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN





メソッドのリスト 、これは豊富なAPIの1つです。 その中で、作業にアクセスキーを必要としないメソッドを見つけることができます。したがって、受信せずに呼び出すことができます。



ライブラリを使用する場合、次のような基本的なオブジェクトを作成する必要があります。

 $vk = getjump\Vk\Core::getInstance()->apiVersion('5.5')->setToken($token);
      
      







ライブラリを使用したクエリのサンプル:



それぞれの匿名関数では、1〜100のユーザーデータを含む100個のオブジェクトが渡されます。関数呼び出しを削除すると、__ callおよび__getマジックメソッドが再定義されたオブジェクトが返されるため、要求は発生しません。本当に必要なときにリクエストを行うことができます。

 $vk->request('users.get', ['user_ids' => range(1, 100)])->each(function($i, $v) { if($v->last_name == '') return; print $v->last_name . '<br>'; });
      
      







ジェネレーターの使用を明らかにしているものの1つは、バッチ受信です。 つまり、必要なときにのみデータを受け取ります。 次の例では、100件のリクエストですべてのメッセージを受信できます。注意してください。この方法では、メッセージ、スタンドアロンアプリケーション、同じ承認、およびそれに応じてアクセスキーを転送する権利が必要です。

 foreach($vk->request('messages.get')->batch(100) as $data) { $data->each(function($i, $m) { if(isset($m->body)) print $m->body . PHP_EOL; }); }
      
      







APIで見つけることができる優れたメソッドはexecuteです。 codeパラメーターを引数として受け取ります。codeは、サーバー側でコードを実行できる擬似JavaScriptの一種です。また、アプリケーションの編集時に作成できるストアドプロシージャを実行することもできます。



私はこのことを無視できず、ライブラリに実装できました。 簡単に言えば、複数のクエリを1つとして実行できます。 次のコード例を参照してください。



 $js1 = $vk->request('messages.get', ['count' => 200, 'offset' =>0 * 200])->toJs(); //    VkJs $js2 = $vk->request('messages.get', ['count' => 200, 'offset' =>1 * 200])->toJs(); $js3 = $vk->request('messages.get', ['count' => 200, 'offset' =>2 * 200])->toJs(); $js4 = $vk->request('messages.get', ['count' => 200, 'offset' =>3 * 200])->toJs(); $js1 ->append($js2) //   js2  js1 ->append($js3) ->append($js4) ->execute() //    (     RequestTransaction) ->response //    ->each( function($i, $v) //           execute(  4 , 4 ) { $v->each(function($c, $d) { //     200     if(isset($d->body)) print $d->body; //      }); });
      
      







約束どおり、現在のバージョンのAPI(5.21)で発生する可能性のある誤解の1つであるusers.getメソッドは、配列のような応答を返しますが、バージョン5から始まるfriends.getなど、他の場所では、フィールド数とアイテム、これは完全に論理的ではないように思えますが、APIを使用する場合は追加のコードが必要です。



ライブラリには、いくつかの操作のハンドラーもありますが、あなたの助けがあればさらに多くのことができます。

このライブラリを使用すると、非常に素晴らしく美しいコードを実現できます。これは、ハードビジネスで最も重要なことです。

コードに誤解やバグがあった可能性がありますので、ご注意をお願いします。プルリクエストは大歓迎です。

ほとんどの部分のライブラリは、PSR-0標準を満たしています。



Vkontakte APIが怖くなくても楽しいことをお見せできたことを願っています。



ご清聴ありがとうございました!



githubへのリンク: github.com/getjump/VkApiPHP

包括的なAPI ガイドvk.com/dev/main

PSR-0: github.com/getjump/fig-standards/blob/master/accepted/PSR-0.md

Packagist: packagist.org/packages/getjump/vk



更新:

Composer経由でインストール可能: composer require "getjump/vk:*"







更新2:

現在、最小バージョンは5.4であり、理論的には(理論的にはその機能のほとんどは使用されません)、配列に短い構文を使用しない場合、最大5.3まで起動できます。



All Articles