Kode untuk memperbarui foto profil Vkontakte menggunakan VK API. Pertimbangkan untuk bekerja dengan captcha dan unggah kode ke server untuk memperbarui foto secara otomatis.

Perpustakaan yang Diperlukan
Instal pustaka vk_api untuk bekerja dengan API VK untuk Python: pip instal vk_api
Impor perpustakaan yang diperlukan
import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve
Login
Otorisasi dalam VK menggunakan API
vk_session = vk_api.VkApi('+7999132****', '*********') vk_session.auth() vk = vk_session.get_api()
Unggah Gambar
Unggah gambar ke server VKontakte.
photos.getOwnerPhotoUploadServer () mengembalikan alamat server untuk mengunggah foto utama ke halaman pengguna.
url = vk.photos.getOwnerPhotoUploadServer()['upload_url']
Untuk mengunggah gambar ke server VKontakte, Anda perlu mentransfer file ke alamat upload_url yang diperoleh pada paragraf sebelumnya dengan membuat permintaan POST dengan bidang foto.
Simpan nilai server dan hash. Anda akan membutuhkan mereka untuk memperbarui foto profil Anda.
server = request['server'] hash = request['hash']
Pembaruan foto profil
photos.saveOwnerPhoto () menyimpan foto pengguna.
Setelah memperbarui foto, pos dengan foto ini ditambahkan ke dinding. Jika Anda tidak menghapus posting ini, maka umpan teman akan tersumbat dengan posting tentang pembaruan avatar Anda.
posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id)
Jika kami menjalankan kodenya, maka foto profil kami akan diperbarui.
Untuk otomatisasi, cukup tambahkan loop tanpa akhir dan buat jeda satu menit setelah setiap pembaruan foto.
y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x
Kode lengkap 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)
Tetapi setelah beberapa lusin pembaruan foto profil, kesalahan akan terjadi
Captcha: Captcha dibutuhkan
Mari kita lihat bagaimana cara bekerja dengan captcha di VK API.
Bekerja dengan captcha
Metode vk_api.VkApi () telah mengimplementasikan kerja dengan captcha. Selain login dan kata sandi, perlu untuk mentransfer fungsi pemrosesan captcha captcha_handler.
Ubah vk_session
vk_session = vk_api.VkApi('+7999132****', '**********', captcha_handler=captcha_handler)
Kami menambahkan fungsi captcha_handler (captcha), yang mengambil alamat captcha, mengirimkan gambar captcha ke pesan pengguna dan menunggu captcha dari pengguna.
def captcha_handler(captcha):
Berfungsi untuk mengirim pesan dengan gambar captcha ke pengguna.
Metode pesan tidak dapat diakses oleh pengguna dari server, jadi Anda perlu membuat grup dan mendapatkan token.
- Buat halaman grup / publik
- Manajemen => Bekerja dengan API => Buat kunci
- Pilih:
- Izinkan aplikasi mengakses pesan komunitas
- Izinkan akses aplikasi ke foto komunitas
- Salin kuncinya
Anda juga harus mengaktifkan Pesan dalam pengaturan grup (Kontrol => Pesan) dan mengaktifkan pesan (dalam menu grup)
def send_captcha(captcha_url):
Jika kami menjalankan kode, itu akan dieksekusi sampai kami mengganggu pekerjaannya. Ketika perlu memasukkan captcha, gambar captcha akan dikirim ke pesan pribadi dan setelah mengirim karakter dari gambar, memperbarui foto profil akan berlanjut.
Kode lengkap 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)
Untuk eksekusi kode sepanjang waktu, saya menggunakan hosting VPS. Saya memuat gambar dan mengeksekusi kode di server.
Kode github
Jika Anda memiliki pertanyaan, tulis di komentar atau di PM.