これまでvk.wallpost.phpクラスを使用していた人は、ホスティングでこのスクリプトを実行する問題に遭遇したかもしれません。 このクラスはユーザー
xbreakerによって作成され、記事の
パート1および
パート2で詳細に説明されています。
このスクリプトは、ローカルコンピューターでうまく機能します。 ただし、ホスティングにドロップすると、メッセージの送信が停止します。
問題を検索する
実際、非常に長い間、問題が何であるかを理解できませんでした。 すべてのcurlコールを追跡しようとしましたが、ユーザーはログインしています(sidフィールドでcookieを受信しています)が、メッセージを送信したくはありませんでした。 理由は、ホスティング設定にあるか、VKontakteサービスがサイトへの入り口をブロックしたためです。
私は最初のものを落としました スクリプトには、通常構成されたホスティングでは機能しない独創的な構造が含まれていないことを確信していました。 VKontakteが一部のホスティング業者のIPアドレスをブロックしているように思えましたが、それはVKontakte管理者にとっては完全な倒錯でしょう。
その理由は非常に一般的であることが判明しました。 数時間無駄になった後、私はVKontakteサービスが何で応答するかを推測することにしました。
これが実際にロックであることが明らかになりました。 今ではそれを回避するために残っています。
問題解決
最初に必要なのは、メッセージに記載されている電話番号の最後の4桁です。 コードを送信するときに応答ヘッダーを表示するには、アノニマイザーとブラウザーインスペクターを使用しました。
このコードを送信する必要があることは明らかです。「ハッシュ」と「to」の2つの追加パラメーター。このコードを要求するページで取得できます(このデータはAJAX経由で送信されるため、JSコードで記述されます)。
私が作成した構文解析の式は次のとおりです。
preg_match_all('/hash: \'(.+?)\'/i', $r, $f4);
preg_match_all('/[, ]to: \'(.+?)\'/i', $r, $f5);
そして、それらをgetParams()関数に追加しました:
private function getParams()
{
$c=$this->getCurl();
curl_setopt($c, CURLOPT_REFERER, 'http://vkontakte.ru/settings.php');
curl_setopt($c, CURLOPT_URL, $this->wallURL); //
$r = curl_exec($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);
preg_match_all('/hash: \'(.+?)\'/i', $r, $f4);
preg_match_all('/[, ]to: \'(.+?)\'/i', $r, $f5);
$f = array(
'post_hash' => @$f1[1][0], //
'user_id' => @$f2[1][0],
'my_id' => @$f3[1][0], //id
'hash' => @$f4[1][0],
'to' => @$f5[1][0]);
if ($this->wallId=="")
$this->wallId=$f["my_id"];
return $f;
}
つまり IDに加えて、ページからこれらの2つのパラメーターを取得します。
これで、このコードを入力する関数を作成できます。
private function check($params) {
$c = curl_init();
$params = 'code='. $this->code. '&act=security_check&to='. $params['to']. '&hash=' .$params['hash']. '&al_page=';
curl_setopt($c, CURLOPT_URL,'http://vkontakte.ru/login.php');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
@curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($c, CURLOPT_COOKIEJAR, $this->_cookies);
curl_setopt($c, CURLOPT_COOKIEFILE, $this->_cookies);
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_USERAGENT, $this->userAgent);
curl_setopt($c, CURLOPT_POSTFIELDS, $params);
$this->execCurl($c, 'check');
return true;
}
クラスプロパティ$ this->コードを使用します。これは上記で発表しました。
このプロパティはコンストラクターで設定されるため、クラスは次のように作成されます。
$vk = new vk_wallpost($login, $pass, $code, $wallURL, $wallId="");
使用する
これで、スクリプトはホスティングで機能します。 しかし、それでも1つの問題が残っていました。VKontakteサービスの認証パラメーターが変更されると、スクリプトが機能しなくなります。
例のある作業スクリプトは
こちらです。
クラス作成者に再び感謝します。 私は彼が訂正のために罪を犯さないことを望みます。