import os import sys import time from selenium import webdriver from selenium.webdriver.common.keys import Keys import vk from script import PagesUpdater SCOPE = 'pages' # vk.com/dev/permissions OAUTH = 'https://oauth.vk.com/authorize?client_id=4836475&scope={}\ &redirect_uri=https://oauth.vk.com/blank.html&display=popup&v=5.37\ &response_type=token'.format(SCOPE) IDLE = 3 TOKEN = 'access_token=' # access_token ATOKEN_LEN = 85 # — 85 CHROME_DRIVER = '\chromedriver.exe' PATH = os.getcwd() PATH_TO_CHROME_TXT = PATH + '\path_to_chrome.txt' class Executor(object): def launch(self): chrome_path = self.get_chrome_path() self.driver = webdriver.Chrome(chrome_path) # selenium access_token = self.get_access_token() vkapi = vk.API(access_token=access_token) # API script = PagesUpdater(vkapi, vk.api.VkAPIMethodError, self.driver) script.launch() self.driver.quit()
C:\chrome-win32\chrome-win32
def get_chrome_path(self): with open(PATH_TO_CHROME_TXT, 'r') as target: return target.read()
def get_access_token(self): self.driver.get(OAUTH) # access_token = '' while not access_token: page_url = self.driver.current_url if TOKEN in page_url: token_start = page_url.index(TOKEN) + len(TOKEN) access_token = page_url[token_start:token_start+ATOKEN_LEN] break else: time.sleep(IDLE) return access_token
def resource_path(relative): return os.path.join(getattr(sys, '_MEIPASS', os.path.abspath(".")), relative) cert_path = resource_path('cacert.pem') os.environ['REQUESTS_CA_BUNDLE'] = cert_path
exe = Executor() exe.launch()
import requests import time LIMIT = 1 CAPTCHA_IMG = 'captcha_img' CAPTCHA_SID = 'captcha_sid' class PagesUpdater(object): def __init__(self, vkapi, vkerror, driver): self.vkapi = vkapi self.vkerror = vkerror self.driver = driver
def errors(self, vkmethod, **vkkwargs): while True: try: time.sleep(LIMIT) # LIMIT == 1 just in case return vkmethod(**vkkwargs) except requests.exceptions.Timeout: continue break
... you should ask the user to enter the text from the image captcha_img and repeat the request, adding parameters to it:
- captcha_sid - received identifier
- captcha_key - the text that the user entered
except self.vkerror as e: if CAPTCHA_IMG in e.error: self.driver.get(e.error[CAPTCHA_IMG]) # key = raw_input(R) # vkkwargs[captcha_sid] = e.error[CAPTCHA_SID] vkkwargs[captcha_key] = key # continue else: raise # Captcha
def get_titles(self, gid=NGID): return self.errors(self.vkapi.pages.getTitles, group_id=gid)
def launch(self): print self.get_titles() # do something else
import os import sys from distutils.core import setup import py2exe sys.argv.append('py2exe') AUTHOR = ' ' COMPANY = ' «»' NAME = ' .exe ' DESCRIPTION = ' ' SCRIPT = 'auth_user.py' VERSION = '1.0.0.0' BIN = 'bin/' # , bin DATA_FILES = [ 'path_to_chrome.txt', 'cacert.pem', 'chromedriver.exe' ] setup( options={ 'py2exe': { 'bundle_files': 1, 'compressed': True, 'unbuffered': True, 'optimize': 0, } }, data_files=[('', [BIN+s for s in DATA_FILES])], console=[{ 'script': SCRIPT, 'name': NAME, 'dest_base': NAME, 'description': DESCRIPTION, 'copyright': AUTHOR, 'company_name': COMPANY, 'version': VERSION }], zipfile=None, )
import vk from selenium import webdriver from selenium.webdriver.common.keys import Keys from script import PagesUpdater ACCESS_TOKEN = ' access_token' VKAPI = vk.API(access_token=ACCESS_TOKEN) VKError = vk.api.VkAPIMethodError class DirectUpdater(PagesUpdater): def __init__(self, driver_path): self.vkapi = VKAPI self.vkerror = VKError self.driver = webdriver.Chrome(driver_path) du = DirectUpdater( ' chromedriver.exe') du.launch()
Source: https://habr.com/ru/post/269245/
All Articles