Automatically update Vkontakte profile photo

Code for updating the profile photo of Vkontakte using the VK API. Consider working with captcha and upload the code to the server to automatically update the photo.

image

Required Libraries


Install the vk_api library to work with the VK API for Python: pip install vk_api

Vk_api work example
import vk_api # ( )      vk_session = vk_api.VkApi('login', 'password') vk_session.auth() vk = vk_session.get_api() #       'Hello world!' vk.wall.post(message='Hello world!') 


Import the necessary libraries

 import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve 

Login


Authorization in VK using API

 vk_session = vk_api.VkApi('+7999132****', '*********') vk_session.auth() vk = vk_session.get_api() 

Upload Images


Upload images to the VKontakte server.
photos.getOwnerPhotoUploadServer () returns the server address for uploading the main photo to the user’s page.

 url = vk.photos.getOwnerPhotoUploadServer()['upload_url'] 

To upload the image to the VKontakte server, you need to transfer the file to the upload_url address obtained in the previous paragraph by generating a POST request with the photo field.

 #    images images = os.listdir("images") photo = [] for image in images: request = requests.post(url, files={'photo': open('images/'+image, 'rb')}).json() photo.append(request['photo']) 

Save the server and hash values. They will be needed to update your profile photo.

 server = request['server'] hash = request['hash'] 

Profile photo update


photos.saveOwnerPhoto () saves the user's photo.

 #       x = random.randint(0, len(photo)-1) vk.photos.saveOwnerPhoto(server = server, hash = hash, photo = photo[x]) 

After updating the photo, a post with this photo is added to the wall. If you do not delete these posts, then the friends feed will be clogged with posts about your avatar update.

 posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id) 

If we run the code, then the photo of our profile will be updated.
For automation, just add an endless loop and make a minute delay after each photo update.

 y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x #x  y   ,      2   vk.photos.saveOwnerPhoto(server = server, hash = hash, photo = photo[x]) posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id) #   photos = vk.photos.getAll() if (photos['count']>1): photo_id = photos["items"][1]["id"] vk.photos.delete(photo_id = photo_id) time.sleep(60) # 60 . 

Full code
 import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve vk_session = vk_api.VkApi('+7999132****', '***********') vk_session.auth() vk = vk_session.get_api() images = os.listdir("images") url = vk.photos.getOwnerPhotoUploadServer()['upload_url'] photo = [] for image in images: request = requests.post(url, files={'photo': open('images/'+image, 'rb')}).json() photo.append(request['photo']) server = request['server'] hash = request['hash'] y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x vk.photos.saveOwnerPhoto(server = server, hash = hash, photo = photo[x]) posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id) photos = vk.photos.getAll() if (photos['count']>1): photo_id = photos["items"][1]["id"] vk.photos.delete(photo_id = photo_id) time.sleep(60) 


But after a few dozen profile photo updates, an error will occur
Captcha: Captcha needed

Let's see how to work with captcha in VK API.

Work with captcha


The vk_api.VkApi () method has already implemented work with captcha. In addition to the login and password, it is necessary to transfer the captcha processing function captcha_handler.

Change vk_session

 vk_session = vk_api.VkApi('+7999132****', '**********', captcha_handler=captcha_handler) 

We add the captcha_handler (captcha) function, which takes the captcha address, sends the captcha image to the user's messages and waits for the captcha message from the user.

 def captcha_handler(captcha): #   captcha_url = captcha.get_url() #     urlretrieve(captcha_url, "captcha.jpg") #  (send_captcha() . ) key = send_captcha(captcha_url) #  ()  return captcha.try_again(key) 

Function for sending messages with captcha image to user.

The message methods are not accessible to the user from the server, so you need to create a group and get token.

  1. Create a group / public page
  2. Management => Work with API => Create a key
  3. Choose:
    • Allow application to access community messages
    • Allow app access to community photos
  4. Copy the key
    You must also enable Messages in the group settings (Control => Messages) and enable messages (in the group menu)

     def send_captcha(captcha_url): #token ()  token = "" vk_session = vk_api.VkApi(token = token) vk = vk_session.get_api() #   url = vk.photos.getMessagesUploadServer()['upload_url'] #     request = requests.post(url, files={'photo': open("captcha.jpg", 'rb')}).json() #  photo = vk.photos.saveMessagesPhoto(server=request['server'], photo = request['photo'], hash = request['hash']) attachment = 'photo{}_{}'.format(photo[0]['owner_id'], photo[0]['id']) #  vk.messages.send( user_id = _ID, attachment = attachment, random_id=get_random_id()) #  os.remove("captcha.jpg") #  key = '' while (key == ''): #     messages = vk.messages.getDialogs()['items'][0] #     ,     if 'attachments' not in messages['message'].keys(): key = messages['message']['body'] return key 

    If we run the code, it will be executed until we interrupt its work. When it is necessary to enter captcha, the captcha image will be sent to private messages and after sending characters from the image, updating the profile photo will continue.

    Full code
     import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve def captcha_handler(captcha): captcha_url = captcha.get_url() urlretrieve(captcha_url, "captcha.jpg") key = send_captcha(captcha_url) print(key) return captcha.try_again(key) def send_captcha(captcha_url): token = "" vk_session = vk_api.VkApi(token = token) vk = vk_session.get_api() url = vk.photos.getMessagesUploadServer()['upload_url'] request = requests.post(url, files={'photo': open("captcha.jpg", 'rb')}).json() photo = vk.photos.saveMessagesPhoto(server=request['server'], photo = request['photo'], hash = request['hash']) attachment = 'photo{}_{}'.format(photo[0]['owner_id'], photo[0]['id']) vk.messages.send( user_id=_ID, attachment = attachment, random_id=get_random_id()) os.remove("captcha.jpg") key = '' while (key == ''): messages = vk.messages.getDialogs()['items'][0] if 'attachments' not in messages['message'].keys(): key = messages['message']['body'] return key vk_session = vk_api.VkApi('+7999132****', '*********', captcha_handler=captcha_handler) vk_session.auth() vk = vk_session.get_api() images = os.listdir("images") url = vk.photos.getOwnerPhotoUploadServer()['upload_url'] photo = [] for image in images: request = requests.post(url, files={'photo': open('images/'+image, 'rb')}).json() photo.append(request['photo']) server = request['server'] hash = request['hash'] y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x vk.photos.saveOwnerPhoto(server = server, hash = hash, photo = photo[x]) posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id) photos = vk.photos.getAll() if (photos['count']>1): photo_id = photos["items"][1]["id"] vk.photos.delete(photo_id = photo_id) print("Successfully", x) time.sleep(60) 


    For round-the-clock code execution I use VPS hosting. I load images and execute the code on the server.

    Github code

    If you have questions, write in the comments or in the PM.

Source: https://habr.com/ru/post/464285/


All Articles