1616
1717T = TypeVar ("T" )
1818
19- TLS_IDENTIFIER_TEMPLATES = [
20- "chrome_103" ,
21- "chrome_104" ,
22- "chrome_105" ,
23- "chrome_106" ,
24- "chrome_107" ,
25- "chrome_108" ,
26- "chrome_109" ,
27- "chrome_110" ,
28- "chrome_111" ,
29- "chrome_112" ,
30- "chrome_116_PSK" ,
31- "chrome_116_PSK_PQ" ,
32- "chrome_117" ,
19+ TLS_IDENTIFIER_TEMPLATES : list [str ] = sorted ([
3320 "chrome_120" ,
3421 "chrome_124" ,
35- "safari_15_6_1" ,
36- "safari_16_0" ,
37- "safari_ios_15_5" ,
38- "safari_ios_15_6" ,
39- "safari_ios_16_0" ,
40- "firefox_102" ,
41- "firefox_104" ,
42- "firefox_105" ,
43- "firefox_106" ,
44- "firefox_108" ,
45- "firefox_110" ,
46- "firefox_117" ,
22+ "chrome_131" ,
23+ "chrome_133" ,
4724 "firefox_120" ,
48- "opera_89" ,
49- "opera_90" ,
25+ "firefox_123" ,
26+ "firefox_132" ,
27+ "firefox_133" ,
5028 "opera_91" ,
51- "okhttp4_android_7" ,
52- "okhttp4_android_8" ,
53- "okhttp4_android_9" ,
54- "okhttp4_android_10" ,
55- "okhttp4_android_11" ,
56- "okhttp4_android_12" ,
57- "okhttp4_android_13" ,
58- "zalando_ios_mobile" ,
59- "zalando_android_mobile" ,
60- "nike_ios_mobile" ,
61- "nike_android_mobile" ,
62- "mms_ios" ,
63- "mms_ios_2" ,
64- "mms_ios_3" ,
65- "mesh_ios" ,
66- "mesh_ios_2" ,
67- "mesh_android" ,
68- "mesh_android_2" ,
69- "confirmed_ios" ,
70- "confirmed_android" ,
71- "confirmed_android_2" ,
72- ]
29+ "safari_16_0" ,
30+ "safari_ios_16_0" ,
31+ "safari_ios_17_0" ,
32+ "safari_ios_18_0" ,
33+ "safari_ios_18_5" ,
34+ ])
7335
7436USER_AGENTS = [
7537 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ,
9254 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0" ,
9355 "Mozilla/5.0 (Linux; Android 14; SM-G998B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36" ,
9456 "Mozilla/5.0 (Linux; Android 14; SM-S918B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36" ,
95- "Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1" ,
9657 "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1" ,
9758 "Mozilla/5.0 (Linux; Android 15; SM-S931B Build/AP3A.240905.015.A2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/127.0.6533.103 Mobile Safari/537.36" ,
98- "Mozila /5.0 (Linux; Android 14; SM-S928B/DS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.230 Mobile Safari/537.36" ,
59+ "Mozilla /5.0 (Linux; Android 14; SM-S928B/DS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.230 Mobile Safari/537.36" ,
9960 "Mozilla/5.0 (Linux; Android 14; SM-F956U) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.119 Mobile Safari/537.36" ,
10061 "Mozilla/5.0 (Linux; Android 13; SM-S911U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36" ,
10162 "Mozilla/5.0 (Linux; Android 13; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36" ,
@@ -318,11 +279,9 @@ class ProxyRotator(BaseRotator[Proxy]):
318279 def rebuild_item (cls , item : Any ) -> Optional [Proxy ]:
319280 """Constructs a `Proxy` object from various input types."""
320281 try :
321- if isinstance (item , Proxy ):
322- return item
323282 if isinstance (item , dict ):
324283 return Proxy .from_dict (item )
325- if isinstance (item , str ):
284+ if isinstance (item , ( str , Proxy ) ):
326285 return Proxy .from_string (item )
327286 except Exception :
328287 return None
@@ -414,7 +373,7 @@ class HeaderRotator(BaseRotator[Headers]):
414373 def __init__ (
415374 self ,
416375 items : Optional [Iterable [T ]] = None ,
417- strategy : Literal ["round_robin" , "random" , "weighted" ] = "round_robin " ,
376+ strategy : Literal ["round_robin" , "random" , "weighted" ] = "random " ,
418377 ) -> None :
419378 super ().__init__ (items or HEADER_TEMPLATES , strategy )
420379
@@ -434,11 +393,9 @@ def rebuild_item(cls, item: HeaderTypes) -> Optional[Headers]:
434393 try :
435394 if isinstance (item , Headers ):
436395 return item
437- if isinstance (item , (dict , list )):
438- return Headers (item )
396+ return Headers (item )
439397 except Exception :
440398 return None
441- return None
442399
443400 def next (self , user_agent : Optional [str ] = None ) -> Headers :
444401 """
@@ -452,12 +409,12 @@ def next(self, user_agent: Optional[str] = None) -> Headers:
452409 Returns:
453410 A copy of the next `Headers` object, potentially with a modified User-Agent.
454411 """
455- base_headers = super ().next ()
456- headers_copy = base_headers .copy ()
457-
412+ headers = super ().next ()
413+ headers_copy = headers .copy ()
414+ if not isinstance (headers_copy , Headers ):
415+ headers_copy = Headers (headers_copy )
458416 if user_agent :
459417 headers_copy ["User-Agent" ] = user_agent
460-
461418 return headers_copy
462419
463420 async def anext (self , user_agent : Optional [str ] = None ) -> Headers :
@@ -472,8 +429,10 @@ async def anext(self, user_agent: Optional[str] = None) -> Headers:
472429 Returns:
473430 A copy of the next `Headers` object, potentially with a modified User-Agent.
474431 """
475- base_headers = await super ().anext ()
476- headers_copy = base_headers .copy ()
432+ headers = await super ().anext ()
433+ headers_copy = headers .copy ()
434+ if not isinstance (headers_copy , Headers ):
435+ headers_copy = Headers (headers_copy )
477436 if user_agent :
478437 headers_copy ["User-Agent" ] = user_agent
479438 return headers_copy
0 commit comments