Mettre Ă  jour automatiquement la photo de profil de Vkontakte

Code pour mettre à jour la photo de profil de Vkontakte à l'aide de l'API VK. Pensez à travailler avec captcha et téléchargez le code sur le serveur pour mettre à jour automatiquement la photo.

image

Bibliothèques requises


Installez la bibliothèque vk_api pour travailler avec l'API VK pour Python: pip install vk_api

Exemple de travail Vk_api
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!') 


Importez les bibliothèques nécessaires

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

Se connecter


Autorisation dans VK Ă  l'aide de l'API

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

Télécharger des images


Téléchargez des images sur le serveur VKontakte.
photos.getOwnerPhotoUploadServer () renvoie l'adresse du serveur pour le téléchargement de la photo principale sur la page de l'utilisateur.

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

Pour télécharger l'image sur le serveur VKontakte, vous devez transférer le fichier à l'adresse upload_url obtenue dans le paragraphe précédent en générant une requête POST avec le champ photo.

 #    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']) 

Enregistrez le serveur et les valeurs de hachage. Vous en aurez besoin pour mettre Ă  jour votre photo de profil.

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

Mise Ă  jour de la photo de profil


photos.saveOwnerPhoto () enregistre la photo de l'utilisateur.

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

Après la mise à jour de la photo, un post avec cette photo est ajouté au mur. Si vous ne supprimez pas ces messages, le flux d'amis sera bouché avec des messages sur la mise à jour de votre avatar.

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

Si nous exécutons le code, la photo de notre profil sera mise à jour.
Pour l'automatisation, ajoutez simplement une boucle sans fin et faites un délai d'une minute après chaque mise à jour photo.

 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 . 

Code complet
 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) 


Mais après quelques dizaines de mises à jour de photos de profil, une erreur se produira
Captcha: Captcha nécessaire

Voyons comment travailler avec captcha dans l'API VK.

Travailler avec captcha


La méthode vk_api.VkApi () a déjà implémenté le travail avec captcha. En plus du login et du mot de passe, il est nécessaire de transférer la fonction de traitement captcha captcha_handler.

Changer vk_session

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

Nous ajoutons la fonction captcha_handler (captcha), qui prend l'adresse captcha, envoie l'image captcha aux messages de l'utilisateur et attend le captcha de l'utilisateur.

 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) 

Fonction d'envoi de messages avec une image captcha Ă  l'utilisateur.

Les méthodes de message ne sont pas accessibles à l'utilisateur depuis le serveur, vous devez donc créer un groupe et obtenir un jeton.

  1. Créer un groupe / une page publique
  2. Gestion => Travailler avec l'API => Créer une clé
  3. Choisissez:
    • Autoriser l'application Ă  accĂ©der aux messages de la communautĂ©
    • Autoriser l'accès de l'application aux photos de la communautĂ©
  4. Copiez la clé
    Vous devez également activer les messages dans les paramètres du groupe (Contrôle => Messages) et activer les messages (dans le menu du groupe)

     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 

    Si nous exécutons le code, il sera exécuté jusqu'à ce que nous interrompions son travail. Lorsqu'il est nécessaire d'entrer captcha, l'image captcha sera envoyée à des messages privés et après l'envoi de caractères à partir de l'image, la mise à jour de la photo de profil continuera.

    Code complet
     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) 


    Pour l'exécution de code 24h / 24, j'utilise l'hébergement VPS. Je charge des images et exécute le code sur le serveur.

    Code Github

    Si vous avez des questions, écrivez dans les commentaires ou dans le PM.

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


All Articles