ФорумПрограммированиеПыхнуть хотите?Готовые решения → Постинг на стенку групп/пабликов вконтакте (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 уродлив

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