Как развлечь себя с помощью vk api

в 15:33, , рубрики: python, Вконтакте API, пятничный пост

В какой-то момент моей жизни я понял, что для счастья мне нужно создать 10 страниц-копий самого себя во Вконтакте и добавиться одновременно всеми в друзья к людям из френдлиста моей основной страницы. Для подробностей реализации идеи — прошу под кат.

Как развлечь себя с помощью vk api - 1

Цели проекта:

  • Сделать 10 страниц во Вконтакте
  • Скопировать аватар c основной страницы
  • Скопировать все посты с основной страницы
  • Скопировать все видео с основной страницы
  • Добавиться во все группы основной страницы
  • Сделать полный граф дружболайков среди ботов (лайкнуть каждую запись и добавить каждого бота в друзья)
  • Добавиться каждому из 80 людей из заранее составленного списка в друзья

Регистрация

Для создания страниц я использовал сервис sms-reg.com, подробнее о сервисах приема SMS хорошо написано тут.

Регистрируем все 10 страниц и записываем их логины/пароли в файл accounts.json (где id — id регистрируемой страницы, а zero_id — id нашей основной страницы):

{
  "zero_id": "21102****",
  "accounts": [
    {
      "phone": "7985002****",
      "password": "tTod********",
      "id": 53980****
    },
    {
      "phone": "7985317****",
      "password": "tglh********",
      "id": 53980****
    },

    ...

    {
      "phone": "7916033****",
      "password": "ZsRq********",
      "id": 54038****
    }
  ]
}

python + vk_api

Я буду работать с библиотекой vk_api.

pip install vk_api --user

Создадим файл bots.py, он нам пригодится для остальных скриптов:

import json
import vk
import vk_api
from captcha import captcha_handler

with open('accounts.json', 'r') as file:
    data = json.loads(file.read())
    accounts = data['accounts']
    zero_id = int(data['zero_id'])

vk_apis = []
def init_apis():
    current_id = 0
    for account in accounts:
        vk_session = vk_api.VkApi(account['phone'], account['password'], captcha_handler=captcha_handler)
        vk_session.auth()
        vk_apis.append(vk_session.get_api())
        print('account', current_id, 'successfully inited')
        current_id += 1
init_apis()

Он читает accounts.json и инициализирует api для каждого из аккаунтов.

Копирование аватара

def change_photo(vk):
    upload_url = vk.photos.getOwnerPhotoUploadServer()['upload_url']
    answer = json.loads(requests.post(upload_url, files={'photo': open('avatar.jpg', 'rb')}).text)
    vk.photos.saveOwnerPhoto(photo=answer['photo'], server=answer['server'], hash=answer['hash'])

counter = 0
for vk in vk_apis:
    change_photo(vk)
    print(counter, 'done')
    counter += 1

Копирование видео

videos = default_vk.video.get(owner_id=zero_id, count=100)

counter = 0
for vk in vk_apis:
    for video in videos['items']:
        vk.video.add(video_id=video['id'], owner_id=video['owner_id'])

Добавление в группы

from time import sleep
from bots import vk_apis, zero_id, accounts, default_vk

groups = default_vk.groups.get(user_id=zero_id, count=100)

counter = 0
for vk in vk_apis:
    for group in groups['items']:
        print('add to', group)
        vk.groups.join(group_id=group)
    print(counter)
    counter += 1

Создание полного графа друзей

Как развлечь себя с помощью vk api - 2

counter = 0
for vk, account in zip(vk_apis, accounts):
    for friend in accounts:
        if friend['id'] == account['id']:
            continue
        vk.friends.add(user_id=friend['id'], captcha_handler=captcha_handler)
        print(counter, friend['id'], account['id'])
        counter += 1
        sleep(1)

Создание полного графа лайков

Как развлечь себя с помощью vk api - 3 Как развлечь себя с помощью vk api - 4

counter = 0
for vk, account in zip(vk_apis, accounts):
    for friend in accounts:
        if friend['id'] != account['id']:
            continue
        print(counter, friend['id'], account['id'])
        for post in vk.wall.get(owner_id=friend['id'])['items']:
            flag = True
            while flag:
                try: #иногда скрипт падал из-за большого количества запросов в секунду
                    vk.likes.add(type='post', owner_id=post['owner_id'], item_id=post['id'])
                    flag = False
                except:
                    print('failed on', counter)
                    sleep(10)
                    pass
        counter += 1

Добавление в друзья

создаем файл friends, в котором в каждой сточке пишем

id_человека #ник_человека (для себя)

Вконтакте позволяет добавить примерно 80 человек в день.

friends_str = ''
with open('friends', 'r') as file:
    friends_str = file.read()

friends = [{'id': x.split(' #')[0], 'name': x.split(' #')[1]} for x in friends_str.split('n')]

ids_ = ([x['id'] for x in (default_vk.users.get(user_ids=[x['id'] for x in friends]))])

for friend, id_ in zip(friends, ids_):
    print(friend['name'])
    print(friend)
    for vk in vk_apis:
        flag = True
        while flag:
            try:
                vk.friends.add(user_id=int(id_))
                flag = False
            except:
                print('error')
                sleep(10)

Обход капчи

Внимательный читатель уже увидел строчку

from captcha import captcha_handler

Поскольку Вконтакте не всегда нравится такое количество запросов, приходится обрабатывать капчу. Есть огромное количество сервисов, которые предоставляют такую возможность. Нужно просто отправить post запрос с капчей в base64 и подождать.

Как развлечь себя с помощью vk api - 5

def uncapcha(url):
    imager = requests.get(url)
    r = requests.post('http://rucaptcha.com/in.php', data = {'method': 'base64', 'key': RUCAPTCHA_KEY, 'body': base64.b64encode(imager.content)})
    if (r.text[:3] != 'OK|'):
        print('captcha failed')
        return -1
    capid = r.text[3:]
    sleep(5)
    capanswer = requests.post('http://rucaptcha.com/res.php', data = {'key': RUCAPTCHA_KEY, 'id':capid, 'action':'get'}).text
    if (capanswer[:3] != 'OK|'):
        print('captcha failed')
        return -1
    return capanswer[3:]

Результаты

Вот несколько скриншотов того, что мне прислали люди

Скрытый текст

Как развлечь себя с помощью vk api - 6 Как развлечь себя с помощью vk api - 7
Как развлечь себя с помощью vk api - 8 Как развлечь себя с помощью vk api - 9
Как развлечь себя с помощью vk api - 10 Как развлечь себя с помощью vk api - 11

github
Главный вопрос остается открытым — зачем я это сделал? Понятия не имею.

Автор: galqiwi

Источник

* - обязательные к заполнению поля