ФорумПрограммированиеПыхнуть хотите?Готовые решения → Постинг на стенку групп/пабликов вконтакте (php)

Постинг на стенку групп/пабликов вконтакте (php)

  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 29 апреля 2012 г. 18:51

    Небольшая наработка, вдруг кому пригодится, тут конечно надо допиливать чтобы ошибками ругалось, но в принципе всё работает и протеститровано

    Исходный окд:
    <?php
    class VKPublic
    {
        protected $groupId, $appId, $secretKey, $accessToken, $accessSecret;
    
        /**
         * @param int $groupId
         * @param int $appId
         * @param string $secretKey
         */
        public function __construct($groupId, $appId, $secretKey)
        {
            $this->groupId = $groupId;
            $this->appId = $appId;
            $this->secretKey = $secretKey;
        }
    
        /**
         * @param string $accessToken
         * @param string $accessSecret
         */
        public function setAccessData($accessToken, $accessSecret)
        {
            $this->accessToken = $accessToken;
            $this->accessSecret = $accessSecret;
        }
    
        /**
         * Hack
         */
        public function getAccessData()
        {
            echo "<!doctype html><html><head><meta charset='utf-8'></head>
                <body><a href='http://api.vkontakte.ru/oauth/authorize?" .
                "client_id={$this->appId}&scope=offline,wall,groups,pages," .
                "photos,docs,audio,video,notes,stats,messages,notify,notifications,nohttps&amp;" .
                "redirect_uri=http://api.vkontakte.ru/blank.html&amp;response_type=code'
                    target='_blank'>Получить CODE</a><br>Ссылка для получения токена:<br>
                    <b>https://api.vkontakte.ru/oauth/access_token?client_id={$this->appId}" .
                "&amp;client_secret={$this->secretKey}&amp;code=CODE</b></body></html>";
    
            exit;
        }
    
        /**
         * @param string $method
         * @param mixed $parameters
         * @return mixed
         */
        public function callMethod($method, $parameters)
        {
            if (!$this->accessToken) return false;
            if (is_array($parameters)) $parameters = http_build_query($parameters);
            $queryString = "/method/$method?$parameters&access_token={$this->accessToken}";
            $querySig = md5($queryString . $this->accessSecret);
            return json_decode(file_get_contents(
                "http://api.vk.com{$queryString}&sig=$querySig"
            ));
        }
    
        /**
         * @param string $message
         * @param bool $fromGroup
         * @param bool $signed
         * @return mixed
         */
        public function wallPostMsg($message, $fromGroup = true, $signed = false)
        {
            return $this->callMethod('wall.post', array(
                'owner_id' => -1 * $this->groupId,
                'message' => $message,
                'from_group' => $fromGroup ? 1 : 0,
                'signed' => $signed ? 1 : 0,
            ));
        }
    
        /**
         * @param string $attachment
         * @param null|string $message
         * @param bool $fromGroup
         * @param bool $signed
         * @return mixed
         */
        public function wallPostAttachment($attachment, $message = null, $fromGroup = true, $signed = false)
        {
            return $this->callMethod('wall.post', array(
                'owner_id' => -1 * $this->groupId,
                'attachment' => strval($attachment),
                'message' => $message,
                'from_group' => $fromGroup ? 1 : 0,
                'signed' => $signed ? 1 : 0,
            ));
        }
    
        /**
         * @param string $file relative file path
         * @return mixed
         */
        public function createPhotoAttachment($file)
        {
            $result = $this->callMethod('photos.getWallUploadServer', array(
                'gid' => $this->groupId
            ));
    
            $ch = curl_init($result->response->upload_url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, array(
                'photo' => '@' . getcwd() . '/' . $file
            ));
    
            if (($upload = curl_exec($ch)) === false) {
                throw new Exception(curl_error($ch));
            }
    
            curl_close($ch);
            $upload = json_decode($upload);
            $result = $this->callMethod('photos.saveWallPhoto', array(
                'server' => $upload->server,
                'photo' => $upload->photo,
                'hash' => $upload->hash,
                'gid' => $this->groupId,
            ));
    
            return $result->response[0]->id;
        }
    
        public function combineAttachments()
        {
            $result = '';
            if (func_num_args() == 0) return '';
            foreach (func_get_args() as $arg) {
                $result .= strval($arg) . ',';
            }
            return substr($result, 0, strlen($result) - 1);
        }
    }


    Порядок установки:
    1. Мы должны быть администратором группы и знать у нее groupId
    2. Создаём приложение типа standalone-application и берем из него appId и secretKey
    3. Теперь самое интересное - чтобы постить на стенку, у нас должны быть супер права, а для их получения придется сделать небольшой фокус, для этого создадим скрипт:
    <?php
    require_once 'VKPublic.php';
    $public = new VKPublic(GROUP_ID, APP_ID, SECRET);
    $public->getAccessData();


    И запустим его в браузере. Там будет ссылка, открываем её, разрешаем полный доступ, и не закрываем страничку, а берем из URL code=КОД. Этот код вставляем в ссылку, которая будет на нашей хак-страничке и переходим по ссылке из браузера. Видим access_token и secret. Чтобы два секрета между собой не путать, один я называю secretKey а второй accessSecret.
    4. Теперь класс можно использовать. После инициализации выполняем метод setAccessData(ACCESS_TOKEN, ACCESS_SECRET);

    Пример использования:

    $public = new VKPublic(123, 456, 'ololol');
    $public->setAccessData('hasydc8ashdc89sahdc89hsay8dch9syd89hcy89sahdyc89hasd9c', '2643617874e5484c3c');
    
    $attachments = $public->combineAttachments(
        $public->createPhotoAttachment('favicon.png'),
        'http://pyha.ru/forum/'
    );
    
    $public->wallPostAttachment($attachments, 'hello world');


    accessToken и accessSecret - бесконечные, а получить их нужно всего один раз, и дальше использовать в своё удовольствие
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz 29 апреля 2012 г. 19:13, спустя 22 минуты 39 секунд

    пригодится. в избранное
    ιιlllιlllι унц-унц
  • djeyx

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 24 мая 2012 г. 1:02, спустя 24 дня 5 часов 48 минут

    помоги обработать капчу :)
  • Ann

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 11 сентября 2012 г. 10:52, спустя 110 дней 9 часов 50 минут

    при попытке получить токен, получаю вот такое сообщение:
    Спустя 18 сек.
    при попытке получить токен, получаю вот такое сообщение:
    {"error":"invalid_grant","error_description":"redirect_uri is undefined."}
  • Troy

    Сообщения: 2532 Репутация: N Группа: Джедаи

    Spritz 11 сентября 2012 г. 12:54, спустя 2 часа 1 минуту 39 секунд

    "redirect_uri is undefined." как бы намекает
  • Messiah

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 2 ноября 2012 г. 1:26, спустя 51 день 12 часов 32 минуты

    Есть вопрос. Создал standalone, получил ключ. Делаю getAccessData().
    В исходном вариантк получаю ошибку standalone applications should use blank.html as redirect_uri to access messages
    исправляю в коде http://api.vkontakte.ru/blank.html&response_type=code на blank.html - заработало. Иду дальше - авторизация успешна, получил код, вставил в ссылку, получаю redirect_uri is invalid, please pass same redirect_uri, you used in authorize method. причем независимо от того, передаю ли я его в параметрах или нет, и независимо от того совпадает он с тем же blank.html или нет.
    Как исправить?
  • nekobog

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 21 декабря 2012 г. 23:24, спустя 49 дней 21 час 58 минут

    поставь вместо
     blank.html -> https://oauth.vk.com/blank.html

    соответственно ссылка будет вида
    https://oauth.vk.com/access_token?client_id={$this->appId}&amp;client_secret={$this->secretKey}&amp;code=CODE&amp;redirect_uri=https://oauth.vk.com/blank.html
  • nojek

    Сообщения: 1 Репутация: N Группа: Кто попало

    Spritz 3 февраля 2013 г. 13:24, спустя 43 дня 14 часов

    Решение отличное. Пытаюсь его использовать.
    Но получаю вот такую ошибку:

    Fatal error: Uncaught exception 'Exception' with message '<url> malformed' in /ххххххххххх/VKPublic.php:115 Stack trace: #0 /ххххххххххххх/post.php(5): VKPublic->createPhotoAttachment('511.jpg') #1 {main} thrown in /ххххххххххх/VKPublic.php on line 115

    в этом месте:

    if (($upload = curl_exec($ch)) === false) {
    throw new Exception(curl_error($ch));
    }

    Прошу помощи в решении проблемы.
  • truth4oll

    Сообщения: 463 Репутация: N Группа: Адекваты

    Spritz 4 февраля 2013 г. 11:05, спустя 21 час 40 минут 56 секунд

    "<url> malformed" - url уродлив

Пожалуйста, авторизуйтесь, чтобы написать комментарий!