Perbarui foto profil Vkontakte secara otomatis

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

gambar

Perpustakaan yang Diperlukan


Instal pustaka vk_api untuk bekerja dengan API VK untuk Python: pip instal vk_api

Contoh kerja 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!') 


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.

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

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.

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

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 #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 . 

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): #   captcha_url = captcha.get_url() #     urlretrieve(captcha_url, "captcha.jpg") #  (send_captcha() . ) key = send_captcha(captcha_url) #  ()  return captcha.try_again(key) 

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.

  1. Buat halaman grup / publik
  2. Manajemen => Bekerja dengan API => Buat kunci
  3. Pilih:
    • Izinkan aplikasi mengakses pesan komunitas
    • Izinkan akses aplikasi ke foto komunitas
  4. Salin kuncinya
    Anda juga harus mengaktifkan Pesan dalam pengaturan grup (Kontrol => Pesan) dan mengaktifkan pesan (dalam menu grup)

     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 

    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.

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


All Articles