File: user_agent.py

package info (click to toggle)
browser-cookie3 0.20.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 188 kB
  • sloc: python: 1,595; makefile: 4
file content (60 lines) | stat: -rw-r--r-- 1,764 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import subprocess
import tempfile
from http.server import BaseHTTPRequestHandler, HTTPServer

DEFAULT_TIMEOUT = 30  # sec
_ua_list = []


class HTTPRequestHandler(BaseHTTPRequestHandler):
    def log_request(self, *args):
        pass  # No need to log

    def __handle_get_request(self):
        ua = self.headers.get('User-Agent')
        if ua:
            _ua_list.append(ua)
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.end_headers()

        self.wfile.write(b'OK')

    def do_GET(self):
        self.__handle_get_request()


class UAGetter:
    HEADLESS_NEW = 'new'
    HEADLESS_OLD = 'old'
    HEADLESS_DEFAULT = ''

    def __init__(self, binary_path, headless_mode=HEADLESS_DEFAULT, timeout=DEFAULT_TIMEOUT):
        self.__set_server()
        self.__temp_dir = tempfile.mkdtemp(prefix='browser_ua_')
        headless = f'--headless={headless_mode}' if headless_mode else '--headless'
        self.__args = [binary_path, headless, '--disable-gpu',
                       f'--user-data-dir={self.__temp_dir}']
        self.server.timeout = timeout

    def __set_server(self):
        port = 55121
        while True:
            try:
                server = HTTPServer(('127.0.0.1', port), HTTPRequestHandler)
                break
            except Exception:
                port += 1
        self.server = server

    def get(self):
        self.__args.append(f'http://127.0.0.1:{self.server.server_port}')
        process = subprocess.Popen(
            self.__args, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
        self.server.handle_request()
        self.server.server_close()

        process.kill()
        process.wait()

        return _ua_list[0] if _ua_list else None