...
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.

I'm WORDPRESS I've made REST look at me!

Thanks, for UTF-8 support!

title=\"\u041d\u0430\u0436\u043c\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438 \u043d\u0430 Pinterest\">

Read...

python script as centos service

Task completed!py_vk I made a vkontakte Bot which delete all comments are not from group members! But I do not want to run it by cron, because it will SPAM all my system with cron emails. But I found resolution:

  • make a worker.py
  • allow worker to run delete scripts on time periods
  • add worker as centos service
  • have fun!

Maybe later I'll add more code, but now just for example I'll show only worker and bash script:

#!/usr/local/bin/python3
# coding=utf-8

from time import strftime, sleep
import schedule
from vk_del_comments import *
from vk_del_comments_older import *
import os

pid = os.getpid()
op = open("/var/us.pid","w")
op.write("%s" % pid)
op.close()

token = ''
tk_owner_id = "-000000000"
tk_group_id = "000000000"
tk_domain = "group_domain"

curr_date = strftime("%d-%m-%Y - %H:%M:%S")
logFile = 'comments_deleter_log.txt'

# print("Start Comments Bot Worker!")

def del_comments_30_sec():
    del_comments_regular(logFile, token, tk_owner_id, tk_group_id, tk_domain)

def del_comments_5_min():
    delete_comments_older(logFile, token, tk_owner_id, tk_group_id, tk_domain)


# schedule.every(30).seconds.do(del_regular_comments_19)
schedule.every(30).seconds.do(del_comments_30_sec)
schedule.every(5).minutes.do(del_comments_5_min)

while …

Read...

How tired I am of Google way how get API tokens

Google APIYou must:

  1. Create application and take its id and secret.
  2. Make a GET request to send secret and id with needed scopes of access.
  3. Obtain TEMPORARY access token and refresh token (first lives about 3000 - 5000 sec, the second can probably live infinite)
  4. Use this access token to GET something through REST, check if this token is not expires already.
  5. You want to GET something ELSE? First check if your token is not expired, then if expired - use refresh token to get NEW TEMPORARY token.
  6. Do something else.

Nice turn google! You are the best of masters of creating shitcode. Before starting real work on google API and my own project with Google Drive I'll learn pythons "requests" perfectly, first! Thanks google you will make me smarter! Example of shitcode which is needed to get the token first, then check if it is not expired and then request NEW …

Read...

Ну здравствуй, Google Drive API

Ну здравствуй, Google API! Всего каких-от пару месяцев назад, я бы никуй не понял, в этом эльфийском коде. А теперь посмотрите на меня! Я все равно почти ничего не понимаю, но уже умею им пользоваться! Google API В самом начале, на пути создания няшного приложения под гугл-диск.

Read...

Порядочек в тасках

Так выглядит условный порядок в моих тасках на редмайне, сохраню его, чтобы не потерять. Dev_redmine

Read...

Better, then best vk execute and python part. 2

Крайняя степень эффективности.py_vk Теперь скрипт не парсит данные, их парсит сам ВК и возвращает мне лишь списки: айди, комменты, репосты и т.п. Для каждого набора свой список - длина списков всегда одинакова. Дело в том, что ВК не позволяет производить более 24-х итераций за раз в vk execute, поэтому, прежде чем отправить списки постов, я дроблю их на группы по 20. Мало того, благодаря вот этому вкраплению: https://toster.ru/q/234399 я теперь могу производить сбор постов по 100 штук по 20 раз за итерацию в Python, то есть на стороне ВК происходит 20 итераций по 100 постов за одну итерацию в python Далее списки zipаются в один большой список списков по 2000 элементов в каждом. Based on: http://www.trianglesis.org.ua/python-i-vk-execute-40-tysyach-postov-za-3-minuty Время выполнения сократилось почти в два раза! 40 тысяч элементов за полторы минуты! Уже даже не знаю, можно ли быстрее или потолок в высшей степени проходимости сети.

Bot has started it's work …

Read...

Python и vk execute = 40 тысяч постов за 3 минуты!

Да, сучка, это Python и vk execute!py_vk Собрать 39000 постов за 3 минуты! Закончил очередную партию парсеров, теперь этот парсер умеет делать сбор постов несколько быстрее, чем раньше. В прошлый раз, одними только силами Python while - мне удалось спарсить стену с 39 тысячами постов минимум за 15-20 минут, при этом с вероятностью в 50% поймать timeout error и запускать все заново или дробить сбор постов по дате или кол-ву. Вуаля, упорство и немного логики:

Get posts from wall from VK wall.get
Posts present: 39143| Runs: 20| Iters: 20| Offset of posts is: 2000
Posts present: 39143| Runs: 20| Iters: 20| Offset of posts is: 4000
Posts present: 39143| Runs: 20| Iters: 20| Offset of posts is: 6000
Posts present: 39143| Runs: 20| Iters: 20| Offset of posts is: 8000
Posts present: 39143| Runs: 20| Iters: 20| Offset of posts is: 10000
Posts present: 39143| Runs: 20| Iters: 20| …

Read...

vk execute VS python while

Итак, финишная прамая на сегодня:py_vk

  • скрипт на Python, получающий комментарии из 57 постов за последних 7 дней
  • скрипт Python, отправляющий аргументы для vk execute порциями по 24 поста за раз со sleep(1) - во избежание флуда

Дано 57 постов и 797 комментариев под ними.

Старый вариант:

  • достается список элементов из таблицы БД где дата элемента между сегодня и -7 дней
  • для каждого изъятого из таблицы элемента с index[0] производится забор комментариев
    • если  index[1] - значение содержит число > 100 - значит в посте больше 100 комментов (ВК не отдает более 100 коментов за один запрос) то запустить while и счетчик, до тех пор, пока индекс итераций(offset_comments) не достигнет числа равному кол-ву комментов(post_com);
all_post_comments = []
for item in post_id_comm_list:
    post_id = item[0]
    post_com = int(item[1])
    if post_com > 100:
        offset_comments = 0                                     # Start value always = 0
        while offset_comments < post_com:                       # Until post comments count …

Read...

vk execute - parse array or posts and get comments of each

vk executepy_vk

Родил, наконец-то, следующее детище Франкенштейна:

Этот скрипт позволяет форматировать первый аргумент - строку-список с post_id типа "53288,53303,53306,53288," (обязательно с запятой вконце, чтобы ометить конец строки) - в понятный для vk execute - array - список айди постов, и потом, до тех пор, пока длина этого списка не будет равна 0 - он будет получать комментарии с каждого элемента этого списка и сохранять их в переменной all_comments и в свою очередь, если кол-во комментов под постов больше 100 - запускать второй while до тех пор, пока счетчик comments_cnt(сколько комментов в посте) не сравняется со счетчиком offset_comments(на сколько сдвигать выборку). Результат обработки 4-х постов с комментами (305, 13, 5, 6): = 329 комментариев

var myList = Args.post_id_array_str;
var listSeparator = ",";
var listItemsType = "integer";
var result = [];
var charsLength = myList.length;
var currentPosition = 0;
var previousSeparatorPosition = -1;
var item;
while …

Read...

vk execute + args + python + requests

py_vk Продолжаю закреплять выученное своим горьким опытом и методом тыка по теме vk execute и python, наконец мои рученьки-загребученьки добрались до последнего оплота и просто приятного и некогда непонятного метода, и также к хранению процедур в приложении! Ура. В прошлом посте я рассказывал как передать строку с vk script сразу таки прям по воздуху, сырую и некрасивую, сегодня мне покорился вариант "хранимые процедуры" который позволяет тело скрипта хранить в приложении вк, а передавать по "воздуху" только необходимые и меняющиеся аргументы: id группы, id поста и так далее. Ближе к делу:

  • каждая переменная, которая будет записываться переданным аргументом должна иметь такой вид: Args.var_name

VK_proc

var comments = API.wall.getComments(
    {"owner_id":(Args.owner_id),
     "post_id":(Args.post_id),
     "need_likes":"1",
     "offset":"0",
     "count":"100",
     "sort":"asc",
     "preview_length":"1",
     "extended":"0",
     "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":(Args.owner_id),
         "post_id":(Args.post_id),
         "need_likes":"1",
         "offset":(offset_comments),
         "count":"100",
         "sort":"asc",
         "preview_length":"1",
         "extended":"0",
         "v":"5.27"}
    ).items;
offset_comments = …

Read...