رمز لتحديث صورة الملف الشخصي ل Vkontakte باستخدام VK API. النظر في العمل مع captcha وتحميل الرمز إلى الخادم لتحديث الصورة تلقائيا.

المكتبات المطلوبة
قم بتثبيت مكتبة vk_api للعمل مع واجهة برمجة تطبيقات VK لـ Python: pip install vk_api
استيراد المكتبات اللازمة
import os import time import random import requests import vk_api from vk_api.utils import get_random_id from urllib import urlretrieve
ترخيص
إذن في VK باستخدام API
vk_session = vk_api.VkApi('+7999132****', '*********') vk_session.auth() vk = vk_session.get_api()
تحميل الصور
تحميل الصور إلى خادم فكونتاكتي.
تقوم photos.getOwnerPhotoUploadServer () بإرجاع عنوان الخادم لتحميل الصورة الرئيسية إلى صفحة المستخدم.
url = vk.photos.getOwnerPhotoUploadServer()['upload_url']
لتحميل الصورة إلى خادم VKontakte ، تحتاج إلى نقل الملف إلى عنوان upload_url الذي تم الحصول عليه في الفقرة السابقة عن طريق إنشاء طلب POST مع حقل الصورة.
حفظ الخادم وقيم التجزئة. ستحتاجهم لتحديث صورة ملفك الشخصي.
server = request['server'] hash = request['hash']
تحديث صورة الملف الشخصي
photos.saveOwnerPhoto () يحفظ صورة المستخدم.
بعد تحديث الصورة ، تتم إضافة منشور بهذه الصورة إلى الحائط. إذا لم تقم بحذف هذه المنشورات ، فسيتم انسداد موجز الأصدقاء بالمشاركات المتعلقة بتحديث الصورة الرمزية.
posts = vk.wall.get() post_id = posts["items"][0]["id"] vk.wall.delete(post_id = post_id)
إذا قمنا بتشغيل الرمز ، فسيتم تحديث صورة ملف التعريف الخاص بنا.
للأتمتة ، ما عليك سوى إضافة حلقة لا نهائية وإجراء تأخير لمدة دقيقة بعد كل تحديث للصورة.
y = 0 while(True): x = random.randint(0, len(photo)-1) while(x == y): x = random.randint(0, len(photo)-1) y = x
كود كامل 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)
ولكن بعد بضع عشرات من تحديثات صورة الملف الشخصي ، سيحدث خطأ
كلمة التحقق: كلمة التحقق المطلوبة
دعونا نرى كيفية العمل مع captcha في VK API.
العمل مع كلمة التحقق
طبقت طريقة vk_api.VkApi () بالفعل العمل مع captcha. بالإضافة إلى تسجيل الدخول وكلمة المرور ، من الضروري نقل وظيفة معالجة captcha captcha_handler.
تغيير vk_session
vk_session = vk_api.VkApi('+7999132****', '**********', captcha_handler=captcha_handler)
نضيف وظيفة captcha_handler (captcha) ، والتي تأخذ عنوان captcha ، وترسل صورة captcha إلى رسائل المستخدم وتنتظر captcha من المستخدم.
def captcha_handler(captcha):
وظيفة لإرسال رسائل مع صورة captcha للمستخدم.
لا يمكن للمستخدم الوصول إلى طرق الرسائل من الخادم ، لذلك تحتاج إلى إنشاء مجموعة والحصول على الرمز المميز.
- إنشاء مجموعة / صفحة عامة
- إدارة => العمل مع API => إنشاء مفتاح
- اختيار:
- السماح للتطبيق بالوصول إلى رسائل المجتمع
- السماح بوصول التطبيق إلى صور المجتمع
- انسخ المفتاح
يجب أيضًا تمكين الرسائل في إعدادات المجموعة (التحكم => الرسائل) وتمكين الرسائل (في قائمة المجموعة)
def send_captcha(captcha_url):
إذا قمنا بتشغيل الكود ، فسيتم تنفيذه حتى نقطع عمله. عندما يكون من الضروري إدخال captcha ، سيتم إرسال صورة captcha إلى الرسائل الخاصة وبعد إرسال أحرف من الصورة ، سيستمر تحديث صورة الملف الشخصي.
كود كامل 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)
لتنفيذ التعليمات البرمجية على مدار الساعة ، استخدم استضافة VPS. أقوم بتحميل الصور وتنفيذ التعليمات البرمجية على الخادم.
كود جيثب
إذا كانت لديك أسئلة ، اكتب التعليقات أو في PM.