Pull to refresh

Comments 43

UFO just landed and posted this here
Ох. Неожидал вас увидеть в своем топике :)
Спасибо, за такой подробный комментарий.
Код в статье был для примера, если кому-то нужно — он исправит его под себя. Я не стал оформлять все по стандартам, с документацией, потому что для примера это не нужно. Важно увидеть как оно работает.
> Выполняем метод авторизации:
> Vkapi::factory()->auth();
Нет, технически не синглтон. Но класс, имеющий только приватные поля, которые не изменяются — по духу и поведению настоящий синглтон.
У синглона вполне могут меняться поля.
Если у класса может быть лишь один экземпляр в приложении — вот его дух :)
> У синглона вполне могут меняться поля.
А я наверное сказал, что не могут?
А я сказал, что вы сказали, что не могут?
Какой вы зануда.
И? Синглтон гарантирует что у класса будет только один экземпляр, доступный из любого места приложения. Код, который вы процитировали, всегда будет возвращать новый объект класса Vkapi. Где синглтон то? Я бы еще мог предположить что этим кодом реализуется синглтон, если бы увидел Vkapi::instance();, пока не заглянул бы в этот метод.

Еще не совсем понимаю зачем автор попытался изобразить factory. factory method все равно не получился (да он тут и не нужен), а в заблуждение ввести может.

И конструкции типа Vkapi::factory()->auth(); я бы поостерегся использовать, есть вероятность словить unexpected T_PAAMAYIM_NEKUDOTAYIM, зато
$vk = Vkapi::factory();
$vk->auth();

будет работать везде.
Ааа, попутал насчет T_PAAMAYIM_NEKUDOTAYIM. Ну да ладно.
Правильно я понимаю, что это годится только для «себя, любимого»? То есть токен связан с конкретным user_id?
Да, именно так. В этом и была начальная задача. Можно изменить код под многопользовательскую работу.
Зачем выкладывать на хабр такие вот, сделанные только под «себя», неконфигурируемые, недопиленные для общего использования вещи?
Какой вообще в этом смысл?
Была задача использовать api исключительно на стороне сервера. С одного пользователя. Посмотрите предыдущий топик на эту тему.
Затем, что аудитория хабра — это не одни гики и кармадрочеры. Есть еще так называемый «средний слой», состоящий из людей вроде меня, которые что-то могут, но им нужна простая и понятная инструкция, а не наброски под общим заголовком «кто знает, тот разберется, а остальным не надо». Я по этой инструкции решил для себя вопрос публикации статей вконтакте из Жумлы, чего не смог сделать по другим, таким «допиленным» и «высококонфигурируемым».

Вот уж что, а допилить я смогу и сам. Мне с нуля сложно разобраться, как и многим. Так что, не стоит по себе, такому умному и «допиленному», мерять всех.
Тут вопрос скорее в том, что вы этот же вопрос могли решить парой-тройкой строк кода и этот код выглядел бы куда как понятнее и нагляднее.
А тут получается ООП ради ООП и паттерны (вернее попытка их имитации) ради паттернов.

А насчет надо ли оно на хабре… ну не знаю. Судя по тому, что топик добавляют в избранное — наверное надо. Но тогда и реализация не должна быть такой хромой.
Я не вижу ничего непонятного в этом коде. Он короткий, и я даже не знаю, что в нем можно сократить. По крайней мере, по этому коду я понял, что к чему, а кроме него тут только весьма громоздкий и шаткий пример с курлом, да задротское объяснение из вышеупомянутой категории «для тех, кто понимает».

Суть, повторюсь, в том, чтобы стало понятно. Дальше если есть мозги и желание — человек сам доделает, нет мозгов — ну, будет ждать готового решения, на что тоже имеет право. Так что, повторюсь, из всех имеющихся примеров этот пока наиболее просто и понятен. Можете сделать еще проще и понятнее унд избавить от необходимости получать токен через браузер — буду вам весьма признателен. Необходимость получения токена — единственное, что грустит слегка.
Токен получать придется в любом случае, но в вашей ситуации это разовая операция.
А для публикации достаточно:
$data = array(
        'owner_id'        => ид_юзера,
        'message'        => 'сообщение',
        'from_group'    => 1,
        'access_token' => 'токен',
    );
$content = file_get_contents('https://api.vkontakte.ru/method/wall.post?'.http_build_query($data));
Токен я давно уже получил, не в этом проблема совершенно. Я просто пишу плагин для кроспосстинга статей из жумлы, и не очень понимаю, как реализовать вот такое получение токена. Плагин я потом выложу в репозиторий жумлы, и писать в инструкции, мол, запустите ручками плагин таким-то образом, чтобы получить токен — это моветон. Вот потому и хочется этот момент реализовать более человечно.
Выглядит красиво, но на деле выдает ошибку «User authorization failed: method is unavailable with server auth». Пишут, что с сервера такие запросы не обрабатываются — только со стороны клиента. Уберглупо, конечно.
Тогда только с разрешением юзера.
Ну да, других вариантов нет, получается. То есть в «тихом» режиме никак не реализовать.
>писать в инструкции, мол, запустите ручками плагин таким-то образом, чтобы получить токен — это моветон.

При использовании сторонних сервисов типа Google Analytics, AdSense, Akismet, Loginza(?), FB, VK и т. п. — это не моветон, а норма написать «зайдите на сайт по этой ссылке и получите такой-то ключ/id, который введите в это поле», а то и вообще «в строчку такую-то файла такого-то». Альтернатива сообщить плагину свой логин и пароль, чтобы он сам сделал запрос и распарсил результат, очень небезопасна — может плагин ещё сделает этот запрос на coolhacker.example.com.
Ну, я в теории понимаю, что это с токи зрения безопасности правильно, но в плане удобстве — далеко не супер. В общем, реализовал это дело через колорбокс — вроде работает.
И я о том же, Vk::factory() выглядит вообще абсурдно, оно понятно если Vk::getInstance(), чтобы не вызывать auth каждый раз, нам нужен один экземпляр.
Для того, что бы не использовать new и писать в одну строчку. В 5.4 это можно будет заменить через (new Vkapi)->auth();
У factory method есть своя область применения и свои цели. Он оперирует подклассами.
В данном случае он называется factory, а фабрикой не является. Зачем?

$api = Vkapi::init();
$api->auth();
$api->wall_post($message);
Согласен, как-то не подумал. Заменил на статические функции. По сути объект не меняется, а класс служит лишь оберткой для обычных функций, с хранением параметров авторизации.
Код скриншотами… У хабра ведь есть прекраснейший тег <source lang=''..">
Все работает, спасибо. Только не нашел, как решить проблему со ссылками. Добавил к массиву переменную 'attachment', подсунул ей адрес сайта, так вместо красивой ссылки, как у новостей в той же группе хабра, он подсовывает еще и картинку с описанием. Как это убрать в данном случае — ума не приложу. Все это можно получить по методу wall.getById, но что потом с этим делать — неизвестно. Там есть переменная noparse, но она используется, когда делишься ссылками. Вот бы что-то подобное подсовывать и тут, потому что ну совсем не нужны эти описалова с картинками в данном случае. Ну, мне не нужны, скажем так :-)
UFO just landed and posted this here
Если запрашивать с офлайн-доступом, то не временный. Я говорил об этом в статье.
Это работает только для приложений, которые юзер должен эксплицитно установить. Для «сайтов» оповещения, стена и прочие методы, изменяющие данные, не работают. Поправьте меня, если это не так. Я пробовал неделю назад, но, может быть, не очень дотошно.
В статье описан совершенно другой случай. Вы — сам себе единственный юзер, которому нужно выполнять на сервере запросы к апи.
Понятно. Просто называется «автоматическое оповещение читателей...», называть себя-самого-себе-единственного-юзера «читателями» как-то странно.
Скрипт отправляет новости на публичную страницу или группу в контакте, на которую могут быть подписаны любое количество читателей.
Надо, наверное, классы и примеры обновить исходя из того что домен уже сменили на vk.com
Написали уже что-нибудь подобное для wordpress?
Автор, возможно, я где-то это упустил в ваших постах, но почему вы решили не пользоваться стандартным php-классом ВКонтакте? vk.com/page-1_2369497 — внизу ссылка на архив APIServerPHPClass.zip.
Потому что тот класс отправляет запросы на api.vk.com/api.php, и соответственно там нужен весь этот расчет подписей, секретных кодов и т.д. А я использую более простое выполнение запросов, через api.vk.com/method/, подробнее в документации. Нужен только access_token.
Sign up to leave a comment.

Articles