Vkontakte-Profilfoto automatisch aktualisieren

Code zum Aktualisieren des Profilfotos von Vkontakte mithilfe der VK-API. Arbeiten Sie mit Captcha und laden Sie den Code auf den Server hoch, um das Foto automatisch zu aktualisieren.

Bild

Erforderliche Bibliotheken


Installieren Sie die Bibliothek vk_api, um mit der VK-API für Python zu arbeiten: pip install vk_api

Vk_api Arbeitsbeispiel
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!') 


Importieren Sie die erforderlichen Bibliotheken

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

Login


Autorisierung in VK über API

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

Bilder hochladen


Laden Sie Bilder auf den VKontakte-Server hoch.
photos.getOwnerPhotoUploadServer () gibt die Serveradresse zum Hochladen des Hauptfotos auf die Benutzerseite zurück.

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

Um das Bild auf den VKontakte-Server hochzuladen, müssen Sie die Datei an die im vorherigen Absatz angegebene Adresse upload_url übertragen, indem Sie eine POST-Anforderung mit dem Fotofeld generieren.

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

Speichern Sie die Server- und Hashwerte. Sie benötigen sie, um Ihr Profilfoto zu aktualisieren.

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

Profilfoto-Update


photos.saveOwnerPhoto () speichert das Foto des Benutzers.

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

Nach dem Aktualisieren des Fotos wird der Wand ein Beitrag mit diesem Foto hinzugefügt. Wenn Sie diese Beiträge nicht löschen, wird der Feed mit Freunden mit Beiträgen zu Ihrem Avatar-Update verstopft.

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

Wenn wir den Code ausführen, wird das Foto unseres Profils aktualisiert.
Fügen Sie zur Automatisierung einfach eine Endlosschleife hinzu und machen Sie nach jedem Foto-Update eine Minute Verzögerung.

 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 . 

Vollständiger 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) 


Nach einigen Dutzend Aktualisierungen von Profilfotos tritt jedoch ein Fehler auf
Captcha: Captcha benötigt

Mal sehen, wie man mit Captcha in der VK-API arbeitet.

Arbeite mit Captcha


Die Methode vk_api.VkApi () hat bereits die Arbeit mit captcha implementiert. Zusätzlich zum Login und Passwort muss die Captcha-Verarbeitungsfunktion captcha_handler übertragen werden.

Ändern Sie vk_session

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

Wir fügen die Funktion captcha_handler (captcha) hinzu, die die Captcha-Adresse verwendet, das Captcha-Bild an die Nachrichten des Benutzers sendet und auf das Captcha vom Benutzer wartet.

 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) 

Funktion zum Senden von Nachrichten mit einem Captcha-Bild an den Benutzer.

Auf die Nachrichtenmethoden kann der Benutzer vom Server aus nicht zugreifen. Sie müssen daher eine Gruppe erstellen und ein Token abrufen.

  1. Erstellen Sie eine Gruppe / öffentliche Seite
  2. Management => Mit API arbeiten => Schlüssel erstellen
  3. Wählen Sie:
    • Ermöglichen Sie der Anwendung den Zugriff auf Community-Nachrichten
    • Ermöglichen Sie der App den Zugriff auf Community-Fotos
  4. Kopieren Sie den Schlüssel
    Sie müssen Nachrichten auch in den Gruppeneinstellungen (Steuerung => Nachrichten) und Nachrichten (im Gruppenmenü) aktivieren.

     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 

    Wenn wir den Code ausführen, wird er ausgeführt, bis wir seine Arbeit unterbrechen. Wenn Captcha eingegeben werden muss, wird das Captcha-Bild an private Nachrichten gesendet. Nach dem Senden von Zeichen aus dem Bild wird die Aktualisierung des Profilfotos fortgesetzt.

    Vollständiger 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) 


    Für die Code-Ausführung rund um die Uhr verwende ich VPS-Hosting. Ich lade Bilder und führe den Code auf dem Server aus.

    Github-Code

    Wenn Sie Fragen haben, schreiben Sie in die Kommentare oder in die PM.

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


All Articles