Código para atualizar a foto do perfil de Vkontakte usando a API VK. Considere trabalhar com captcha e faça o upload do código no servidor para atualizar automaticamente a foto.

Bibliotecas necessárias
Instale a biblioteca vk_api para trabalhar com a API VK para Python: pip install vk_api
Exemplo de trabalho Vk_api Importar as bibliotecas necessárias
import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve
Entrar
Autorização em VK usando API
vk_session = vk_api.VkApi('+7999132****', '*********') vk_session.auth() vk = vk_session.get_api()
Carregar Imagens
Carregue imagens no servidor VKontakte.
photos.getOwnerPhotoUploadServer () retorna o endereço do servidor para carregar a foto principal na página do usuário.
url = vk.photos.getOwnerPhotoUploadServer()['upload_url']
Para fazer upload da imagem no servidor VKontakte, é necessário transferir o arquivo para o endereço upload_url obtido no parágrafo anterior, gerando uma solicitação POST com o campo foto.
Salve o servidor e os valores de hash. Você precisará deles para atualizar sua foto do perfil.
server = request['server'] hash = request['hash']
Atualização da foto do perfil
photos.saveOwnerPhoto () salva a foto do usuário.
Depois de atualizar a foto, uma postagem com esta foto é adicionada à parede. Se você não excluir essas postagens, o feed de amigos ficará entupido das postagens sobre a atualização do seu avatar.
posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id)
Se executarmos o código, a foto do nosso perfil será atualizada.
Para automação, basta adicionar um loop sem fim e fazer um minuto de atraso após cada atualização da foto.
y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x
Código completo 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)
Mas, após algumas dezenas de atualizações de fotos de perfil, ocorrerá um erro
Captcha: é necessário captcha
Vamos ver como trabalhar com captcha na API VK.
Trabalhar com captcha
O método vk_api.VkApi () já implementou o trabalho com captcha. Além do login e da senha, é necessário transferir a função de processamento captcha captcha_handler.
Alterar vk_session
vk_session = vk_api.VkApi('+7999132****', '**********', captcha_handler=captcha_handler)
Nós adicionamos a função captcha_handler (captcha), que pega o endereço captcha, envia a imagem captcha para as mensagens do usuário e aguarda o captcha do usuário.
def captcha_handler(captcha):
Função para enviar mensagens com uma imagem captcha para o usuário.
Os métodos de mensagem não estão acessíveis ao usuário no servidor, portanto, você precisa criar um grupo e obter o token.
- Criar um grupo / página pública
- Gerenciamento => Trabalhar com API => Criar uma chave
- Escolha:
- Permitir que o aplicativo acesse mensagens da comunidade
- Permitir acesso do aplicativo às fotos da comunidade
- Copie a chave
Você também deve ativar as Mensagens nas configurações do grupo (Control => Messages) e ativar as mensagens (no menu do grupo)
def send_captcha(captcha_url):
Se rodarmos o código, ele será executado até interrompermos seu trabalho. Quando for necessário digitar captcha, a imagem captcha será enviada para mensagens privadas e, após o envio de caracteres a partir da imagem, a atualização da foto do perfil continuará.
Código completo 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)
Para execução de código 24 horas por dia, uso hospedagem VPS. Carrego imagens e executo o código no servidor.
Código do Github
Se você tiver dúvidas, escreva nos comentários ou no PM.