VKontakteを使用してニュースについて読者に自動的に警告する

第二部



まえがき



VKontakteソーシャルネットワークを使用し、 Habraの公式ページにサブスクライブしている皆さんは、メイントピックを含むすべての新しいトピックがメッセージリンクの形式でページに表示されることに気付きました。

vk



したがって、独自のブログを所有していて、同じリンクメッセージを個人用ページに自動的に公開する場合は、トピックに興味があるかもしれません。 今日は、単純なリンクメッセージを公開し、それらに「プレビュー」画像を追加しようとします。



実装



したがって、作業には、curlモジュールが接続されたPHPが必要です。 VKontakteのWebサイトとやり取りするには、その上で認証するとともに、各投稿が壁に投稿されるときに送信される一意のposthash変数の値を受け取る必要があります。



最も単純な許可機能を考えてみましょう。

function _auth( $cookies ) { $e = urlencode('my@email.ru'); //mail $p = urlencode('password'); //password $c = curl_init(); $s = 'act=login&q=1&al_frame=1&expire=&captcha_sid=&captcha_key=&from_host=vkontakte.ru&email=' . $e . '&pass=' . $p; curl_setopt($c, CURLOPT_URL,'http://login.vk.com/?act=login'); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_COOKIEJAR, $cookies); curl_setopt($c, CURLOPT_POST, 1); curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13)'); curl_setopt($c, CURLOPT_POSTFIELDS, $s); $r = curl_exec($c); curl_close($c); }
      
      





唯一の関数変数として、Cookieファイルにパスを渡し、そこで認証データを保存します。 将来的には、ページに入るときに、承認されているかどうかを確認し、承認されていない場合は、この関数を再実行します。



現在、現在のユーザーのID、彼のposthash変数の値、およびhandlePageParamsブロックのid変数の値を取得する関数が必要です。これにより、現在ページを表示しているユーザーが決まります。機能。 だから:

 function _params($cookies) { $c = curl_init(); curl_setopt($c, CURLOPT_HEADER, 1); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_REFERER, 'http://vkontakte.ru/settings.php'); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'); curl_setopt($c, CURLOPT_COOKIEJAR, $cookies); curl_setopt($c, CURLOPT_COOKIEFILE, $cookies); curl_setopt($c, CURLOPT_URL, 'http://vkontakte.ru/'); $r = curl_exec($c); curl_close($c); preg_match_all('/"post_hash":"(\w+)"/i', $r, $f1); preg_match_all('/"user_id":(\d+),/i', $r, $f2); preg_match_all('/handlePageParams\(\{"id":(\d+),/i', $r, $f3); return $f = array( 'post_hash' => $f1[1][0], 'user_id' => $f2[1][0], 'my_id' => $f3[1][0]); }
      
      





その結果、作業が必要な3つの変数を持つ配列を取得します。 これで、リンクメッセージを作成する機能を実装できます。 al_wall.phpファイルは、壁にメッセージを公開する役割を果たし、多くの受信パラメーターを持ち、それぞれに応じて、異なるメッセージを作成できます。 次のパラメータは、私たちにとって最も重要です:





このデータに基づいて、メッセージ作成関数を作成します。

 function _status($cookies, $hash, $url, $message, $title, $descr, $id) { $u = urlencode($url); $m = urlencode($message); $t = urlencode($title); $d = urlencode($descr); $q = 'act=post&al=1&hash=' . $hash . '&message=' . $m . '¬e_title=&official=&status_export=&to_id=' . $id . '&type=all&media_type=share&url=' . $u . '&title=' . $t . '&description=' . $d; $c = curl_init(); curl_setopt($c, CURLOPT_HEADER, 0); curl_setopt($c, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest')); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_POST, 1); curl_setopt($c, CURLOPT_REFERER, 'http://vkontakte.ru/id'.$id); curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13'); curl_setopt($c, CURLOPT_POSTFIELDS, $q); curl_setopt($c, CURLOPT_COOKIEJAR, $cookies); curl_setopt($c, CURLOPT_COOKIEFILE, $cookies); curl_setopt($c, CURLOPT_TIMEOUT, 15); curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 15); curl_setopt($c, CURLOPT_URL, 'http://vkontakte.ru/al_wall.php'); $r = curl_exec($c); curl_close($c); return $r; }
      
      





この関数は、VKontakteサーバーの応答を返します。エラーテキストまたは壁からの最後の10メッセージのいずれかであり、お客様の裁量で処理できます。 実際には、VKontakteサーバーでの作業は終了しました。承認をチェックし、変数を受け取り、メッセージを作成する一般的な関数を書くことは残っています。

 function vkPost($url='http://habrahabr.ru/', $message='message', $title='title', $descr='descr') { $o = 'aqwdhfyrfd.txt'; $h = _params($o, 'http://vkontakte.ru/id1', true); if($h['my_id'] == 0) { _auth($o, $d, true); $h = _params($o, 'http://vkontakte.ru/id1', true); } if($h['my_id'] != 0) { $r = _status($o, $h['post_hash'], $url, $message, $title, $descr, $h['user_id']); $c = preg_match_all('/page_wall_count_all/smi',$r,$f); if( $c == 0 ) { return false; } else { return true; } } }
      
      





統合オプション



これで、どこでも、どのエンジンでも使用できます。 または、壁の説明付きのリンクを公開するための別のphpファイルを作成します。 例として、Wordpressエンジンとの統合を示します。ブログエントリを公開すると、そのエントリへのリンクが自動的に公開されます。 そのため、上記のすべての関数を、テーマのあるディレクトリにあるfunctions.phpに転送する必要があります。それがない場合は、作成します。 次に、次の関数を追加し、フックとして定義します。

 function wp_vk_post_add($post_ID) { $post = get_post($post_ID); $title = $post->post_title; $link = get_permalink($post_ID); $descr = $post->post_content; $vkont = get_post_meta($post_ID, 'vkontakte', true); if(mb_strlen(trim($descr), 'UTF-8') >= 250) { $descr = strip_tags($descr); $descr = mb_substr($descr,0,250, 'UTF-8').'...'; } $message = '  ' . $title; if(mb_strlen(trim($message), 'UTF-8') >= 250) { $message = mb_substr($message,0,250, 'UTF-8').'...'; } if(mb_strlen(trim($title), 'UTF-8') >= 78) { $title = mb_substr($title,0,78, 'UTF-8').'...'; } if($vkont != '1') { $status = vkPost($link, $message, $title, $descr); if($status) { update_post_meta($post_ID, 'vkontakte','1'); } else { update_post_meta($post_ID, 'vkontakte','0'); } } return $post_ID; } add_action('publish_post', 'wp_vk_post_add');
      
      





少し説明。 実際、WordPressのpublish_postアクションは、管理パネルの[公開]ボタンをクリックしたときだけでなく、レコードを保存するたびに実行されます。 公開後に投稿を編集するたびにリンクを受信することは、決してよくありません。 したがって、リンクが正常に公開されると、値1のカスタムvkontakteフィールドが投稿に追加され、公開前にその存在がチェックされます。存在して1を含む場合、vkPost関数はスキップされます。



おわりに



これが、VKontakteと対話し、よりインタラクティブになる機会を得た方法です。 もちろん、すべてのユーティリティ関数を個別のクラスに配置し、curlの初期化を組み合わせてから、このクラスを作業中に単純に接続する方がより適切ですが、自分でそれを行うことは難しくなく、目標はこれを実装する方法を示すことでした。 また、VKontakteはプロキシサーバーを使用せずにリクエストを逃す可能性が低いことを覚えておく必要があります。 後で、このリンクに画像の挿入を追加できますが、これは別のトピックのストーリーです。



また、スクリプトがステータスを送信しすぎたり、「アクセスエラー」を返したりする場合、al_wals.phpが追加のcaptchaパラメータを要求することにも注意する価値があります。したがって、このメソッドはスパム送信に役立ちそうにありません。



次に例を示します。

ケーキ!







All Articles