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.

Erforderliche Bibliotheken
Installieren Sie die Bibliothek vk_api, um mit der VK-API für Python zu arbeiten: pip install vk_api
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.
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.
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
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):
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.
- Erstellen Sie eine Gruppe / öffentliche Seite
- Management => Mit API arbeiten => Schlüssel erstellen
- Wählen Sie:
- Ermöglichen Sie der Anwendung den Zugriff auf Community-Nachrichten
- Ermöglichen Sie der App den Zugriff auf Community-Fotos
- 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):
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.