...
Just my blog

Blog about everything, mostly about tech stuff I made. Here is the list of stuff I'm using at my blog. Feel free to ask me about implementations.

Soft I recommend
Py lib I recommend

I'm using these libraries so you can ask me about them.

vk execute

https://vk.com/dev/execute py_vk Продолжаю линейку ознакомительных постов на тему "в мире эльфийских языков программирования" или "говнокод - как стиль жизни". Был вот такой вот пост, который вроде как-бы объяснял как сделать execute при помощи javascript и все такое: http://habrahabr.ru/post/248725/ но язык, которым была написана статья - выглядит настолько эльфийским, я уже не говорю про сраную разметку, которая съехала набикрень просто, как и моя голова, с несозревшими пайтоновскими правилами отступов тоже съехала. Так вот, пытаясь разобраться в этих письменах и отделить зерна от плевел, чтобы наконец понять, как работает этот долбанный vk execute мне пришлось убрать весь говнокод, чтобы найти чистый vk execute, также используя хорошую, но не очевидную, документацию ВК по ссылке выше, я смог родить то, чего пока, мне кажется, никто не родил: Простой и понятный пример того, как работает этот, ослицу его мать, vk execute. Вот очень простой пример while:

var a = 1;
var b = 10;
while (b != 0)
    { b = b - 1; a = a+1; };
    return a;
  • ну или он же, но ближе к теме моей задачи:
var comments_cnt = 700;
var offset_comments = 0;
while (offset_comments <= comments_cnt){offset_comments = offset_comments + 101;};
return offset_comments;

Задача следующая:

  • необходимо получить кол-во комментариев под конкретным постом на стене ВК, за один проход апи выдает только 100 комментариев, как забрать все комментарии до последнего, если в посте комментариев > 100?

Простым путем это решается в python через while - как я и поступил:

  • получил первых 100 комментариев в массиве[1] и счетчик общего кол-ва комментариев в массиве[0],
  • после чего, первую партию из 100 комментов (от 1-го до 100-го )зарядил в список,
  • создал счетчик offset + 101  чтобы забрать следующую сотню (от 101-го до 202-го),
  • создал переменную со значением (из массив[0]) кол-ва комментариев,
  • создал while счетчик меньше кол-ва комментариев:
    • выполнить запрос еще раз, прибавить к счетчику +101

Но этот вариант имеет одно крайне неприятное последствие - нужно ставить его на паузу каждую итерацию, так как ВК не позволяет выполнять более 3 одинаковых запросов в сек. Возникает вопрос, как это обойти? ВК дает ответ - "выполняй запрос на сервер с помощью моего "скриптового языка" и я сам посчитаю сколько тебе надо чего-либо" - то есть vk execute - позволяет выполнить тот самый while но на своей стороне и за один запрос, фактически. По результатам просто возвращает массив-массивов или список элементов. Мне понадобилось несколько нервных часов, для того чтобы разобраться в том эльфийском javascript и наконец вычленить из него что-то вменяемое чтобы сделать свой красивый питонистый запрос. Я вам его покажу как есть, и так, как бы я был рад, чтобы его кто-то объяснил мне несколько часов назад:

  • все последующее передается сюда, не забываем:
r = requests.post('https://api.vk.com/method/execute?access_token='+token+'&code=<CODE>')
  • логика vk execute <CODE>
var comments = API.wall.getComments(
                                    {"owner_id":"<PAGE_ID>",
                                    "post_id":"<POST_ID>",
                                    "need_likes":"1",
                                    "offset":"0",
                                    "count":"100",
                                    "sort":"asc",
                                    "preview_length":"1",
                                    "extended":"0",
                                    "count":"100",
                                    "v":"5.27"});
var comments_cnt = comments.count;
comments = comments.items;
var offset_comments = 100;
while (offset_comments < comments_cnt)
{comments = comments + API.wall.getComments(
                                            {"owner_id":"<PAGE_ID>",
                                            "post_id":"<POST_ID>",
                                            "need_likes":"1",
                                            "offset":(offset_comments),
                                            "count":"100",
                                            "sort":"asc",
                                            "preview_length":"1",
                                            "extended":"0",
                                            "count":"100",
                                            "v":"5.27"}).items;
offset_comments = offset_comments + 100;};
return comments;

  В общем, я понимаю, что каждый говнокодит как может, но ей богу, ребята, если вы освоили говнокод, как и я собственно, то освойте и написание мануалов так, чтобы другим был понятен ваш эльфийский. Надеюсь моя статья проиндексируется и спасет много нервов тем, кто пойдет по моему пути. Обратите внимание, сам vk execute код порой нужно конвертить отдельно, так как при передаче спец-символы слетают и вк возвращает ошибку. Это касается HTTP. http://meyerweb.com/eric/tools/dencoder/