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

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

  • Ivan

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

    Spritz 29 апреля 2012 г. 10: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 &quot;<!doctype html><html><head><meta charset=&#39;utf-8&#39;></head>
    <body><a href=&#39;http://api.vkontakte.ru/oauth/authorize?&quot; .
    &quot;client_id={$this->appId}&amp;scope=offline,wall,groups,pages,&quot; .
    &quot;photos,docs,audio,video,notes,stats,messages,notify,notifications,nohttps&amp;amp;&quot; .
    &quot;redirect_uri=http://api.vkontakte.ru/blank.html&amp;amp;response_type=code&#39;
    target=&#39;_blank&#39;>Получить CODE</a><br>Ссылка для получения токена:<br>
    <b>https://api.vkontakte.ru/oauth/access_token?client_id={$this->appId}&quot; .
    &quot;&amp;amp;client_secret={$this->secretKey}&amp;amp;code=CODE</b></body></html>&quot;;

    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 = &quot;/method/$method?$parameters&amp;access_token={$this->accessToken}&quot;;
    $querySig = md5($queryString . $this->accessSecret);
    return json_decode(file_get_contents(
    &quot;http://api.vk.com{$queryString}&amp;sig=$querySig&quot;
    ));
    }

    /**
    * @param string $message
    * @param bool $fromGroup
    * @param bool $signed
    * @return mixed
    */
    public function wallPostMsg($message, $fromGroup = true, $signed = false)
    {
    return $this->callMethod(&#39;wall.post&#39;, array(
    &#39;owner_id&#39; => -1 * $this->groupId,
    &#39;message&#39; => $message,
    &#39;from_group&#39; => $fromGroup ? 1 : 0,
    &#39;signed&#39; => $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(&#39;wall.post&#39;, array(
    &#39;owner_id&#39; => -1 * $this->groupId,
    &#39;attachment&#39; => strval($attachment),
    &#39;message&#39; => $message,
    &#39;from_group&#39; => $fromGroup ? 1 : 0,
    &#39;signed&#39; => $signed ? 1 : 0,
    ));
    }

    /**
    * @param string $file relative file path
    * @return mixed
    */
    public function createPhotoAttachment($file)
    {
    $result = $this->callMethod(&#39;photos.getWallUploadServer&#39;, array(
    &#39;gid&#39; => $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(
    &#39;photo&#39; => &#39;@&#39; . getcwd() . &#39;/&#39; . $file
    ));

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

    curl_close($ch);
    $upload = json_decode($upload);
    $result = $this->callMethod(&#39;photos.saveWallPhoto&#39;, array(
    &#39;server&#39; => $upload->server,
    &#39;photo&#39; => $upload->photo,
    &#39;hash&#39; => $upload->hash,
    &#39;gid&#39; => $this->groupId,
    ));

    return $result->response[0]->id;
    }

    public function combineAttachments()
    {
    $result = &#39;&#39;;
    if (func_num_args() == 0) return &#39;&#39;;
    foreach (func_get_args() as $arg) {
    $result .= strval($arg) . &#39;,&#39;;
    }
    return substr($result, 0, strlen($result) - 1);
    }
    }


    Порядок установки:
    1. Мы должны быть администратором группы и знать у нее groupId
    2. Создаём приложение типа standalone-application и берем из него appId и secretKey
    3. Теперь самое интересное - чтобы постить на стенку, у нас должны быть супер права, а для их получения придется сделать небольшой фокус, для этого создадим скрипт:
    <?php
    require_once &#39;VKPublic.php&#39;;
    $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, &#39;ololol&#39;);
    $public->setAccessData(&#39;hasydc8ashdc89sahdc89hsay8dch9syd89hcy89sahdyc89hasd9c&#39;, &#39;2643617874e5484c3c&#39;);

    $attachments = $public->combineAttachments(
    $public->createPhotoAttachment(&#39;favicon.png&#39;),
    &#39;http://pyha.ru/forum/&#39;
    );

    $public->wallPostAttachment($attachments, &#39;hello world&#39;);


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

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

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

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

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

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

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

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

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

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

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

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

    &quot;redirect_uri is undefined.&quot; как бы намекает
  • Messiah

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

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

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

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

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

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

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

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

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

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

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

    в этом месте:

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

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

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

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

    &quot;&lt;url> malformed&quot; - url уродлив

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