commit
					743a90d301
				
				 5 changed files with 182 additions and 0 deletions
			
			
		@ -0,0 +1,21 @@
					 | 
				
			||||
# 通过无头浏览器获取cookie | 
				
			||||
 | 
				
			||||
DEMO代码以新浪微博,[m.weibo.cn](https://m.weibo.cn)为实例 | 
				
			||||
 | 
				
			||||
## 安装 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
``` | 
				
			||||
pip3 install -r requirements.txt | 
				
			||||
``` | 
				
			||||
 | 
				
			||||
安装chrome并下载对应版本的chrome deriver | 
				
			||||
 | 
				
			||||
下载chrome https://www.google.com/chrome/ | 
				
			||||
 | 
				
			||||
下载对应版本 driver https://chromedriver.chromium.org/downloads | 
				
			||||
 | 
				
			||||
## 运行 | 
				
			||||
``` | 
				
			||||
   python selenium_demo.py | 
				
			||||
``` | 
				
			||||
@ -0,0 +1,154 @@
					 | 
				
			||||
import os | 
				
			||||
import time | 
				
			||||
import zipfile | 
				
			||||
 | 
				
			||||
from selenium import webdriver | 
				
			||||
from selenium.common.exceptions import TimeoutException | 
				
			||||
from selenium.webdriver.common.by import By | 
				
			||||
from selenium.webdriver.support import expected_conditions as EC | 
				
			||||
from selenium.webdriver.support.ui import WebDriverWait | 
				
			||||
 | 
				
			||||
 | 
				
			||||
class GenCookies(object): | 
				
			||||
    USER_AGENT = open('useragents.txt').readlines() | 
				
			||||
 | 
				
			||||
    PROXY_HOST = 'u1.5.tn.16yun.cn'  # rotating proxy or host | 
				
			||||
    PROXY_PORT = 6441  # port | 
				
			||||
    PROXY_USER = '16ZJZYVL'  # username | 
				
			||||
    PROXY_PASS = '123413'  # password | 
				
			||||
     | 
				
			||||
    @classmethod | 
				
			||||
    def get_chromedriver(cls, use_proxy=False, user_agent=None): | 
				
			||||
        manifest_json = """ | 
				
			||||
        { | 
				
			||||
            "version": "1.0.0", | 
				
			||||
            "manifest_version": 2, | 
				
			||||
            "name": "Chrome Proxy", | 
				
			||||
            "permissions": [ | 
				
			||||
                "proxy", | 
				
			||||
                "tabs", | 
				
			||||
                "unlimitedStorage", | 
				
			||||
                "storage", | 
				
			||||
                "<all_urls>", | 
				
			||||
                "webRequest", | 
				
			||||
                "webRequestBlocking" | 
				
			||||
            ], | 
				
			||||
            "background": { | 
				
			||||
                "scripts": ["background.js"] | 
				
			||||
            }, | 
				
			||||
            "minimum_chrome_version":"22.0.0" | 
				
			||||
        } | 
				
			||||
        """ | 
				
			||||
 | 
				
			||||
        background_js = """ | 
				
			||||
        var config = { | 
				
			||||
                mode: "fixed_servers", | 
				
			||||
                rules: { | 
				
			||||
                singleProxy: { | 
				
			||||
                    scheme: "http", | 
				
			||||
                    host: "%s", | 
				
			||||
                    port: parseInt(%s) | 
				
			||||
                }, | 
				
			||||
                bypassList: ["localhost"] | 
				
			||||
                } | 
				
			||||
            }; | 
				
			||||
 | 
				
			||||
        chrome.proxy.settings.set({value: config, scope: "regular"}, function() {}); | 
				
			||||
 | 
				
			||||
        function callbackFn(details) { | 
				
			||||
            return { | 
				
			||||
                authCredentials: { | 
				
			||||
                    username: "%s", | 
				
			||||
                    password: "%s" | 
				
			||||
                } | 
				
			||||
            }; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        chrome.webRequest.onAuthRequired.addListener( | 
				
			||||
                    callbackFn, | 
				
			||||
                    {urls: ["<all_urls>"]}, | 
				
			||||
                    ['blocking'] | 
				
			||||
        ); | 
				
			||||
        """ % (cls.PROXY_HOST, cls.PROXY_PORT, cls.PROXY_USER, cls.PROXY_PASS) | 
				
			||||
        path = os.path.dirname(os.path.abspath(__file__)) | 
				
			||||
        chrome_options = webdriver.ChromeOptions() | 
				
			||||
        if use_proxy: | 
				
			||||
            pluginfile = 'proxy_auth_plugin.zip' | 
				
			||||
 | 
				
			||||
            with zipfile.ZipFile(pluginfile, 'w') as zp: | 
				
			||||
                zp.writestr("manifest.json", manifest_json) | 
				
			||||
                zp.writestr("background.js", background_js) | 
				
			||||
            chrome_options.add_extension(pluginfile) | 
				
			||||
        if user_agent: | 
				
			||||
            chrome_options.add_argument('--user-agent=%s' % user_agent) | 
				
			||||
        driver = webdriver.Chrome( | 
				
			||||
            os.path.join(path, 'chromedriver'), | 
				
			||||
            chrome_options=chrome_options) | 
				
			||||
        return driver | 
				
			||||
 | 
				
			||||
    def __init__(self, username, password): | 
				
			||||
        self.url = 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https://m.weibo.cn/' | 
				
			||||
        self.browser = self.get_chromedriver(use_proxy=True, user_agent=self.USER_AGENT) | 
				
			||||
        self.wait = WebDriverWait(self.browser, 20) | 
				
			||||
        self.username = username | 
				
			||||
        self.password = password | 
				
			||||
 | 
				
			||||
    def open(self): | 
				
			||||
        """ | 
				
			||||
        打开网页输入用户名密码并点击 | 
				
			||||
        :return: None | 
				
			||||
        """ | 
				
			||||
        self.browser.delete_all_cookies() | 
				
			||||
        self.browser.get(self.url) | 
				
			||||
        username = self.wait.until(EC.presence_of_element_located((By.ID, 'loginName'))) | 
				
			||||
        password = self.wait.until(EC.presence_of_element_located((By.ID, 'loginPassword'))) | 
				
			||||
        submit = self.wait.until(EC.element_to_be_clickable((By.ID, 'loginAction'))) | 
				
			||||
        username.send_keys(self.username) | 
				
			||||
        password.send_keys(self.password) | 
				
			||||
        time.sleep(1) | 
				
			||||
        submit.click() | 
				
			||||
 | 
				
			||||
    def password_error(self): | 
				
			||||
        """ | 
				
			||||
        判断是否密码错误 | 
				
			||||
        :return: | 
				
			||||
        """ | 
				
			||||
        try: | 
				
			||||
            return WebDriverWait(self.browser, 5).until( | 
				
			||||
                EC.text_to_be_present_in_element((By.ID, 'errorMsg'), '用户名或密码错误')) | 
				
			||||
        except TimeoutException: | 
				
			||||
            return False | 
				
			||||
 | 
				
			||||
    def get_cookies(self): | 
				
			||||
        """ | 
				
			||||
        获取Cookies | 
				
			||||
        :return: | 
				
			||||
        """ | 
				
			||||
        return self.browser.get_cookies() | 
				
			||||
 | 
				
			||||
    def main(self): | 
				
			||||
        """ | 
				
			||||
        入口 | 
				
			||||
        :return: | 
				
			||||
        """ | 
				
			||||
        self.open() | 
				
			||||
        if self.password_error(): | 
				
			||||
            return { | 
				
			||||
                'status': 2, | 
				
			||||
                'content': '用户名或密码错误' | 
				
			||||
            } | 
				
			||||
        # 如果不需要验证码直接登录成功 | 
				
			||||
 | 
				
			||||
        cookies = self.get_cookies() | 
				
			||||
        return { | 
				
			||||
            'status': 1, | 
				
			||||
            'content': cookies | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
if __name__ == '__main__': | 
				
			||||
    result = GenCookies( | 
				
			||||
        username='180000000', | 
				
			||||
        password='16yun', | 
				
			||||
    ).main() | 
				
			||||
    print(result) | 
				
			||||
@ -0,0 +1,4 @@
					 | 
				
			||||
Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/40 | 
				
			||||
Mozilla/5.0 (Windows NT 6.2; rv:39.0) Gecko/20100101 Firefox/39.0 | 
				
			||||
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; QQBrowser/8.3.4769.400) | 
				
			||||
Mozilla/5.0 (Windows NT 6.1; rv:39.0) Gecko/20100101 Firefox/39.0 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue