Первый коммит

This commit is contained in:
RedHood 2020-06-06 18:27:31 +10:00
commit c154c9f438
12 changed files with 2530 additions and 0 deletions

331
Auth.php Normal file
View File

@ -0,0 +1,331 @@
<?php
/**
* Created by PhpStorm.
* User: zerox
* Date: 25.08.18
* Time: 19:27
*/
namespace VK;
require_once('config_library.php');
/**
* Class Auth
* @package VK
*/
class Auth
{
/**
* @var null
*/
private $login = null;
/**
* @var null
*/
private $pass = null;
/**
* @var mixed|null
*/
private $cookie = null;
/**
* @var mixed|string
*/
private $useragent = DEFAULT_USERAGENT;
/**
* @var mixed|string
*/
private $id_app = DEFAULT_ID_APP;
/**
* @var string
*/
private $access_token = '';
/**
* @var string
*/
private $scope = '';
/**
* @var string
*/
private $method = '';
/**
* @var string
*/
private $default_scope = DEFAULT_SCOPE;
/**
* @var int
*/
private $is_auth = 0;
/**
* @var int
*/
private $auth_method = 0; //0 - mobile, 1 - app
/**
* @var null
*/
private $captcha_sid = null;
/**
* Auth constructor.
* @param $login
* @param null $pass
* @param null $other
* @param bool $mobile
* @throws VkApiException
*/
public function __construct($login, $pass = null, $other = null, $mobile = true)
{
if (!isset($login))
throw new VkApiException("Укажите логин и пароль либо куки");
if (is_array($other)) {
if (isset($other['useragent']))
$this->useragent = $other['useragent'];
if (isset($other['id_app']))
$this->id_app = $other['id_app'];
}
if (isset($pass)) {
$this->login = $login;
$this->pass = $pass;
$this->method = 'pass';
if (!$mobile)
$this->auth_method = 1;
} else {
$this->method = 'cookie';
$this->cookie = json_decode($login, true);
$this->auth_method = 1;
}
}
/**
* @throws VkApiException
*/
public function auth()
{
if ($this->auth_method == 0)
throw new VkApiException("Только для авторизации через приложение");
$this->loginInVK();
}
/**
* @throws VkApiException
*/
private function loginInVK()
{
$query_main_page = $this->getCURL('https://vk.com/');
preg_match('/name=\"ip_h\" value=\"(.*?)\"/s', $query_main_page['body'], $ip_h);
preg_match('/name=\"lg_h\" value=\"(.*?)\"/s', $query_main_page['body'], $lg_h);
$values_auth = [
'act' => 'login',
'role' => 'al_frame',
'_origin' => 'https://vk.com',
'utf8' => '1',
'email' => $this->login,
'pass' => $this->pass,
'lg_h' => $lg_h[1],
'ig_h' => $ip_h[1]
];
$get_url_redirect_auch = $this->getCURL('https://login.vk.com/?act=login', $values_auth);
if (!isset($get_url_redirect_auch['header']['location']))
throw new VkApiException("Ошибка, ссылка редиректа не получена");
$auth_page = $this->getCURL($get_url_redirect_auch['header']['location'][0]);
if (!isset($auth_page['header']['set-cookie']))
throw new VkApiException("Ошибка, куки пользователя не получены");
$this->is_auth = 1;
}
/**
* @param $url
* @param null $post_values
* @param bool $cookie
* @return array
*/
private function getCURL($url, $post_values = null, $cookie = true)
{
if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_USERAGENT, $this->useragent);
if (isset($post_values)) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_values);
}
//
// curl_setopt($curl, CURLOPT_HTTPHEADER, [
// "Content-Type: application/x-www-form-urlencoded",
// "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
// "User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
// ]);
if ($cookie and isset($this->cookie)) {
$send_cookie = [];
foreach ($this->cookie as $cookie_name => $cookie_val) {
$send_cookie[] = "$cookie_name=$cookie_val";
}
curl_setopt($curl, CURLOPT_COOKIE, join('; ', $send_cookie));
}
curl_setopt($curl, CURLOPT_HEADERFUNCTION,
function ($curl, $header) use (&$headers) {
$len = strlen($header);
$header = explode(':', $header, 2);
if (count($header) < 2) // ignore invalid headers
return $len;
$name = strtolower(trim($header[0]));
if (isset($headers) and !array_key_exists($name, $headers))
$headers[$name] = [trim($header[1])];
else
$headers[$name][] = trim($header[1]);
return $len;
}
);
$out = curl_exec($curl);
curl_close($curl);
if (isset($headers['set-cookie']))
$this->parseCookie($headers['set-cookie']);
return ['header' => $headers, 'body' => $out];
}
}
/**
* @param $new_cookie
*/
private function parseCookie($new_cookie)
{
foreach ($new_cookie as $cookie) {
preg_match("!(.*?)=(.*?);(.*)!s", $cookie, $preger);
if ($preger[2] == 'DELETED')
unset($this->cookie[$preger[1]]);
else
$this->cookie[$preger[1]] = $preger[2] . ';' . $preger[3];
}
}
/**
* @return false|string
*/
public function dumpCookie()
{
return json_encode($this->cookie);
}
/**
* @return bool
*/
public function isAuth()
{
$header = $this->getCURL("https://vk.com/feed")['header'];
if (isset($header['location'][0]) and strpos($header['location'][0], 'login.vk.com'))
return False;
return True;
}
/**
* @param null $captcha_key
* @param null $captcha_sid
* @return string
* @throws VkApiException
*/
public function getAccessToken($captcha_key = null, $captcha_sid = null)
{
if ($this->access_token != '')
return $this->access_token;
if ($this->auth_method) {
if ($this->is_auth == 0)
$this->loginInVK();
if ($this->access_token == '')
$this->access_token = $this->generateAccessToken();
} else {
if (isset($this->captcha_sid))
$captcha_sid = $this->captcha_sid;
$this->access_token = $this->generateAccessTokenMobile($captcha_key, $captcha_sid);
}
return $this->access_token;
}
/**
* @param null $scope
* @param bool $resend
* @return mixed
* @throws VkApiException
*/
private function generateAccessToken($scope = null, $resend = false)
{
$this->scope = [];
if (!isset($scope)) {
$scope = $this->default_scope;
}
foreach (preg_split("!,!", $scope) as $one_scope)
$this->scope[] = $one_scope;
$scope = "&scope=$scope";
if ($resend)
$scope .= "&revoke=1";
$token_url = 'https://oauth.vk.com/authorize?client_id=' . $this->id_app .
$scope .
'&response_type=token';
$get_url_token = $this->getCURL($token_url);
if (isset($get_url_token['header']['location'][0]))
$url_token = $get_url_token['header']['location'][0];
else {
preg_match('!location.href = "(.*)"\+addr!s', $get_url_token['body'], $url_token);
if (!isset($url_token[1])) {
throw new VkApiException("Не получилось получить токен на этапе получения ссылки подтверждения");
}
$url_token = $url_token[1];
}
$access_token_location = $this->getCURL($url_token)['header']['location'][0];
if (preg_match("!access_token=(.*?)&!s", $access_token_location, $access_token) != 1)
throw new VkApiException("Не удалось найти access_token в строке ридеректа, ошибка:" . $this->getCURL($access_token_location, null, false)['body']);
return $access_token[1];
}
/**
* @param $captcha_key
* @param $captcha_sid
* @return mixed
* @throws VkApiException
*/
private function generateAccessTokenMobile($captcha_key, $captcha_sid)
{
if (!isset($this->pass))
throw new VkApiException("Метод работает только с логином и паролем");
$captcha = '';
$this->scope = [];
$scope = $this->default_scope;
foreach (preg_split("!,!", $scope) as $one_scope)
$this->scope[] = $one_scope;
$scope = "&scope=$scope";
if (isset($captcha_sid) and isset($captcha_key))
$captcha = "&captcha_sid=$captcha_sid&captcha_key=$captcha_key";
$token_url = 'https://oauth.vk.com/token?grant_type=password&client_id=2274003&client_secret=hHbZxrka2uZ6jB1inYsH' .
'&username=' . $this->login .
'&password=' . $this->pass .
$scope .
$captcha;
$response_auth = $this->getCURL($token_url, null, false)['body'];
$response_auth = json_decode($response_auth, true);
if (isset($response_auth['access_token']))
return $response_auth['access_token'];
else
throw new VkApiException(json_encode($response_auth));
}
}

210
Base.php Normal file
View File

@ -0,0 +1,210 @@
<?php
namespace VK;
/**
* Class Base
* @package VK
*/
class Base
{
/**
* @var
*/
protected $vk_api;
/**
* @var array
*/
protected $message = [];
/**
* @var array
*/
protected $media = [];
/**
* @var array
*/
protected $props = [];
/**
* @var array
*/
protected $prop_list = [];
/**
* Base constructor.
* @param $vk_api
*/
protected function __construct($vk_api)
{
$this->vk_api = $vk_api;
}
/**
* @throws VkApiException
*/
public function addImage()
{
$this->addMedia(func_get_args(), 'images');
}
/**
* @param $media
* @param $selector
* @throws VkApiException
*/
protected function addMedia($media, $selector)
{
if ($this->countMedia() + count($media) > 10)
throw new VkApiException('Вы превысили максимальный лимит в 10 файлов');
else {
if (is_array($media))
foreach ($media as $val) {
if (is_array($val) and $selector != 'docs') {
if (isset($this->media[$selector]))
$this->media[$selector] = array_merge($this->media[$selector], $val);
else
$this->media[$selector] = $val;
} else
$this->media[$selector][] = $val;
}
else
$this->media[$selector][] = $media;
}
}
/**
* @return int
*/
private function countMedia()
{
$count = 0;
foreach ($this->media as $kye => $var) {
$count += count($var);
}
return $count;
}
/**
* @param $prop
* @param $value
* @return int
*/
public function addProp($prop, $value)
{
if (!in_array($prop, $this->prop_list))
return 0;
$this->props += [$prop => $value];
return $prop;
}
/**
* @param $docs
* @param null $title
* @throws VkApiException
*/
public function addDocs($docs, $title = null)
{
if (is_string($docs))
$docs = [0 => ['path' => $docs, 'title' => $title]];
else
foreach ($docs as $id => $file) {
if (is_string($file))
$docs[$id] = ['path' => $file, 'title' => null];
}
$this->addMedia($docs, 'docs');
}
/**
* @param $images
* @return int
*/
public function removeImages($images)
{
return $this->removeMedia($images, 'images');
}
/**
* @param $media
* @param $selector
* @return int
*/
protected function removeMedia($media, $selector)
{
$search = array_search($media, $this->media[$selector]);
if ($search) {
$remove_val = $this->media[$selector][$search];
unset($this->media[$selector][$search]);
return $remove_val;
}
if (is_numeric($media) and ($media >= 0 and $media <= count($this->media[$selector]) - 1)) {
$remove_val = $this->media[$selector][$media];
unset($this->media[$selector][$media]);
return $remove_val;
}
return 0;
}
/**
* @param $docs
* @return int
*/
public function removeDocs($docs)
{
return $this->removeMedia($docs, 'docs');
}
/**
* @param $prop
* @return int|mixed
*/
public function removeProp($prop)
{
$search = array_search($prop, $this->props);
if ($search) {
$remove_val = $this->props[$search];
unset($this->props[$search]);
return $remove_val;
}
if (is_numeric($prop) and ($prop >= 0 and $prop <= count($this->props) - 1)) {
$remove_val = $this->props[$prop];
unset($this->props[$prop]);
return $remove_val;
}
return 0;
}
/**
* @return array
*/
public function getMedia()
{
if (isset($this->media))
return $this->media;
else return [];
}
/**
* @return array
*/
public function getMessage()
{
return $this->message;
}
/**
* @param $message
*/
public function setMessage($message)
{
$this->message = $message;
}
/**
* @return array
*/
public function getProps()
{
return $this->props;
}
}

301
Coin.php Normal file
View File

@ -0,0 +1,301 @@
<?php
namespace VK;
require_once('config_library.php');
/**
* Class Coin
* @package VK
*/
class Coin {
/**
* @var string
*/
protected $merchant_id = '';
/**
* @var object | null
*/
private $data_request = null;
/**
* @var string
*/
private $merchant_key = '';
/**
* vk_api constructor.
* @param $token
* @param $merchant_id
*/
public function __construct($token, $merchant_id) {
$this->merchant_key = $token;
$this->merchant_id = $merchant_id;
}
/**
* @param $token
* @param $merchant_id
* @return Coin
*/
public static function create($token, $merchant_id) {
return new self($token, $merchant_id);
}
/**
* @param $user_id
* @param int $amount
* @return array|bool
*/
public function sendCoins($user_id, $amount) {
try {
$amount = $this->request('send', ['amount' => $amount * 1000, 'toId' => $user_id]);
if (isset($amount['amount']) && isset($amount['current'])) {
$amount['amount'] /= 1000;
$amount['current'] /= 1000;
}
return 1;
} catch (VkApiException $e) {
return 0;
}
}
/**
* @param array $user_ids
* @return array|bool
* @throws VkApiException
*/
public function getBalance($user_ids = []) {
if (empty($user_ids) or !is_array($user_ids))
$user_ids = empty($user_ids) ? [$this->merchant_id] : [$user_ids];
$results = $this->request('score', ['userIds' => $user_ids]);
if (count($results) < count($user_ids)) {
$nonexistent_id = join(',', (array_diff($user_ids, array_keys($results))));
throw new VkApiException("Попытка получить баланс следущих несуществующих пользователей:\n$nonexistent_id");
}
$this->_toCoin($results);
$results = array_combine($user_ids, array_values($results));
if (is_array($user_ids) && count($user_ids) == 1)
return $results[current($user_ids)];
else
return $results;
}
/**
* @param string $name
* @return array|bool
* @throws VkApiException
*/
public function setName($name) {
return $this->request('set', ['name' => $name]);
}
/**
* @param string $url
* @return array|bool
* @throws VkApiException
*/
public function setCallBack($url = null) {
return $this->request('set', ['callback' => $url]);
}
/**
* @return array|bool
* @throws VkApiException
*/
public function deleteCallBack() {
return $this->request('set', ['callback' => null]);
}
/**
* @return array|bool
* @throws VkApiException
*/
public function getLogs() {
return $this->request('set', ['status' => 1]);
}
/**
* @param int $sum
* @param int $payload
* @param bool $fixed_sum
* @param bool $to_hex
* @return array|string
*/
public function getLink($sum = 0, $fixed_sum = true, $payload = 0, $to_hex = false) {
$payload = ($payload !== 0) ? $payload : rand(-2000000000, 2000000000);
$fixed_sum = $fixed_sum ? '' : '_1';
if ($sum === 0)
return 'vk.com/coin#t' . $this->merchant_id;
$sum = (int)($sum * 1000);
if ($to_hex) {
$merchant_id = dechex($this->merchant_id);
$sum = dechex($sum);
$payload = dechex($payload);
return ['url' => "vk.com/coin#m{$merchant_id}_{$sum}_{$payload}{$fixed_sum}", 'payload' => $payload];
} else {
$merchant_id = $this->merchant_id;
return ['url' => "vk.com/coin#x{$merchant_id}_{$sum}_{$payload}{$fixed_sum}", 'payload' => $payload];
}
}
/**
* @param array $last_tx
* @return bool|mixed
* @throws VkApiException
*/
public function getStoryShop($last_tx = []) {
return $this->getTransaction(1, $last_tx);
}
/**
* @param array $last_tx
* @return bool|mixed
* @throws VkApiException
*/
public function getStoryAccount($last_tx = []) {
return $this->getTransaction(2, $last_tx);
}
/**
* @param array $transaction
* @return bool|mixed
* @throws VkApiException
*/
public function getInfoTransactions($id_transactions) {
if (is_array($id_transactions))
return $this->getTransaction($id_transactions);
else if (is_numeric($id_transactions))
return $this->getTransaction([$id_transactions]);
return 0;
}
/**
* @param $from_id
* @param $amount
* @param $payloadа
* @param $verify
* @param $data
*/
public function initVars(&$from_id, &$amount, &$payload, &$verify, &$data) {
print 'OK';
$data_request = json_decode(file_get_contents('php://input'));
$data = $this->data_request = $data_request;
if (is_object($this->data_request) &&
isset($this->data_request->id) &&
isset($this->data_request->from_id) &&
isset($this->data_request->amount) &&
isset($this->data_request->payload) &&
isset($this->data_request->key)) {
$from_id = $data_request->from_id;
$payload = $data_request->payload;
$amount = $data_request->amount;
$verify = $this->verifyKeys();
}
}
/**
* @return bool
*/
private function verifyKeys() {
$parameters = [
$this->data_request->id,
$this->data_request->from_id,
$this->data_request->amount,
$this->data_request->payload,
$this->data_request->merchant_key,
];
$key = md5(implode(';', $parameters));
return $this->data_request->key === $key;
}
/**
* @param $tx
* @param array $last_tx
* @return bool|mixed
* @throws VkApiException
*/
private function getTransaction($tx, $last_tx = []) {
if (!empty($last_tx))
$last_tx = ['lastTx' => $last_tx];
if (!is_array($tx))
$tx = [$tx];
$request = $this->request('tx', ['tx' => $tx] + $last_tx);
$this->_toCoin($request);
return $request;
}
/**
* @param $results
*/
private function _toCoin(&$results) {
if (is_array($results))
foreach ($results as $key => $value) {
if (is_array($value) && isset($results[$key]['amount']))
@$results[$key]['amount'] = is_int($results[$key]['amount']) ?
(float)($value['amount'] / 1000) :
$results[$key]['amount'];
else
$results[$key] = (float)($value / 1000);
}
}
/**
* @param $method
* @param array $params
* @return bool|mixed
* @throws VkApiException
*/
private function request($method, $params = []) {
$params['merchantId'] = $this->merchant_id;
$params['key'] = $this->merchant_key;
$url = 'https://coin-without-bugs.vkforms.ru/merchant/' . $method . '/';
try {
return $this->request_core($url, $params);
} catch (VkApiException $e) {
$exception = json_decode($e->getMessage(), true);
if (in_array($exception['error']['code'], [500, 422]))
throw new VkApiException($exception['error']['message']);
else
throw new VkApiException($e->getMessage());
}
}
/**
* @param $url
* @param array $params
* @return mixed
* @throws VkApiException
*/
private function request_core($url, $params = []) {
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params, JSON_UNESCAPED_UNICODE));
$result = json_decode(curl_exec($ch), True);
curl_close($ch);
} else {
$result = json_decode(file_get_contents($url, true, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-Type: application/json\r\n",
'content' => http_build_query($params)
]
])), true);
}
if (!isset($result) or isset($result['error']))
throw new VkApiException('Вк вернул ошибку:' . json_encode($result));
if (isset($result['response']))
return $result['response'];
else
return $result;
}
}

272
Execute.php Normal file
View File

@ -0,0 +1,272 @@
<?php
namespace VK;
class Execute extends vk_api {
private $vk;
private $counter = 0;
static private $max_counter = 10; // 25;
private $messages = [];
private $constructors_messages = [];
public function __construct($vk) {
parent::setAllDataclass($vk->copyAllDataclass());
$this->vk = $vk;
}
public function __destruct() {
$this->exec();
}
/**
* @param null $id
* @param null $message
* @param null $payload
* @param null $user_id
* @param null $type
* @param null $data
* @return array|mixed|null
*/
public function initVars(&$id = null, &$message = null, &$payload = null, &$user_id = null, &$type = null, &$data = null) {
if (!$this->vk->debug_mode)
$this->vk->sendOK();
$data = $this->vk->data;
$data_backup = $this->vk->data;
$type = isset($data->type) ? $data->type : null;
if($type == 'message_new' && isset($data->object->message)) {
$data->object = $data->object->message;
}
$id = isset($data->object->peer_id) ? $data->object->peer_id : null;
$message = isset($data->object->text) ? $data->object->text : null;
$payload = isset($data->object->payload) ? json_decode($data->object->payload, true) : null;
$user_id = isset($data->object->from_id) ? $data->object->from_id : null;
$data = $data_backup;
return $data_backup;
}
public function sendMessage($id, $message, $props = []) {
$message = $this->vk->placeholders($id, $message);
$this->messages[] = ['peer_id' => $id, 'message' => $message, "random_id" => rand(-2147483648, 2147483647)] + $props;
$this->counter += 1;
$this->checkExec();
}
public function sendButton($id, $message, $buttons = [], $inline = false, $one_time = False, $params = []) {
$keyboard = $this->generateKeyboard($buttons, $inline, $one_time);
$message = $this->vk->placeholders($id, $message);
$this->messages[] = ['message' => $message, 'peer_id' => $id, 'keyboard' => $keyboard, "random_id" => rand(-2147483648, 2147483647)] + $params;
$this->counter += 1;
$this->checkExec();
}
public function reply($message, $params = []) {
if ($this->vk->data != []) {
return $this->sendMessage($this->vk->data->object->peer_id, $message, $params);
} else {
throw new VkApiException('Вк не прислал callback, возможно вы пытаетесь запустить скрипт с локалки');
}
}
private function generateUrlPhotos($id, $count) {
$code = [];
for ($i = 0; $i < $count; ++$i)
$code[] = "API.photos.getMessagesUploadServer({\"peer_id\" : $id})";
return $this->request("execute", ["code" => "return [".join(',', $code). "];"]);
}
private function generateUrlDocs($id, $count) {
$code = [];
for ($i = 0; $i < $count; ++$i)
$code[] = "API.docs.getMessagesUploadServer({\"peer_id\" : $id, \"type\": \"doc\"})";
return $this->request("execute", ["code" => "return [".join(',', $code). "];"]);
}
public function createMessages($id, $message = [], $props = [], $media = [], $keyboard = []) {
if (!isset($media['images']))
$media['images'] = [];
if (!isset($media['docs']))
$media['docs'] = [];
if (count($media['docs']) + count($media['images']) + 1 + $this->counter > Execute::$max_counter)
$this->exec();
if (count($media['images']) != 0)
$photo_urls = $this->generateUrlPhotos($id, count($media['images']));
if (count($media['docs']) != 0)
$doc_urls = $this->generateUrlDocs($id, count($media['docs']));
if ($keyboard != [])
$object = [
'id' => $id,
'message' => $message,
'keyboard_content' => $this->generateKeyboard($keyboard['keyboard'], $keyboard['inline'], $keyboard['one_time']),
'images_content' => [],
'docs_content' => []
];
else
$object = [
'id' => $id,
'message' => $message,
'keyboard_content' => [],
'images_content' => [],
'docs_content' => []
];
foreach ($media as $selector => $massiv) {
switch ($selector) {
case "images":
foreach ($massiv as $key => $image) {
for ($i = 0; $i < $this->try_count_resend_file; ++$i) {
try {
$answer_vk = json_decode($this->sendFiles($photo_urls[$key]['upload_url'], $image, 'photo'), true);
$object['images_content'][] = ['photo' => $answer_vk['photo'], 'server' => $answer_vk['server'], 'hash' => $answer_vk['hash']];
$this->counter += 1;
break;
} catch (VkApiException $e) {
sleep(1);
$exception = json_decode($e->getMessage(), true);
if ($exception['error']['error_code'] != 121)
throw new VkApiException($e->getMessage());
}
}
}
break;
case "docs":
foreach ($massiv as $key => $document) {
for ($i = 0; $i < $this->try_count_resend_file; ++$i) {
try {
$title = isset($document['title']) ? $document['title'] : preg_replace("!.*?/!", '', $document);
$answer_vk = json_decode($this->sendFiles($doc_urls[$key]['upload_url'], $document['path']), true);
$object['docs_content'][] = ['file' => $answer_vk['file'], 'title' => $title];
$this->counter += 1;
break;
} catch (VkApiException $e) {
sleep(1);
$exception = json_decode($e->getMessage(), true);
if ($exception['error']['error_code'] != 121)
throw new VkApiException($e->getMessage());
}
}
}
break;
case "other":
break;
}
}
$this->counter += 1;
$this->constructors_messages[] = $object;
$this->checkExec();
return true;
}
private function getConversationsExec($offset) {
$code = 'var count = API.messages.getConversations({"count": 200, "offset": 0})["count"];
var start_offset = '. $offset .';
var temp_count = 0;
var count_apis = 1;
var result = [];
var write_allowed = [];
var ids = [];
while ((temp_count + start_offset) < count && count_apis < 25) {
result = API.messages.getConversations({"count": 200, "offset": (temp_count + start_offset)})["items"]@.conversation;
write_allowed = write_allowed + result@.can_write@.allowed;
ids = ids + result@.peer@.id;
temp_count = temp_count + 200;
count_apis = count_apis + 1;
}
return {"count": count, "offset_ok": (temp_count + start_offset),"write_allowed": write_allowed, "ids": ids};';
// $code = 'return API.messages.getConversations({"count": 200, "offset": 0})["count"];';
return $this->request("execute", ["code" => $code]);
}
private function getConversationsIds() {
$ids = [];
$exec_result = [
"count" => 1,
"offset_ok" => 0
];
while ($exec_result['count'] > $exec_result['offset_ok']) {
$exec_result = $this->getConversationsExec($exec_result['offset_ok']);
echo "{$exec_result['offset_ok']} / {$exec_result['count']}, ";
foreach ($exec_result['write_allowed'] as $key => $var)
if ($var)
$ids [] = $exec_result['ids'][$key];
}
$count = count($ids);
$ids = array_unique($ids);
echo "Complete!\nВсего id: ".$count."\nДубликатов: ".($count - count($ids))."\n";
return $ids;
}
// public function sendAllDialogs($message) {
// $ids = $this->getConversationsIds();
// $ids = array_chunk($ids, 100);
// foreach ($ids as $ids_chunk) {
// $this->messages[] = ['user_ids' => join(',', $ids_chunk), 'message' => $message, "random_id" => rand(-2147483648, 2147483647)];
// $this->counter += 1;
// $this->checkExec();
// }
// echo "COUNT = ".$this->counter."\n";
// }
private function checkExec() {
if ($this->counter >= Execute::$max_counter)
return $this->exec();
return false;
}
public function exec() {
if ($this->counter == 0)
return false;
$this->counter = 0;
$code = 'var query = '. json_encode($this->constructors_messages, JSON_UNESCAPED_UNICODE) .';
var query_message = '. json_encode($this->messages, JSON_UNESCAPED_UNICODE) .';
var count = 0;
var count_image = 0;
var text_attach_photo = "";
var resulter = [];
var data_result = [];
while (query[count] != null) {
text_attach_photo = "";
resulter = [];
count_image = 0;
while (query[count]["images_content"][count_image] != null) {
resulter = API.photos.saveMessagesPhoto(query[count]["images_content"][count_image]);
if (text_attach_photo == "") {
text_attach_photo = "photo" + resulter[0]["owner_id"] + "_" + resulter[0]["id"];
} else {
text_attach_photo = text_attach_photo + ",photo" + resulter[0]["owner_id"] + "_" + resulter[0]["id"];
}
count_image = count_image + 1;
}
count_image = 0;
while (query[count]["docs_content"][count_image] != null) {
resulter = API.docs.save(query[count]["docs_content"][count_image]);
if (text_attach_photo == "") {
text_attach_photo = "doc" + resulter["doc"]["owner_id"] + "_" + resulter["doc"]["id"];
} else {
text_attach_photo = text_attach_photo + ",doc" + resulter["doc"]["owner_id"] + "_" + resulter["doc"]["id"];
}
count_image = count_image + 1;
}
data_result.push(API.messages.send({"peer_id": query[count]["id"], "message": query[count]["message"], "random_id": 0, "attachment": text_attach_photo, "keyboard": query[count]["keyboard_content"]}));
count = count + 1;
}
count = 0;
while (query_message[count] != null) {
data_result.push(API.messages.send(query_message[count]));
count = count + 1;
}
return data_result;';
$this->messages = [];
$this->constructors_messages = [];
return $this->request("execute", ["code" => $code]);
}
}

45
Group.php Normal file
View File

@ -0,0 +1,45 @@
<?php
/**
* Created by PhpStorm.
* User: zerox
* Date: 25.08.18
* Time: 23:59
*/
namespace VK;
/**
* Class Group
* @package VK
*/
class Group extends vk_api
{
/**
* @var
*/
private $groupID;
/**
* Group constructor.
* @param $groupID
* @param $vk_api
*/
public function __construct($groupID, $vk_api)
{
$this->groupID = $groupID;
parent::setAllDataclass($vk_api->copyAllDataclass());
}
/**
* @param $method
* @param $params
* @return array
*/
protected function editRequestParams($method, $params)
{
// if ($method == 'messages.send' or $method == 'photos.saveMessagesPhoto')
$params['group_id'] = $this->groupID;
return [$method, $params];
}
}

219
LongPoll.php Normal file
View File

@ -0,0 +1,219 @@
<?php
namespace VK;
/**
* Class LongPoll
* @package VK
*/
class LongPoll extends vk_api
{
/**
* @var
*/
private $vk;
/**
* @var
*/
private $group_id;
/**
* @var
*/
private $user_id;
/**
* @var
*/
private $key;
/**
* @var
*/
private $server;
/**
* @var
*/
private $ts;
/**
* LongPoll constructor.
* @param $vk
*/
public function __construct($vk)
{
parent::setAllDataclass($vk->copyAllDataclass());
$this->vk = $vk;
$data = $this->vk->userInfo();
if ($data != false) {
$this->vk->auth_type = 'user';
$this->user_id = $data['id'];
} else {
$this->vk->auth_type = 'group';
$this->group_id = $this->vk->request('groups.getById', [])[0]['id'];
$this->vk->request('groups.setLongPollSettings', [
'group_id' => $this->group_id,
'enabled' => 1,
'api_version' => $this->vk->version,
'message_new' => 1,
]);
}
$this->getLongPollServer();
}
/**
*
*/
public function getLongPollServer()
{
if ($this->vk->auth_type == 'user')
$data = $this->vk->request('messages.getLongPollServer', ['need_pts' => 1, 'lp_version' => 3]);
else
$data = $this->vk->request('groups.getLongPollServer', ['group_id' => $this->group_id]);
unset($this->key);
unset($this->server);
unset($this->ts);
list($this->key, $this->server, $this->ts) = [$data['key'], $data['server'], $data['ts']];
}
/**
* @param $anon
* @throws VkApiException
*/
public function listen($anon)
{
while ($data = $this->processingData()) {
foreach ($data->updates as $event) {
unset($this->vk->data);
$this->vk->data = $event;
$anon($event);
}
if ($this->vk instanceof Execute) {
$this->vk->exec();
}
}
}
/**
* @return mixed
* @throws VkApiException
*/
public function processingData()
{
$data = $this->getData();
if (isset($data->failed)) {
if ($data->failed == 1) {
unset($this->ts);
$this->ts = $data->ts;
}
else {
$this->getLongPollServer();
$data = $this->getData();
}
}
unset($this->ts);
$this->ts = $data->ts;
return $data;
}
/**
* @return mixed
* @throws VkApiException
*/
public function getData()
{
$defult_params = ['act' => 'a_check', 'key' => $this->key, 'ts' => $this->ts, 'wait' => 55];
if($this->vk->auth_type == 'user') {
$params = ['mode' => 32, 'version' => 3];
$data = $this->request_core('https://' . $this->server . '?', $defult_params + $params);
} else {
$data = $this->request_core($this->server . '?', $defult_params);
}
return $data;
}
/**
* @param $type
* @param $anon
*/
public function on($type, $anon)
{
$summands = [];
$data = json_decode(json_encode($this->vk->data), true);
switch ($type) {
case 'message_new':
{
if ($data[0] == 4) {
foreach ([1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 65536] as $key) {
if ($data[2] & $key)
$summands[] = $key;
}
if (!in_array(2, $summands)) { //только входящие сообщения
$this->vk->data = [];
$this->vk->data['object']['peer_id'] = $data[3];
$this->vk->data['object']['text'] = $data[5];
$this->vk->data = json_decode(json_encode($this->vk->data));
$anon($data);
}
}
break;
}
}
}
/**
* @param $id
* @param null $message
* @param null $payload
* @param null $user_id
* @param null $type
* @param null $data
* @return |null
*/
public function initVars(&$id = null, &$message = null, &$payload = null, &$user_id = null, &$type = null, &$data = null)
{
$data = $this->vk->data;
$data_backup = $this->vk->data;
$type = isset($data->type) ? $data->type : null;
if($type == 'message_new' && isset($data->object->message)) {
$data->object = $data->object->message;
}
$id = isset($data->object->peer_id) ? $data->object->peer_id : null;
$message = isset($data->object->text) ? $data->object->text : null;
$payload = isset($data->object->payload) ? json_decode($data->object->payload, true) : null;
$user_id = isset($data->object->from_id) ? $data->object->from_id : null;
$data = $data_backup;
return $data_backup;
}
public function reply($message, $params = []) {
$message = $this->vk->placeholders($this->vk->data->object->peer_id, $message);
return $this->vk->request('messages.send', ['message' => $message, 'peer_id' => $this->vk->data->object->peer_id] + $params);
}
/**
* @param $url
* @param array $params
* @return mixed
* @throws VkApiException
*/
private function request_core($url, $params = [])
{
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = json_decode(curl_exec($ch));
curl_close($ch);
} else {
$result = json_decode(file_get_contents($url, true, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => http_build_query($params)
]
])));
}
if (!isset($result) or isset($result->error))
throw new VkApiException(json_encode($result));
return $result;
}
}

64
Message.php Normal file
View File

@ -0,0 +1,64 @@
<?php
namespace VK;
/**
* Class Message
* @package VK
*/
class Message extends Base
{
/**
* @var array
*/
private $keyboard = [];
/**
* Message constructor.
* @param $vk_api
*/
public function __construct($vk_api)
{
$this->prop_list = ['random_id', 'domain', 'chat_id', 'user_ids', 'lat', 'long', 'forward_messages',
'sticker_id', 'payload'];
parent::__construct($vk_api);
}
/**
* @return array
*/
public function getKeyboard()
{
return $this->keyboard;
}
/**
* @param array $keyboard
* @param bool $inline
* @param bool $one_time
*/
public function setKeyboard($keyboard = [], $inline = false, $one_time = false)
{
$this->keyboard = ['keyboard' => $keyboard, 'inline' => $inline, 'one_time' => $one_time];
}
public function addVoice()
{
$this->addMedia(func_get_args(), 'voice');
}
public function removeVoice($voice)
{
return $this->removeMedia($voice, 'voice');
}
/**
* @param $id
* @return mixed
*/
public function send($id)
{
return $this->vk_api->createMessages($id, $this->message, $this->props, $this->media, $this->keyboard);
}
}

39
Post.php Normal file
View File

@ -0,0 +1,39 @@
<?php
namespace VK;
/**
* Class Post
* @package VK
*/
class Post extends Base
{
/**
* Post constructor.
* @param $vk_api
*/
public function __construct($vk_api)
{
$this->prop_list = ['friends_only', 'from_group', 'services', 'signed', 'publish_date', 'lat', 'long', 'place_id',
'post_id', 'guid', 'mark_as_ads', 'close_comments'];
parent::__construct($vk_api);
}
/**
* @param $id
* @param null $publish_date
* @return mixed
* @throws VkApiException
*/
public function send($id, $publish_date = null)
{
if ($publish_date >= time())
$this->props['publish_date'] = $publish_date;
else if ($publish_date == null)
$this->props['publish_date'] = time();
else
throw new VkApiException('Неверно указан $publish_date');
return $this->vk_api->createPost($id, $this->message, $this->props, $this->media);
}
}

42
SiteAuth.php Normal file
View File

@ -0,0 +1,42 @@
<?php
/**
* Created by PhpStorm.
* User: runnin
* Date: 01.08.19
* Time: 17:56
*/
namespace VK;
class SiteAuth {
public $settings = [];
public $data = [];
public function __construct($settings) {
if (isset($settings["client_id"], $settings["client_secret"], $settings["redirect_uri"])) {
$this->settings = $settings;
}
}
public function auth() {
if (isset($_GET['code'])) {
$query = urldecode(http_build_query($this->settings + ["code" => $_GET['code']]));
$token = json_decode(file_get_contents("https://oauth.vk.com/access_token?" . $query), true);
if (isset($token["access_token"])) {
$this->data = $token;
return true;
}
}
return false;
}
public function get_link() {
$query = urldecode(http_build_query([
"client_id" => $this->settings["client_id"],
"redirect_uri" => $this->settings["redirect_uri"],
"response_type" => "code"
]));
return "https://oauth.vk.com/authorize?" . $query;
}
}

29
VkApiException.php Normal file
View File

@ -0,0 +1,29 @@
<?php
namespace VK;
use Exception;
use Throwable;
class VkApiException extends Exception {
public function __construct($message = "", $code = 0, Throwable $previous = null) {
//echo "\n".$this->__toString()."\n";
parent::__construct($message, $code, $previous);
}
public function __toString() {
$error = "[Exception]: возникла ошибка:";
$error .= "\r\n[Exception]: текст: {$this->getMessage()}";
$error .= "\r\n[Exception]: код ошибки: {$this->getCode()}";
$error .= "\r\n[Exception]: файл: {$this->getFile()}:{$this->getLine()}";
$error .= "\r\n[Exception]: путь ошибки: {$this->getTraceAsString()}\r\n";
if (!is_dir('error'))
mkdir('error');
$file = fopen('error/error_log' . date('d-m-Y_h') . ".log", 'a');
fwrite($file, $error);
fclose($file);
// exit();
return $error;
// parent::__toString(); // TODO: Change the autogenerated stub
}
}

20
config_library.php Normal file
View File

@ -0,0 +1,20 @@
<?php
/**
* Created by PhpStorm.
* User: zerox
* Date: 31.10.18
* Time: 0:41
*/
namespace VK;
// массив кодов ошибок ВК, при которых сообщение об ошибке игнорируется и отправляется повторный запрос к api
const REQUEST_IGNORE_ERROR = [1,6,9,10,14];
// максимальное количество попыток загрузки файла
const COUNT_TRY_SEND_FILE = 5;
// Auth
// Запрашиваемые права доступа для токена пользователя по уполчанию
const DEFAULT_SCOPE = "notify,friends,photos,audio,video,stories,pages,status,notes,messages,wall,ads,offline,docs,groups,notifications,stats,email,market";
// User-Agent по умолчанию
const DEFAULT_USERAGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36';
// ID приложения ВК по умолчанию
const DEFAULT_ID_APP = '6660888';
/*-----Массив разницы версий--------*/

958
vk_api.php Normal file
View File

@ -0,0 +1,958 @@
<?php
namespace VK;
use CURLFile;
use Exception;
require_once('config_library.php');
/**
* Class vk_api
* @package vk_api
*/
class vk_api {
/**
* @var string
*/
protected $version = '';
/**
* @var array|mixed
*/
protected $data = [];
/**
* @var string
*/
protected $auth_type = '';
/**
* @var string
*/
private $token = '';
/**
* @var int
*/
protected $debug_mode = 0;
/**
* @var Auth|null
*/
private $auth = null;
/**
* @var array
*/
private $request_ignore_error = REQUEST_IGNORE_ERROR;
/**
* @var int
*/
protected $try_count_resend_file = COUNT_TRY_SEND_FILE;
/**
* vk_api constructor.
* @param $token
* @param $version
* @param null $also_version
* @throws VkApiException
*/
public function __construct($token, $version, $also_version = null) {
if ($token instanceof auth) {
$this->auth = $token;
$this->version = $version;
$this->token = $this->auth->getAccessToken();
} else if (isset($also_version)) {
$this->auth = new Auth($token, $version);
$this->token = $this->auth->getAccessToken();
$this->version = $also_version;
} else {
$this->token = $token;
$this->version = $version;
}
$this->data = json_decode(file_get_contents('php://input'));
}
/**
* @param $token
* @param $version
* @param null $also_version
* @return vk_api
*
* @throws VkApiException
*/
public static function create($token, $version, $also_version = null) {
return new self($token, $version, $also_version);
}
/**
* @param $str
* @return vk_api
*/
public function setConfirm($str) {
if (isset($this->data->type) && $this->data->type == 'confirmation') { //Если vk запрашивает ключ
exit($str); //Завершаем скрипт отправкой ключа
}
return $this;
}
/**
* @param null $id
* @param null $message
* @param null $payload
* @param null $user_id
* @param null $type
* @param null $data
* @return array|mixed|null
*/
public function initVars(&$id = null, &$message = null, &$payload = null, &$user_id = null, &$type = null, &$data = null) {
if (!$this->debug_mode)
$this->sendOK();
$data = $this->data;
$data_backup = $this->data;
$type = isset($data->type) ? $data->type : null;
if(isset($data->object->message) and $type == 'message_new') {
$data->object = $data->object->message; //какая-то дичь с ссылками, но $this->data теперь тоже переопределился
}
$id = isset($data->object->peer_id) ? $data->object->peer_id : null;
$message = isset($data->object->text) ? $data->object->text : null;
$payload = isset($data->object->payload) ? json_decode($data->object->payload, true) : null;
$user_id = isset($data->object->from_id) ? $data->object->from_id : null;
$data = $data_backup;
return $data_backup;
}
/**
* @return bool
*/
protected function sendOK() {
set_time_limit(0);
ini_set('display_errors', 'Off');
// для Nginx
if (is_callable('fastcgi_finish_request')) {
echo 'ok';
session_write_close();
fastcgi_finish_request();
return True;
}
// для Apache
ignore_user_abort(true);
ob_start();
header('Content-Encoding: none');
header('Content-Length: 2');
header('Connection: close');
echo 'ok';
ob_end_flush();
flush();
return True;
}
/**
* @param $message
* @param array $params
* @return bool|mixed
* @throws VkApiException
*/
public function reply($message, $params = []) {
if ($this->data != []) {
$message = $this->placeholders($this->data->object->peer_id, $message);
return $this->request('messages.send', ['message' => $message, 'peer_id' => $this->data->object->peer_id] + $params);
} else {
throw new VkApiException('Вк не прислал callback, возможно вы пытаетесь запустить скрипт с локалки');
}
}
public function forward($id, $id_messages, $params = []) {
$forward_messages = (is_array($id_messages)) ? join(',', $id_messages) : $id_messages;
return $this->request('messages.send', ['peer_id' => $id, 'forward_messages' => $forward_messages] + $params);
}
public function sendAllChats($message, $params = []) {
unset($this->request_ignore_error[array_search(10, $this->request_ignore_error)]); //убираем код 10 из исключений
$i = 0;
$count = 0;
print "Начинаю перебор всех бесед...\n";
while (true) {
print(++$i . " ");
try {
$this->sendMessage(2000000000 + $i, $message, $params);
$count++;
} catch (VkApiException $e) {
if ($e->getCode() == 10) {
print "\nВсего было разослано в $count бесед";
break;
}
}
}
}
protected function placeholders($id, $message) {
if($id >= 2000000000) {
$id = isset($this->data->object->from_id) ? $this->data->object->from_id : null;
}
if($id == null) {
print "Попытка использовать заполнители при передаче id беседы";
return $message;
} else {
if (strpos($message, '%') !== false) {
$data = $this->userInfo($id);
$f = $data['first_name'];
$l = $data['last_name'];
$tag = ['%fn%', '%ln%', '%full%', '%a_fn%', '%a_ln%', '%a_full%'];
$replace = [$f, $l, "$f $l", "@id{$id}($f)", "@id{$id}($l)", "@id{$id}($f $l)"];
return str_replace($tag, $replace, $message);
} else
return $message;
}
}
/**
* @param $method
* @param array $params
* @return bool|mixed
* @throws VkApiException
*/
public function request($method, $params = []) {
list($method, $params) = $this->editRequestParams($method, $params);
$url = 'https://api.vk.com/method/' . $method;
$params['access_token'] = $this->token;
$params['v'] = $this->version;
$params['random_id'] = rand(-2147483648, 2147483647);
while (True) {
try {
return $this->request_core($url, $params);
} catch (VkApiException $e) {
if (in_array($e->getCode(), $this->request_ignore_error)) {
sleep(1);
continue;
}
else
throw new VkApiException($e->getMessage(), $e->getCode());
}
}
return false;
}
/**
* @param $method
* @param $params
* @return array
*/
protected function editRequestParams($method, $params) {
return [$method, $params];
}
/**
* @param $url
* @param array $params
* @return mixed
* @throws VkApiException
*/
private function request_core($url, $params = []) {
if (function_exists('curl_init')) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type:multipart/form-data"
]);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = json_decode(curl_exec($ch), True);
curl_close($ch);
} else {
$result = json_decode(file_get_contents($url, true, stream_context_create([
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'content' => http_build_query($params)
]
])), true);
}
if (!isset($result))
$this->request_core($url, $params);
if (isset($result['error'])) {
throw new VkApiException(json_encode($result), $result['error']['error_code']);
}
if (isset($result['response']))
return $result['response'];
else
return $result;
}
/**
* @param $message
* @param null $keyboard
* @param string $filter
* @param array $params
* @throws VkApiException
*/
public function sendAllDialogs($message, $keyboard = null, $filter = 'all', $params = []) {
$ids = [];
for ($count_all = 1, $offset = 0; $offset <= $count_all; $offset += 200) {
$members = $this->request('messages.getConversations', ['count' => 200, 'offset' => $offset, 'filter' => $filter]);//'filter' => 'unread'
if ($count_all != 1)
$offset += $members['count'] - $count_all;
$count_all = $members['count'];
foreach ($members["items"] as $user)
if ($user['conversation']["can_write"]["allowed"] == true)
$ids [] = $user['conversation']['peer']['id'];
}
$ids = array_chunk($ids, 100);
foreach ($ids as $ids_chunk) {
try {
$this->request('messages.send', ['user_ids' => join(',', $ids_chunk), 'message' => $message, 'keyboard' => $keyboard] + $params);
} catch (Exception $e) {
continue;
}
}
}
/**
* @param $id
* @param null $n
* @return string
* @throws VkApiException
*/
public function getAlias($id, $n = null) { //получить обращение к юзеру или группе
if (!is_numeric($id)) { //если короткая ссылка
$obj = $this->request('utils.resolveScreenName', ['screen_name' => $id]); //узнаем, кому принадлежит, сообществу или юзеру
$id = ($obj["type"] == 'group') ? -$obj['object_id'] : $obj['object_id'];
}
if (isset($n)) {
if (is_string($n)) {
if ($id < 0)
return "@club" . ($id * -1) . "($n)";
else
return "@id{$id}($n)";
} else {
if ($id < 0) {
$id = -$id;
$group_name = $this->request('groups.getById', ['group_id' => $id])[0]['name'];
return "@club{$id}({$group_name})";
} else {
$info = $this->userInfo($id);
if ($n)
return "@id{$id}($info[first_name] $info[last_name])";
else
return "@id{$id}($info[first_name])";
}
}
} else {
if ($id < 0)
return "@club" . ($id * -1);
else
return "@id{$id}";
}
}
/**
* @param null $user_url
* @param array $scope
* @return mixed
* @throws VkApiException
*/
public function userInfo($user_url = '', $scope = []) {
$scope = ["fields" => join(",", $scope)];
if (isset($user_url)) {
$user_url = preg_replace("!.*?/!", '', $user_url);
$user_url = ($user_url == '') ? [] : ["user_ids" => $user_url];
}
try {
return current($this->request('users.get', $user_url + $scope));
} catch (Exception $e) {
return false;
}
}
/**
* @param $chat_id
* @param $user_id
* @return bool|null|string
* @throws VkApiException
*/
public function isAdmin($user_id, $chat_id) { //возвращает привелегию по id
try {
$members = $this->request('messages.getConversationMembers', ['peer_id' => $chat_id])['items'];
} catch (\Exception $e) {
throw new VkApiException('Бот не админ в этой беседе, или бота нет в этой беседе');
}
foreach ($members as $key) {
if ($key['member_id'] == $user_id)
return (isset($key["is_owner"])) ? 'owner' : ((isset($key["is_admin"])) ? 'admin' : false);
}
return null;
}
/**
* @param $id
* @param $message
* @param array $params
* @return bool|mixed
* @throws VkApiException
*/
public function sendMessage($id, $message, $params = []) {
if ($id < 1)
return 0;
$message = $this->placeholders($id, $message);
return $this->request('messages.send', ['message' => $message, 'peer_id' => $id] + $params);
}
/**
*
*/
public function debug() {
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
echo 'ok';
$this->debug_mode = 1;
}
/**
* @param $id
* @param $message
* @param array $buttons
* @param bool $inline
* @param bool $one_time
* @param array $params
* @return mixed
* @throws VkApiException
*/
public function sendButton($id, $message, $buttons = [], $inline = false, $one_time = False, $params = []) {
$keyboard = $this->generateKeyboard($buttons, $inline, $one_time);
$message = $this->placeholders($id, $message);
return $this->request('messages.send', ['message' => $message, 'peer_id' => $id, 'keyboard' => $keyboard] + $params);
}
public function buttonLocation($payload = null) {
return ['location', $payload];
}
public function buttonPayToGroup($group_id, $amount, $description = null, $data = null, $payload = null) {
return ['vkpay', $payload, 'pay-to-group', $group_id, $amount, $description, $data];
}
public function buttonPayToUser($user_id, $amount, $description = null, $payload = null) {
return ['vkpay', $payload, 'pay-to-user', $user_id, $amount, $description];
}
public function buttonDonateToGroup($group_id, $payload = null) {
return ['vkpay', $payload, 'transfer-to-group', $group_id];
}
public function buttonDonateToUser($user_id, $payload = null) {
return ['vkpay', $payload, 'transfer-to-user', $user_id];
}
public function buttonApp($text, $app_id, $owner_id = null, $hash = null, $payload = null) {
return ['open_app', $payload, $text, $app_id, $owner_id, $hash];
}
public function buttonText($text, $color, $payload = null) {
return ['text', $payload, $text, $color];
}
/**
* @param array $buttons
* @param bool $inline
* @param bool $one_time
* @return array|false|string
*/
public function generateKeyboard($buttons = [], $inline = false, $one_time = False) {
$keyboard = [];
$i = 0;
foreach ($buttons as $button_str) {
$j = 0;
foreach ($button_str as $button) {
$keyboard[$i][$j]["action"]["type"] = $button[0];
if ($button[1] != null)
$keyboard[$i][$j]["action"]["payload"] = json_encode($button[1], JSON_UNESCAPED_UNICODE);
switch ($button[0]) {
case 'text': {
$color = $this->replaceColor($button[3]);
$keyboard[$i][$j]["color"] = $color;
$keyboard[$i][$j]["action"]["label"] = $button[2];
break;
}
case 'vkpay': {
$keyboard[$i][$j]["action"]["hash"] = "action={$button[2]}";
$keyboard[$i][$j]["action"]["hash"] .= ($button[3] < 0) ? "&group_id=".$button[3]*-1 : "&user_id={$button[3]}";
$keyboard[$i][$j]["action"]["hash"] .= (isset($button[4])) ? "&amount={$button[4]}" : '';
$keyboard[$i][$j]["action"]["hash"] .= (isset($button[5])) ? "&description={$button[5]}" : '';
$keyboard[$i][$j]["action"]["hash"] .= (isset($button[6])) ? "&data={$button[6]}" : '';
$keyboard[$i][$j]["action"]["hash"] .= "&aid=1";
break;
}
case 'open_app': {
$keyboard[$i][$j]["action"]["label"] = $button[2];
$keyboard[$i][$j]["action"]["app_id"] = $button[3];
if(isset($button[4]))
$keyboard[$i][$j]["action"]["owner_id"] = $button[4];
if(isset($button[5]))
$keyboard[$i][$j]["action"]["hash"] = $button[5];
break;
}
}
$j++;
}
$i++;
}
$keyboard = ["one_time" => $one_time, "buttons" => $keyboard, 'inline' => $inline];
$keyboard = json_encode($keyboard, JSON_UNESCAPED_UNICODE);
return $keyboard;
}
/**
* @param $color
* @return string
*/
private function replaceColor($color) {
switch ($color) {
case 'red':
$color = 'negative';
break;
case 'green':
$color = 'positive';
break;
case 'white':
$color = 'default';
break;
case 'blue':
$color = 'primary';
break;
}
return $color;
}
/**
* @param $group_url
* @return mixed
* @throws VkApiException
*/
public function groupInfo($group_url) {
$group_url = preg_replace("!.*?/!", '', $group_url);
return current($this->request('groups.getById', ["group_ids" => $group_url]));
}
/**
* @param $id
* @param $local_file_path
* @param array $params
* @return mixed
* @throws VkApiException
*/
public function sendImage($id, $local_file_path, $params = []) {
$upload_file = $this->uploadImage($id, $local_file_path);
return $this->request('messages.send', ['attachment' => "photo" . $upload_file[0]['owner_id'] . "_" . $upload_file[0]['id'], 'peer_id' => $id] + $params);
}
/**
* @param $id
* @param $local_file_path
* @return mixed
* @throws VkApiException
*/
private function uploadImage($id, $local_file_path) {
$upload_url = $this->getUploadServerMessages($id, 'photo')['upload_url'];
for ($i = 0; $i < $this->try_count_resend_file; ++$i) {
try {
$answer_vk = json_decode($this->sendFiles($upload_url, $local_file_path, 'photo'), true);
return $this->savePhoto($answer_vk['photo'], $answer_vk['server'], $answer_vk['hash']);
} catch (VkApiException $e) {
sleep(1);
$exception = json_decode($e->getMessage(), true);
if ($exception['error']['error_code'] != 121)
throw new VkApiException($e->getMessage(), $exception['error']['error_code']);
}
}
$answer_vk = json_decode($this->sendFiles($upload_url, $local_file_path, 'photo'), true);
return $this->savePhoto($answer_vk['photo'], $answer_vk['server'], $answer_vk['hash']);
}
/**
* @param $peer_id
* @param string $selector
* @return mixed|null
* @throws VkApiException
*/
private function getUploadServerMessages($peer_id, $selector = 'doc') {
$result = null;
if ($selector == 'doc')
$result = $this->request('docs.getMessagesUploadServer', ['type' => 'doc', 'peer_id' => $peer_id]);
else if ($selector == 'photo')
$result = $this->request('photos.getMessagesUploadServer', ['peer_id' => $peer_id]);
else if ($selector == 'audio_message')
$result = $this->request('docs.getMessagesUploadServer', ['type' => 'audio_message', 'peer_id' => $peer_id]);
return $result;
}
private function uploadVoice($id, $local_file_path) {
$upload_url = $this->getUploadServerMessages($id, 'audio_message')['upload_url'];
$answer_vk = json_decode($this->sendFiles($upload_url, $local_file_path, 'file'), true);
return $this->saveDocuments($answer_vk['file'], 'voice');
}
public function sendVoice($id, $local_file_path, $params = []) {
$upload_file = $this->uploadVoice($id, $local_file_path);
return $this->request('messages.send', ['attachment' => "doc" . $upload_file['audio_message']['owner_id'] . "_" . $upload_file['audio_message']['id'], 'peer_id' => $id] + $params);
}
/**
* @param $url
* @param $local_file_path
* @param string $type
* @return mixed
* @throws VkApiException
*/
protected function sendFiles($url, $local_file_path, $type = 'file') {
$post_fields = [
$type => new CURLFile(realpath($local_file_path))
];
for ($i = 0; $i < $this->try_count_resend_file; ++$i) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type:multipart/form-data"
]);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
$output = curl_exec($ch);
if ($output != '')
break;
else
sleep(1);
}
if ($output == '')
throw new VkApiException('Не удалось загрузить файл на сервер');
return $output;
}
/**
* @param $photo
* @param $server
* @param $hash
* @return mixed
* @throws VkApiException
*/
private function savePhoto($photo, $server, $hash) {
return $this->request('photos.saveMessagesPhoto', ['photo' => $photo, 'server' => $server, 'hash' => $hash]);
}
/**
* @param $groupID
* @param $local_file_path
* @param null $title
* @return mixed
*
* @throws VkApiException
*/
public function uploadDocsGroup($groupID, $local_file_path, $title = null) {
return $this->uploadDocs($groupID, $local_file_path, $title);
}
/**
* @param $id
* @param $local_file_path
* @param null $title
* @return mixed
* @throws VkApiException
*/
private function uploadDocs($id, $local_file_path, $title = null) {
if (!isset($title))
$title = preg_replace("!.*?/!", '', $local_file_path);
$upload_url = $this->getUploadServerPost($id)['upload_url'];
$answer_vk = json_decode($this->sendFiles($upload_url, $local_file_path), true);
$upload_file = $this->saveDocuments($answer_vk['file'], $title);
return $upload_file;
}
/**
* @param array $peer_id
* @return mixed
* @throws VkApiException
*/
private function getUploadServerPost($peer_id = []) {
if ($peer_id < 0)
$peer_id = ['group_id' => $peer_id * -1];
else
$peer_id = [];
$result = $this->request('docs.getUploadServer', $peer_id);
return $result;
}
/**
* @param $file
* @param $title
* @return mixed
* @throws VkApiException
*/
private function saveDocuments($file, $title) {
return $this->request('docs.save', ['file' => $file, 'title' => $title]);
}
/**
* @param $id
* @param $local_file_path
* @param null $title
* @param array $params
* @return bool|mixed
* @throws VkApiException
*/
public function sendDocMessage($id, $local_file_path, $title = null, $params = []) {
$upload_file = current($this->uploadDocsMessages($id, $local_file_path, $title));
if ($id != 0 and $id != '0') {
return $this->request('messages.send', ['attachment' => "doc" . $upload_file['owner_id'] . "_" . $upload_file['id'], 'peer_id' => $id] + $params);
} else {
return true;
}
}
/**
* @param $id
* @param $local_file_path
* @param null $title
* @return mixed
* @throws VkApiException
*/
private function uploadDocsMessages($id, $local_file_path, $title = null) {
if (!isset($title))
$title = preg_replace("!.*?/!", '', $local_file_path);
$upload_url = $this->getUploadServerMessages($id)['upload_url'];
$answer_vk = json_decode($this->sendFiles($upload_url, $local_file_path), true);
$upload_file = $this->saveDocuments($answer_vk['file'], $title);
return $upload_file;
}
/**
* @param $id
* @param array $message
* @param array $props
* @param array $media
* @return mixed
* @throws VkApiException
*/
public function createPost($id, $message = [], $props = [], $media = []) {
$send_attachment = [];
foreach ($media as $selector => $massive) {
switch ($selector) {
case "images":
foreach ($massive as $image) {
$upload_url = $this->getWallUploadServer($id);
for ($i = 0; $i <= $this->try_count_resend_file; ++$i) {
try {
$answer_vk = json_decode($this->sendFiles($upload_url['upload_url'], $image, 'photo'), true);
$upload_file = $this->savePhotoWall($answer_vk['photo'], $answer_vk['server'], $answer_vk['hash'], $id);
$send_attachment[] = "photo" . $upload_file[0]['owner_id'] . "_" . $upload_file[0]['id'];
break;
} catch (VkApiException $e) {
if ($i == $this->try_count_resend_file)
throw new VkApiException($e->getMessage(), $e->getCode());
sleep(1);
$exception = json_decode($e->getMessage(), true);
if ($exception['error']['error_code'] != 121)
throw new VkApiException($e->getMessage(), $e->getCode());
}
}
}
break;
case "docs":
foreach ($massive as $docs) {
$upload_file = $this->uploadDocsUser($docs);
if (isset($upload_file['type']))
$upload_file = $upload_file[$upload_file['type']];
else
$upload_file = current($upload_file);
$send_attachment[] = "doc" . $upload_file['owner_id'] . "_" . $upload_file['id'];
}
break;
case "other":
break;
}
}
if (count($send_attachment) != 0)
$send_attachment = ["attachment" => join(',', $send_attachment)];
if (is_string($message))
$message = ['message' => $message];
return $this->request('wall.post', ['owner_id' => $id] + $message + $props + $send_attachment);
}
/**
* @param $owner_id , $post_id, $message
* @param $post_id
* @param $message
* @return mixed
* @throws VkApiException
*/
public function sendWallComment($owner_id, $post_id, $message) {
return $this->request('wall.createComment', ['owner_id' => $owner_id, 'post_id' => $post_id, 'message' => $message]);
}
/**
* @param $id
* @return mixed
* @throws VkApiException
*/
private function getWallUploadServer($id) {
if ($id < 0) {
$id *= -1;
return $this->request('photos.getWallUploadServer', ['group_id' => $id]);
} else {
return $this->request('photos.getWallUploadServer', ['user_id' => $id]);
}
}
/**
* @param $photo
* @param $server
* @param $hash
* @param $id
* @return mixed
* @throws VkApiException
*/
private function savePhotoWall($photo, $server, $hash, $id) {
if ($id < 0) {
$id *= -1;
return $this->request('photos.saveWallPhoto', ['photo' => $photo, 'server' => $server, 'hash' => $hash, 'group_id' => $id]);
} else {
return $this->request('photos.saveWallPhoto', ['photo' => $photo, 'server' => $server, 'hash' => $hash, 'user_id' => $id]);
}
}
/**
* @param $local_file_path
* @param null $title
* @return mixed
*
* @throws VkApiException
*/
public function uploadDocsUser($local_file_path, $title = null) {
return $this->uploadDocs([], $local_file_path, $title);
}
/**
* @param $id
* @param array $message
* @param array $props
* @param array $media
* @param array $keyboard
* @return mixed
* @throws VkApiException
*/
public function createMessages($id, $message = [], $props = [], $media = [], $keyboard = []) {
if ($id < 1)
return 0;
$send_attachment = [];
foreach ($media as $selector => $massiv) {
switch ($selector) {
case "images":
foreach ($massiv as $image) {
$upload_file = $upload_file = $this->uploadImage($id, $image);
$send_attachment[] = "photo" . $upload_file[0]['owner_id'] . "_" . $upload_file[0]['id'];
}
break;
case "docs":
foreach ($massiv as $document) {
$upload_file = $this->uploadDocsMessages($id, $document['path'], $document['title']);
if (isset($upload_file['type']))
$upload_file = $upload_file[$upload_file['type']];
else
$upload_file = current($upload_file);
$send_attachment[] = "doc" . $upload_file['owner_id'] . "_" . $upload_file['id'];
}
break;
case "voice":
foreach ($massiv as $voice) {
$upload_file = $this->uploadVoice($id, $voice);
$send_attachment[] = "doc" . $upload_file['audio_message']['owner_id'] . "_" . $upload_file['audio_message']['id'];
}
break;
case "other":
break;
}
}
if (count($send_attachment) != 0)
$send_attachment = ["attachment" => join(',', $send_attachment)];
if (is_string($message))
$message = ['message' => $message];
if ($keyboard != [])
$keyboard = ['keyboard' => $this->generateKeyboard($keyboard['keyboard'], $keyboard['inline'], $keyboard['one_time'])];
return $this->request('messages.send', ['peer_id' => $id] + $message + $props + $send_attachment + $keyboard);
}
/**
* @param array $id
* @param int $extended
* @param array $props
* @return mixed
* @throws VkApiException
*/
public function getGroupsUser($id = [], $extended = 1, $props = []) {
if (is_numeric($id))
$id = ['user_id' => $id];
if (!is_array($props))
$props = [];
if ($extended == 1)
$extended = ['extended' => 1];
else
$extended = [];
return $this->request('groups.get', $id + $props + $extended);
}
/**
* @param $var
* @throws VkApiException
*/
public function setTryCountResendFile($var) {
if (is_integer($var))
$this->try_count_resend_file = $var;
else
throw new VkApiException("Параметр должен быть числовым");
}
/**
* @param $var
* @throws VkApiException
*/
public function setRequestIgnoreError($var) {
if (is_array($var))
$this->request_ignore_error = $var;
else if (is_integer($var))
$this->request_ignore_error = [$var];
else
throw new VkApiException("Параметр должен быть числовым либо массивом");
}
/**
* @param $id
* @return mixed
*/
public function dateRegistration($id) {
$site = file_get_contents("https://vk.com/foaf.php?id={$id}");
preg_match('<ya:created dc:date="(.*?)">', $site, $data);
$data = explode('T', $data[1]);
$date = date("d.m.Y", strtotime($data[0]));
$time = mb_substr($data[1], 0, 8);
return "$time $date";
}
/**
* @return array
*/
protected function copyAllDataclass() {
return [$this->token, $this->version, $this->auth, $this->request_ignore_error, $this->try_count_resend_file];
}
/**
* @param $id_vk_vars
*/
protected function setAllDataclass($id_vk_vars) {
list($this->token, $this->version, $this->auth, $this->request_ignore_error, $this->try_count_resend_file) = $id_vk_vars;
}
}