helpers.php 58 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167
  1. <?php
  2. /**
  3. * 助手函数
  4. *
  5. * @author mybsdc <[email protected]>
  6. * @date 2019/3/3
  7. * @time 16:34
  8. */
  9. use GuzzleHttp\Client;
  10. use GuzzleHttp\Cookie\CookieJar;
  11. use GuzzleHttp\Cookie\SetCookie;
  12. use Luolongfei\App\Console\GlobalValue;
  13. use Luolongfei\App\Console\MigrateEnvFile;
  14. use Luolongfei\App\Console\Upgrade;
  15. use Luolongfei\App\Constants\CommonConst;
  16. use Luolongfei\App\Exceptions\LlfException;
  17. use Luolongfei\Libs\Argv;
  18. use Luolongfei\Libs\Config;
  19. use Luolongfei\Libs\Env;
  20. use Luolongfei\Libs\Lang;
  21. use Luolongfei\Libs\Log;
  22. use Luolongfei\Libs\PhpColor;
  23. if (!function_exists('config')) {
  24. /**
  25. * 获取配置
  26. *
  27. * @param string $key 键,支持点式访问
  28. * @param string $default 默认值
  29. *
  30. * @return array|mixed
  31. */
  32. function config($key = '', $default = null)
  33. {
  34. return Config::getInstance()->get($key, $default);
  35. }
  36. }
  37. if (!function_exists('lang')) {
  38. /**
  39. * 读取语言包
  40. *
  41. * @param string $key 键,支持点式访问
  42. *
  43. * @return array|mixed|null
  44. */
  45. function lang($key = '')
  46. {
  47. return Lang::getInstance()->get($key);
  48. }
  49. }
  50. if (!function_exists('system_log')) {
  51. /**
  52. * 写日志
  53. *
  54. * @param $content
  55. * @param array $response
  56. * @param string $fileName
  57. * @description 受支持的着色标签
  58. * 'reset', 'bold', 'dark', 'italic', 'underline', 'blink', 'reverse', 'concealed', 'default', 'black', 'red',
  59. * 'green', 'yellow', 'blue', 'magenta', 'cyan', 'light_gray', 'dark_gray', 'light_red', 'light_green',
  60. * 'light_yellow', 'light_blue', 'light_magenta', 'light_cyan', 'white', 'bg_default', 'bg_black', 'bg_red',
  61. * 'bg_green', 'bg_yellow', 'bg_blue', 'bg_magenta', 'bg_cyan', 'bg_light_gray', 'bg_dark_gray', 'bg_light_red',
  62. * 'bg_light_green','bg_light_yellow', 'bg_light_blue', 'bg_light_magenta', 'bg_light_cyan', 'bg_white'
  63. *
  64. * system_log('<light_magenta>颜色 light_magenta</light_magenta>');
  65. */
  66. function system_log($content, array $response = [], $fileName = '')
  67. {
  68. try {
  69. $msg = sprintf(
  70. "[%s] %s %s\n",
  71. date('Y-m-d H:i:s'),
  72. is_string($content) ? $content : json_encode($content),
  73. $response ? json_encode($response, JSON_UNESCAPED_UNICODE) : '');
  74. // 过滤敏感信息
  75. if ((int)env('MOSAIC_SENSITIVE_INFO') === 1) {
  76. // 在 php 7.3 之前,连字符“-”在中括号中随便放,但在之后,只能放在开头或结尾或者转义后才能随便放
  77. $msg = preg_replace_callback('/(?P<secret>[\w.-]{1,3}?)(?=@[\w.-]+)/ui', function ($m) {
  78. return str_ireplace($m['secret'], str_repeat('*', strlen($m['secret'])), $m['secret']);
  79. }, $msg);
  80. }
  81. // 尝试为消息着色
  82. $c = PhpColor::getInstance()->getColorInstance();
  83. echo $c($msg)->colorize();
  84. // 干掉着色标签
  85. $msg = strip_tags($msg); // 不完整或者破损标签将导致更多的数据被删除
  86. // 写入日志文件
  87. if (is_writable(ROOT_PATH)) {
  88. $path = sprintf('%s/logs/%s/', ROOT_PATH, date('Y-m'));
  89. $file = $path . ($fileName ?: date('d')) . '.log';
  90. if (!is_dir($path)) {
  91. mkdir($path, 0666, true); // 0666 所有用户可读写
  92. }
  93. $handle = fopen($file, 'a'); // 追加而非覆盖
  94. if ($handle !== false) {
  95. if (!filesize($file)) {
  96. chmod($file, 0666);
  97. }
  98. fwrite($handle, $msg);
  99. fclose($handle);
  100. }
  101. }
  102. flush();
  103. } catch (\Exception $e) {
  104. // do nothing
  105. }
  106. }
  107. }
  108. if (!function_exists('is_locked')) {
  109. /**
  110. * 检查任务是否已被锁定
  111. *
  112. * @param string $taskName
  113. * @param bool $always 是否被永久锁定
  114. *
  115. * @return bool
  116. * @throws Exception
  117. */
  118. function is_locked($taskName = '', $always = false)
  119. {
  120. try {
  121. $lock = sprintf(
  122. '%s/num_limit/%s/%s.lock',
  123. APP_PATH,
  124. $always ? 'always' : date('Y-m-d'),
  125. $taskName
  126. );
  127. return file_exists($lock);
  128. } catch (\Exception $e) {
  129. system_log(sprintf('检查任务%s是否锁定时出错,错误原因:%s', $taskName, $e->getMessage()));
  130. }
  131. return false;
  132. }
  133. }
  134. if (!function_exists('lock_task')) {
  135. /**
  136. * 锁定任务
  137. *
  138. * 防止重复执行
  139. *
  140. * @param string $taskName
  141. * @param bool $always 是否永久锁定
  142. *
  143. * @return bool
  144. */
  145. function lock_task($taskName = '', $always = false)
  146. {
  147. try {
  148. $lock = sprintf(
  149. '%s/num_limit/%s/%s.lock',
  150. APP_PATH,
  151. $always ? 'always' : date('Y-m-d'),
  152. $taskName
  153. );
  154. $path = dirname($lock);
  155. if (!is_dir($path)) {
  156. mkdir($path, 0777, true);
  157. chmod($path, 0777);
  158. }
  159. if (file_exists($lock)) {
  160. return true;
  161. }
  162. $handle = fopen($lock, 'a'); // 追加而非覆盖
  163. if (!filesize($lock)) {
  164. chmod($lock, 0666);
  165. }
  166. fwrite($handle, sprintf(
  167. "Locked at %s.\n",
  168. date('Y-m-d H:i:s')
  169. )
  170. );
  171. fclose($handle);
  172. Log::info(sprintf('%s已被锁定,此任务%s已不会再执行,请知悉', $taskName, $always ? '' : '今天内'));
  173. } catch (\Exception $e) {
  174. system_log(sprintf('创建锁定任务文件%s时出错,错误原因:%s', $lock, $e->getMessage()));
  175. return false;
  176. }
  177. return true;
  178. }
  179. }
  180. if (!function_exists('env')) {
  181. /**
  182. * 获取环境变量值
  183. *
  184. * @param string $key
  185. * @param string $default 默认值
  186. *
  187. * @return array | bool | false | null | string
  188. */
  189. function env($key = '', $default = null)
  190. {
  191. return Env::getInstance()->get($key, $default);
  192. }
  193. }
  194. if (!function_exists('get_argv')) {
  195. /**
  196. * 获取命令行传参
  197. *
  198. * @param string $name
  199. * @param string $default 默认值
  200. *
  201. * @return mixed|string
  202. */
  203. function get_argv(string $name, string $default = '')
  204. {
  205. return Argv::getInstance()->get($name, $default);
  206. }
  207. }
  208. if (!function_exists('system_check')) {
  209. /**
  210. * 检查环境是否满足要求
  211. *
  212. * @throws LlfException
  213. */
  214. function system_check()
  215. {
  216. // 由于各种云函数目前支持的最大的 PHP 版本为 7.2,故此处暂时不强制要求升级 PHP 7.3 以获得更好的兼容性
  217. if (version_compare(PHP_VERSION, '7.2.0') < 0) {
  218. throw new LlfException(34520006, ['7.3', PHP_VERSION]);
  219. }
  220. // 特殊环境无需检查这几项
  221. if (IS_SCF || !is_writable(ROOT_PATH) || (int)env('IS_KOYEB') === 1 || (int)env('IS_HEROKU') === 1) {
  222. system_log(lang('100009'));
  223. } else {
  224. if (!function_exists('putenv')) {
  225. throw new LlfException(34520005);
  226. }
  227. $envFile = ROOT_PATH . '/.env';
  228. if (!file_exists($envFile)) {
  229. throw new LlfException(copy(ROOT_PATH . '/.env.example', $envFile) ? 34520007 : 34520008);
  230. }
  231. // 检查当前 .env 文件版本是否过低,过低自动升级
  232. MigrateEnvFile::getInstance()->handle();
  233. }
  234. // 是否有新版可用
  235. if (config('new_version_detection')) {
  236. Upgrade::getInstance()->handle();
  237. } else {
  238. system_log(lang('100012'));
  239. }
  240. if (!extension_loaded('curl')) {
  241. throw new LlfException(34520010);
  242. }
  243. }
  244. }
  245. if (!function_exists('get_local_num')) {
  246. /**
  247. * 获取当地数字
  248. *
  249. * @param string|int $num
  250. *
  251. * @return string
  252. */
  253. function get_local_num($num)
  254. {
  255. $num = (string)$num;
  256. if (is_chinese()) {
  257. return $num;
  258. }
  259. // 英文数字规则
  260. $lastDigit = substr($num, -1);
  261. switch ($lastDigit) {
  262. case '1':
  263. return $num . 'st';
  264. case '2':
  265. return $num . 'nd';
  266. case '3':
  267. return $num . 'rd';
  268. default:
  269. return $num . 'th';
  270. }
  271. }
  272. }
  273. if (!function_exists('is_chinese')) {
  274. /**
  275. * 判断当前语言环境
  276. *
  277. * @return bool
  278. */
  279. function is_chinese()
  280. {
  281. return config('custom_language', 'zh') === 'zh';
  282. }
  283. }
  284. if (!function_exists('get_ip_info')) {
  285. /**
  286. * 获取 ip 信息
  287. *
  288. * @return string
  289. */
  290. function get_ip_info()
  291. {
  292. return \Luolongfei\Libs\IP::getInstance()->get();
  293. }
  294. }
  295. if (!function_exists('get_random_user_agent')) {
  296. /**
  297. * 获取随机 user-agent
  298. *
  299. * @return string
  300. */
  301. function get_random_user_agent()
  302. {
  303. $chromeVersions = [
  304. '103.0.0.0',
  305. '74.0.3729.129',
  306. '76.0.3780.3',
  307. '76.0.3780.2',
  308. '74.0.3729.128',
  309. '76.0.3780.1',
  310. '76.0.3780.0',
  311. '75.0.3770.15',
  312. '74.0.3729.127',
  313. '74.0.3729.126',
  314. '76.0.3779.1',
  315. '76.0.3779.0',
  316. '75.0.3770.14',
  317. '74.0.3729.125',
  318. '76.0.3778.1',
  319. '76.0.3778.0',
  320. '75.0.3770.13',
  321. '74.0.3729.124',
  322. '74.0.3729.123',
  323. '73.0.3683.121',
  324. '76.0.3777.1',
  325. '76.0.3777.0',
  326. '75.0.3770.12',
  327. '74.0.3729.122',
  328. '76.0.3776.4',
  329. '75.0.3770.11',
  330. '74.0.3729.121',
  331. '76.0.3776.3',
  332. '76.0.3776.2',
  333. '73.0.3683.120',
  334. '74.0.3729.120',
  335. '74.0.3729.119',
  336. '74.0.3729.118',
  337. '76.0.3776.1',
  338. '76.0.3776.0',
  339. '76.0.3775.5',
  340. '75.0.3770.10',
  341. '74.0.3729.117',
  342. '76.0.3775.4',
  343. '76.0.3775.3',
  344. '74.0.3729.116',
  345. '75.0.3770.9',
  346. '76.0.3775.2',
  347. '76.0.3775.1',
  348. '76.0.3775.0',
  349. '75.0.3770.8',
  350. '74.0.3729.115',
  351. '74.0.3729.114',
  352. '76.0.3774.1',
  353. '76.0.3774.0',
  354. '75.0.3770.7',
  355. '74.0.3729.113',
  356. '74.0.3729.112',
  357. '74.0.3729.111',
  358. '76.0.3773.1',
  359. '76.0.3773.0',
  360. '75.0.3770.6',
  361. '74.0.3729.110',
  362. '74.0.3729.109',
  363. '76.0.3772.1',
  364. '76.0.3772.0',
  365. '75.0.3770.5',
  366. '74.0.3729.108',
  367. '74.0.3729.107',
  368. '76.0.3771.1',
  369. '76.0.3771.0',
  370. '75.0.3770.4',
  371. '74.0.3729.106',
  372. '74.0.3729.105',
  373. '75.0.3770.3',
  374. '74.0.3729.104',
  375. '74.0.3729.103',
  376. '74.0.3729.102',
  377. '75.0.3770.2',
  378. '74.0.3729.101',
  379. '75.0.3770.1',
  380. '75.0.3770.0',
  381. '74.0.3729.100',
  382. '75.0.3769.5',
  383. '75.0.3769.4',
  384. '74.0.3729.99',
  385. '75.0.3769.3',
  386. '75.0.3769.2',
  387. '75.0.3768.6',
  388. '74.0.3729.98',
  389. '75.0.3769.1',
  390. '75.0.3769.0',
  391. '74.0.3729.97',
  392. '73.0.3683.119',
  393. '73.0.3683.118',
  394. '74.0.3729.96',
  395. '75.0.3768.5',
  396. '75.0.3768.4',
  397. '75.0.3768.3',
  398. '75.0.3768.2',
  399. '74.0.3729.95',
  400. '74.0.3729.94',
  401. '75.0.3768.1',
  402. '75.0.3768.0',
  403. '74.0.3729.93',
  404. '74.0.3729.92',
  405. '73.0.3683.117',
  406. '74.0.3729.91',
  407. '75.0.3766.3',
  408. '74.0.3729.90',
  409. '75.0.3767.2',
  410. '75.0.3767.1',
  411. '75.0.3767.0',
  412. '74.0.3729.89',
  413. '73.0.3683.116',
  414. '75.0.3766.2',
  415. '74.0.3729.88',
  416. '75.0.3766.1',
  417. '75.0.3766.0',
  418. '74.0.3729.87',
  419. '73.0.3683.115',
  420. '74.0.3729.86',
  421. '75.0.3765.1',
  422. '75.0.3765.0',
  423. '74.0.3729.85',
  424. '73.0.3683.114',
  425. '74.0.3729.84',
  426. '75.0.3764.1',
  427. '75.0.3764.0',
  428. '74.0.3729.83',
  429. '73.0.3683.113',
  430. '75.0.3763.2',
  431. '75.0.3761.4',
  432. '74.0.3729.82',
  433. '75.0.3763.1',
  434. '75.0.3763.0',
  435. '74.0.3729.81',
  436. '73.0.3683.112',
  437. '75.0.3762.1',
  438. '75.0.3762.0',
  439. '74.0.3729.80',
  440. '75.0.3761.3',
  441. '74.0.3729.79',
  442. '73.0.3683.111',
  443. '75.0.3761.2',
  444. '74.0.3729.78',
  445. '74.0.3729.77',
  446. '75.0.3761.1',
  447. '75.0.3761.0',
  448. '73.0.3683.110',
  449. '74.0.3729.76',
  450. '74.0.3729.75',
  451. '75.0.3760.0',
  452. '74.0.3729.74',
  453. '75.0.3759.8',
  454. '75.0.3759.7',
  455. '75.0.3759.6',
  456. '74.0.3729.73',
  457. '75.0.3759.5',
  458. '74.0.3729.72',
  459. '73.0.3683.109',
  460. '75.0.3759.4',
  461. '75.0.3759.3',
  462. '74.0.3729.71',
  463. '75.0.3759.2',
  464. '74.0.3729.70',
  465. '73.0.3683.108',
  466. '74.0.3729.69',
  467. '75.0.3759.1',
  468. '75.0.3759.0',
  469. '74.0.3729.68',
  470. '73.0.3683.107',
  471. '74.0.3729.67',
  472. '75.0.3758.1',
  473. '75.0.3758.0',
  474. '74.0.3729.66',
  475. '73.0.3683.106',
  476. '74.0.3729.65',
  477. '75.0.3757.1',
  478. '75.0.3757.0',
  479. '74.0.3729.64',
  480. '73.0.3683.105',
  481. '74.0.3729.63',
  482. '75.0.3756.1',
  483. '75.0.3756.0',
  484. '74.0.3729.62',
  485. '73.0.3683.104',
  486. '75.0.3755.3',
  487. '75.0.3755.2',
  488. '73.0.3683.103',
  489. '75.0.3755.1',
  490. '75.0.3755.0',
  491. '74.0.3729.61',
  492. '73.0.3683.102',
  493. '74.0.3729.60',
  494. '75.0.3754.2',
  495. '74.0.3729.59',
  496. '75.0.3753.4',
  497. '74.0.3729.58',
  498. '75.0.3754.1',
  499. '75.0.3754.0',
  500. '74.0.3729.57',
  501. '73.0.3683.101',
  502. '75.0.3753.3',
  503. '75.0.3752.2',
  504. '75.0.3753.2',
  505. '74.0.3729.56',
  506. '75.0.3753.1',
  507. '75.0.3753.0',
  508. '74.0.3729.55',
  509. '73.0.3683.100',
  510. '74.0.3729.54',
  511. '75.0.3752.1',
  512. '75.0.3752.0',
  513. '74.0.3729.53',
  514. '73.0.3683.99',
  515. '74.0.3729.52',
  516. '75.0.3751.1',
  517. '75.0.3751.0',
  518. '74.0.3729.51',
  519. '73.0.3683.98',
  520. '74.0.3729.50',
  521. '75.0.3750.0',
  522. '74.0.3729.49',
  523. '74.0.3729.48',
  524. '74.0.3729.47',
  525. '75.0.3749.3',
  526. '74.0.3729.46',
  527. '73.0.3683.97',
  528. '75.0.3749.2',
  529. '74.0.3729.45',
  530. '75.0.3749.1',
  531. '75.0.3749.0',
  532. '74.0.3729.44',
  533. '73.0.3683.96',
  534. '74.0.3729.43',
  535. '74.0.3729.42',
  536. '75.0.3748.1',
  537. '75.0.3748.0',
  538. '74.0.3729.41',
  539. '75.0.3747.1',
  540. '73.0.3683.95',
  541. '75.0.3746.4',
  542. '74.0.3729.40',
  543. '74.0.3729.39',
  544. '75.0.3747.0',
  545. '75.0.3746.3',
  546. '75.0.3746.2',
  547. '74.0.3729.38',
  548. '75.0.3746.1',
  549. '75.0.3746.0',
  550. '74.0.3729.37',
  551. '73.0.3683.94',
  552. '75.0.3745.5',
  553. '75.0.3745.4',
  554. '75.0.3745.3',
  555. '75.0.3745.2',
  556. '74.0.3729.36',
  557. '75.0.3745.1',
  558. '75.0.3745.0',
  559. '75.0.3744.2',
  560. '74.0.3729.35',
  561. '73.0.3683.93',
  562. '74.0.3729.34',
  563. '75.0.3744.1',
  564. '75.0.3744.0',
  565. '74.0.3729.33',
  566. '73.0.3683.92',
  567. '74.0.3729.32',
  568. '74.0.3729.31',
  569. '73.0.3683.91',
  570. '75.0.3741.2',
  571. '75.0.3740.5',
  572. '74.0.3729.30',
  573. '75.0.3741.1',
  574. '75.0.3741.0',
  575. '74.0.3729.29',
  576. '75.0.3740.4',
  577. '73.0.3683.90',
  578. '74.0.3729.28',
  579. '75.0.3740.3',
  580. '73.0.3683.89',
  581. '75.0.3740.2',
  582. '74.0.3729.27',
  583. '75.0.3740.1',
  584. '75.0.3740.0',
  585. '74.0.3729.26',
  586. '73.0.3683.88',
  587. '73.0.3683.87',
  588. '74.0.3729.25',
  589. '75.0.3739.1',
  590. '75.0.3739.0',
  591. '73.0.3683.86',
  592. '74.0.3729.24',
  593. '73.0.3683.85',
  594. '75.0.3738.4',
  595. '75.0.3738.3',
  596. '75.0.3738.2',
  597. '75.0.3738.1',
  598. '75.0.3738.0',
  599. '74.0.3729.23',
  600. '73.0.3683.84',
  601. '74.0.3729.22',
  602. '74.0.3729.21',
  603. '75.0.3737.1',
  604. '75.0.3737.0',
  605. '74.0.3729.20',
  606. '73.0.3683.83',
  607. '74.0.3729.19',
  608. '75.0.3736.1',
  609. '75.0.3736.0',
  610. '74.0.3729.18',
  611. '73.0.3683.82',
  612. '74.0.3729.17',
  613. '75.0.3735.1',
  614. '75.0.3735.0',
  615. '74.0.3729.16',
  616. '73.0.3683.81',
  617. '75.0.3734.1',
  618. '75.0.3734.0',
  619. '74.0.3729.15',
  620. '73.0.3683.80',
  621. '74.0.3729.14',
  622. '75.0.3733.1',
  623. '75.0.3733.0',
  624. '75.0.3732.1',
  625. '74.0.3729.13',
  626. '74.0.3729.12',
  627. '73.0.3683.79',
  628. '74.0.3729.11',
  629. '75.0.3732.0',
  630. '74.0.3729.10',
  631. '73.0.3683.78',
  632. '74.0.3729.9',
  633. '74.0.3729.8',
  634. '74.0.3729.7',
  635. '75.0.3731.3',
  636. '75.0.3731.2',
  637. '75.0.3731.0',
  638. '74.0.3729.6',
  639. '73.0.3683.77',
  640. '73.0.3683.76',
  641. '75.0.3730.5',
  642. '75.0.3730.4',
  643. '73.0.3683.75',
  644. '74.0.3729.5',
  645. '73.0.3683.74',
  646. '75.0.3730.3',
  647. '75.0.3730.2',
  648. '74.0.3729.4',
  649. '73.0.3683.73',
  650. '73.0.3683.72',
  651. '75.0.3730.1',
  652. '75.0.3730.0',
  653. '74.0.3729.3',
  654. '73.0.3683.71',
  655. '74.0.3729.2',
  656. '73.0.3683.70',
  657. '74.0.3729.1',
  658. '74.0.3729.0',
  659. '74.0.3726.4',
  660. '73.0.3683.69',
  661. '74.0.3726.3',
  662. '74.0.3728.0',
  663. '74.0.3726.2',
  664. '73.0.3683.68',
  665. '74.0.3726.1',
  666. '74.0.3726.0',
  667. '74.0.3725.4',
  668. '73.0.3683.67',
  669. '73.0.3683.66',
  670. '74.0.3725.3',
  671. '74.0.3725.2',
  672. '74.0.3725.1',
  673. '74.0.3724.8',
  674. '74.0.3725.0',
  675. '73.0.3683.65',
  676. '74.0.3724.7',
  677. '74.0.3724.6',
  678. '74.0.3724.5',
  679. '74.0.3724.4',
  680. '74.0.3724.3',
  681. '74.0.3724.2',
  682. '74.0.3724.1',
  683. '74.0.3724.0',
  684. '73.0.3683.64',
  685. '74.0.3723.1',
  686. '74.0.3723.0',
  687. '73.0.3683.63',
  688. '74.0.3722.1',
  689. '74.0.3722.0',
  690. '73.0.3683.62',
  691. '74.0.3718.9',
  692. '74.0.3702.3',
  693. '74.0.3721.3',
  694. '74.0.3721.2',
  695. '74.0.3721.1',
  696. '74.0.3721.0',
  697. '74.0.3720.6',
  698. '73.0.3683.61',
  699. '72.0.3626.122',
  700. '73.0.3683.60',
  701. '74.0.3720.5',
  702. '72.0.3626.121',
  703. '74.0.3718.8',
  704. '74.0.3720.4',
  705. '74.0.3720.3',
  706. '74.0.3718.7',
  707. '74.0.3720.2',
  708. '74.0.3720.1',
  709. '74.0.3720.0',
  710. '74.0.3718.6',
  711. '74.0.3719.5',
  712. '73.0.3683.59',
  713. '74.0.3718.5',
  714. '74.0.3718.4',
  715. '74.0.3719.4',
  716. '74.0.3719.3',
  717. '74.0.3719.2',
  718. '74.0.3719.1',
  719. '73.0.3683.58',
  720. '74.0.3719.0',
  721. '73.0.3683.57',
  722. '73.0.3683.56',
  723. '74.0.3718.3',
  724. '73.0.3683.55',
  725. '74.0.3718.2',
  726. '74.0.3718.1',
  727. '74.0.3718.0',
  728. '73.0.3683.54',
  729. '74.0.3717.2',
  730. '73.0.3683.53',
  731. '74.0.3717.1',
  732. '74.0.3717.0',
  733. '73.0.3683.52',
  734. '74.0.3716.1',
  735. '74.0.3716.0',
  736. '73.0.3683.51',
  737. '74.0.3715.1',
  738. '74.0.3715.0',
  739. '73.0.3683.50',
  740. '74.0.3711.2',
  741. '74.0.3714.2',
  742. '74.0.3713.3',
  743. '74.0.3714.1',
  744. '74.0.3714.0',
  745. '73.0.3683.49',
  746. '74.0.3713.1',
  747. '74.0.3713.0',
  748. '72.0.3626.120',
  749. '73.0.3683.48',
  750. '74.0.3712.2',
  751. '74.0.3712.1',
  752. '74.0.3712.0',
  753. '73.0.3683.47',
  754. '72.0.3626.119',
  755. '73.0.3683.46',
  756. '74.0.3710.2',
  757. '72.0.3626.118',
  758. '74.0.3711.1',
  759. '74.0.3711.0',
  760. '73.0.3683.45',
  761. '72.0.3626.117',
  762. '74.0.3710.1',
  763. '74.0.3710.0',
  764. '73.0.3683.44',
  765. '72.0.3626.116',
  766. '74.0.3709.1',
  767. '74.0.3709.0',
  768. '74.0.3704.9',
  769. '73.0.3683.43',
  770. '72.0.3626.115',
  771. '74.0.3704.8',
  772. '74.0.3704.7',
  773. '74.0.3708.0',
  774. '74.0.3706.7',
  775. '74.0.3704.6',
  776. '73.0.3683.42',
  777. '72.0.3626.114',
  778. '74.0.3706.6',
  779. '72.0.3626.113',
  780. '74.0.3704.5',
  781. '74.0.3706.5',
  782. '74.0.3706.4',
  783. '74.0.3706.3',
  784. '74.0.3706.2',
  785. '74.0.3706.1',
  786. '74.0.3706.0',
  787. '73.0.3683.41',
  788. '72.0.3626.112',
  789. '74.0.3705.1',
  790. '74.0.3705.0',
  791. '73.0.3683.40',
  792. '72.0.3626.111',
  793. '73.0.3683.39',
  794. '74.0.3704.4',
  795. '73.0.3683.38',
  796. '74.0.3704.3',
  797. '74.0.3704.2',
  798. '74.0.3704.1',
  799. '74.0.3704.0',
  800. '73.0.3683.37',
  801. '72.0.3626.110',
  802. '72.0.3626.109',
  803. '74.0.3703.3',
  804. '74.0.3703.2',
  805. '73.0.3683.36',
  806. '74.0.3703.1',
  807. '74.0.3703.0',
  808. '73.0.3683.35',
  809. '72.0.3626.108',
  810. '74.0.3702.2',
  811. '74.0.3699.3',
  812. '74.0.3702.1',
  813. '74.0.3702.0',
  814. '73.0.3683.34',
  815. '72.0.3626.107',
  816. '73.0.3683.33',
  817. '74.0.3701.1',
  818. '74.0.3701.0',
  819. '73.0.3683.32',
  820. '73.0.3683.31',
  821. '72.0.3626.105',
  822. '74.0.3700.1',
  823. '74.0.3700.0',
  824. '73.0.3683.29',
  825. '72.0.3626.103',
  826. '74.0.3699.2',
  827. '74.0.3699.1',
  828. '74.0.3699.0',
  829. '73.0.3683.28',
  830. '72.0.3626.102',
  831. '73.0.3683.27',
  832. '73.0.3683.26',
  833. '74.0.3698.0',
  834. '74.0.3696.2',
  835. '72.0.3626.101',
  836. '73.0.3683.25',
  837. '74.0.3696.1',
  838. '74.0.3696.0',
  839. '74.0.3694.8',
  840. '72.0.3626.100',
  841. '74.0.3694.7',
  842. '74.0.3694.6',
  843. '74.0.3694.5',
  844. '74.0.3694.4',
  845. '72.0.3626.99',
  846. '72.0.3626.98',
  847. '74.0.3694.3',
  848. '73.0.3683.24',
  849. '72.0.3626.97',
  850. '72.0.3626.96',
  851. '72.0.3626.95',
  852. '73.0.3683.23',
  853. '72.0.3626.94',
  854. '73.0.3683.22',
  855. '73.0.3683.21',
  856. '72.0.3626.93',
  857. '74.0.3694.2',
  858. '72.0.3626.92',
  859. '74.0.3694.1',
  860. '74.0.3694.0',
  861. '74.0.3693.6',
  862. '73.0.3683.20',
  863. '72.0.3626.91',
  864. '74.0.3693.5',
  865. '74.0.3693.4',
  866. '74.0.3693.3',
  867. '74.0.3693.2',
  868. '73.0.3683.19',
  869. '74.0.3693.1',
  870. '74.0.3693.0',
  871. '73.0.3683.18',
  872. '72.0.3626.90',
  873. '74.0.3692.1',
  874. '74.0.3692.0',
  875. '73.0.3683.17',
  876. '72.0.3626.89',
  877. '74.0.3687.3',
  878. '74.0.3691.1',
  879. '74.0.3691.0',
  880. '73.0.3683.16',
  881. '72.0.3626.88',
  882. '72.0.3626.87',
  883. '73.0.3683.15',
  884. '74.0.3690.1',
  885. '74.0.3690.0',
  886. '73.0.3683.14',
  887. '72.0.3626.86',
  888. '73.0.3683.13',
  889. '73.0.3683.12',
  890. '74.0.3689.1',
  891. '74.0.3689.0',
  892. '73.0.3683.11',
  893. '72.0.3626.85',
  894. '73.0.3683.10',
  895. '72.0.3626.84',
  896. '73.0.3683.9',
  897. '74.0.3688.1',
  898. '74.0.3688.0',
  899. '73.0.3683.8',
  900. '72.0.3626.83',
  901. '74.0.3687.2',
  902. '74.0.3687.1',
  903. '74.0.3687.0',
  904. '73.0.3683.7',
  905. '72.0.3626.82',
  906. '74.0.3686.4',
  907. '72.0.3626.81',
  908. '74.0.3686.3',
  909. '74.0.3686.2',
  910. '74.0.3686.1',
  911. '74.0.3686.0',
  912. '73.0.3683.6',
  913. '72.0.3626.80',
  914. '74.0.3685.1',
  915. '74.0.3685.0',
  916. '73.0.3683.5',
  917. '72.0.3626.79',
  918. '74.0.3684.1',
  919. '74.0.3684.0',
  920. '73.0.3683.4',
  921. '72.0.3626.78',
  922. '72.0.3626.77',
  923. '73.0.3683.3',
  924. '73.0.3683.2',
  925. '72.0.3626.76',
  926. '73.0.3683.1',
  927. '73.0.3683.0',
  928. '72.0.3626.75',
  929. '71.0.3578.141',
  930. '73.0.3682.1',
  931. '73.0.3682.0',
  932. '72.0.3626.74',
  933. '71.0.3578.140',
  934. '73.0.3681.4',
  935. '73.0.3681.3',
  936. '73.0.3681.2',
  937. '73.0.3681.1',
  938. '73.0.3681.0',
  939. '72.0.3626.73',
  940. '71.0.3578.139',
  941. '72.0.3626.72',
  942. '72.0.3626.71',
  943. '73.0.3680.1',
  944. '73.0.3680.0',
  945. '72.0.3626.70',
  946. '71.0.3578.138',
  947. '73.0.3678.2',
  948. '73.0.3679.1',
  949. '73.0.3679.0',
  950. '72.0.3626.69',
  951. '71.0.3578.137',
  952. '73.0.3678.1',
  953. '73.0.3678.0',
  954. '71.0.3578.136',
  955. '73.0.3677.1',
  956. '73.0.3677.0',
  957. '72.0.3626.68',
  958. '72.0.3626.67',
  959. '71.0.3578.135',
  960. '73.0.3676.1',
  961. '73.0.3676.0',
  962. '73.0.3674.2',
  963. '72.0.3626.66',
  964. '71.0.3578.134',
  965. '73.0.3674.1',
  966. '73.0.3674.0',
  967. '72.0.3626.65',
  968. '71.0.3578.133',
  969. '73.0.3673.2',
  970. '73.0.3673.1',
  971. '73.0.3673.0',
  972. '72.0.3626.64',
  973. '71.0.3578.132',
  974. '72.0.3626.63',
  975. '72.0.3626.62',
  976. '72.0.3626.61',
  977. '72.0.3626.60',
  978. '73.0.3672.1',
  979. '73.0.3672.0',
  980. '72.0.3626.59',
  981. '71.0.3578.131',
  982. '73.0.3671.3',
  983. '73.0.3671.2',
  984. '73.0.3671.1',
  985. '73.0.3671.0',
  986. '72.0.3626.58',
  987. '71.0.3578.130',
  988. '73.0.3670.1',
  989. '73.0.3670.0',
  990. '72.0.3626.57',
  991. '71.0.3578.129',
  992. '73.0.3669.1',
  993. '73.0.3669.0',
  994. '72.0.3626.56',
  995. '71.0.3578.128',
  996. '73.0.3668.2',
  997. '73.0.3668.1',
  998. '73.0.3668.0',
  999. '72.0.3626.55',
  1000. '71.0.3578.127',
  1001. '73.0.3667.2',
  1002. '73.0.3667.1',
  1003. '73.0.3667.0',
  1004. '72.0.3626.54',
  1005. '71.0.3578.126',
  1006. '73.0.3666.1',
  1007. '73.0.3666.0',
  1008. '72.0.3626.53',
  1009. '71.0.3578.125',
  1010. '73.0.3665.4',
  1011. '73.0.3665.3',
  1012. '72.0.3626.52',
  1013. '73.0.3665.2',
  1014. '73.0.3664.4',
  1015. '73.0.3665.1',
  1016. '73.0.3665.0',
  1017. '72.0.3626.51',
  1018. '71.0.3578.124',
  1019. '72.0.3626.50',
  1020. '73.0.3664.3',
  1021. '73.0.3664.2',
  1022. '73.0.3664.1',
  1023. '73.0.3664.0',
  1024. '73.0.3663.2',
  1025. '72.0.3626.49',
  1026. '71.0.3578.123',
  1027. '73.0.3663.1',
  1028. '73.0.3663.0',
  1029. '72.0.3626.48',
  1030. '71.0.3578.122',
  1031. '73.0.3662.1',
  1032. '73.0.3662.0',
  1033. '72.0.3626.47',
  1034. '71.0.3578.121',
  1035. '73.0.3661.1',
  1036. '72.0.3626.46',
  1037. '73.0.3661.0',
  1038. '72.0.3626.45',
  1039. '71.0.3578.120',
  1040. '73.0.3660.2',
  1041. '73.0.3660.1',
  1042. '73.0.3660.0',
  1043. '72.0.3626.44',
  1044. '71.0.3578.119',
  1045. '73.0.3659.1',
  1046. '73.0.3659.0',
  1047. '72.0.3626.43',
  1048. '71.0.3578.118',
  1049. '73.0.3658.1',
  1050. '73.0.3658.0',
  1051. '72.0.3626.42',
  1052. '71.0.3578.117',
  1053. '73.0.3657.1',
  1054. '73.0.3657.0',
  1055. '72.0.3626.41',
  1056. '71.0.3578.116',
  1057. '73.0.3656.1',
  1058. '73.0.3656.0',
  1059. '72.0.3626.40',
  1060. '71.0.3578.115',
  1061. '73.0.3655.1',
  1062. '73.0.3655.0',
  1063. '72.0.3626.39',
  1064. '71.0.3578.114',
  1065. '73.0.3654.1',
  1066. '73.0.3654.0',
  1067. '72.0.3626.38',
  1068. '71.0.3578.113',
  1069. '73.0.3653.1',
  1070. '73.0.3653.0',
  1071. '72.0.3626.37',
  1072. '71.0.3578.112',
  1073. '73.0.3652.1',
  1074. '73.0.3652.0',
  1075. '72.0.3626.36',
  1076. '71.0.3578.111',
  1077. '73.0.3651.1',
  1078. '73.0.3651.0',
  1079. '72.0.3626.35',
  1080. '71.0.3578.110',
  1081. '73.0.3650.1',
  1082. '73.0.3650.0',
  1083. '72.0.3626.34',
  1084. '71.0.3578.109',
  1085. '73.0.3649.1',
  1086. '73.0.3649.0',
  1087. '72.0.3626.33',
  1088. '71.0.3578.108',
  1089. '73.0.3648.2',
  1090. '73.0.3648.1',
  1091. '73.0.3648.0',
  1092. '72.0.3626.32',
  1093. '71.0.3578.107',
  1094. '73.0.3647.2',
  1095. '73.0.3647.1',
  1096. '73.0.3647.0',
  1097. '72.0.3626.31',
  1098. '71.0.3578.106',
  1099. '73.0.3635.3',
  1100. '73.0.3646.2',
  1101. '73.0.3646.1',
  1102. '73.0.3646.0',
  1103. '72.0.3626.30',
  1104. '71.0.3578.105',
  1105. '72.0.3626.29',
  1106. '73.0.3645.2',
  1107. '73.0.3645.1',
  1108. '73.0.3645.0',
  1109. '72.0.3626.28',
  1110. '71.0.3578.104',
  1111. '72.0.3626.27',
  1112. '72.0.3626.26',
  1113. '72.0.3626.25',
  1114. '72.0.3626.24',
  1115. '73.0.3644.0',
  1116. '73.0.3643.2',
  1117. '72.0.3626.23',
  1118. '71.0.3578.103',
  1119. '73.0.3643.1',
  1120. '73.0.3643.0',
  1121. '72.0.3626.22',
  1122. '71.0.3578.102',
  1123. '73.0.3642.1',
  1124. '73.0.3642.0',
  1125. '72.0.3626.21',
  1126. '71.0.3578.101',
  1127. '73.0.3641.1',
  1128. '73.0.3641.0',
  1129. '72.0.3626.20',
  1130. '71.0.3578.100',
  1131. '72.0.3626.19',
  1132. '73.0.3640.1',
  1133. '73.0.3640.0',
  1134. '72.0.3626.18',
  1135. '73.0.3639.1',
  1136. '71.0.3578.99',
  1137. '73.0.3639.0',
  1138. '72.0.3626.17',
  1139. '73.0.3638.2',
  1140. '72.0.3626.16',
  1141. '73.0.3638.1',
  1142. '73.0.3638.0',
  1143. '72.0.3626.15',
  1144. '71.0.3578.98',
  1145. '73.0.3635.2',
  1146. '71.0.3578.97',
  1147. '73.0.3637.1',
  1148. '73.0.3637.0',
  1149. '72.0.3626.14',
  1150. '71.0.3578.96',
  1151. '71.0.3578.95',
  1152. '72.0.3626.13',
  1153. '71.0.3578.94',
  1154. '73.0.3636.2',
  1155. '71.0.3578.93',
  1156. '73.0.3636.1',
  1157. '73.0.3636.0',
  1158. '72.0.3626.12',
  1159. '71.0.3578.92',
  1160. '73.0.3635.1',
  1161. '73.0.3635.0',
  1162. '72.0.3626.11',
  1163. '71.0.3578.91',
  1164. '73.0.3634.2',
  1165. '73.0.3634.1',
  1166. '73.0.3634.0',
  1167. '72.0.3626.10',
  1168. '71.0.3578.90',
  1169. '71.0.3578.89',
  1170. '73.0.3633.2',
  1171. '73.0.3633.1',
  1172. '73.0.3633.0',
  1173. '72.0.3610.4',
  1174. '72.0.3626.9',
  1175. '71.0.3578.88',
  1176. '73.0.3632.5',
  1177. '73.0.3632.4',
  1178. '73.0.3632.3',
  1179. '73.0.3632.2',
  1180. '73.0.3632.1',
  1181. '73.0.3632.0',
  1182. '72.0.3626.8',
  1183. '71.0.3578.87',
  1184. '73.0.3631.2',
  1185. '73.0.3631.1',
  1186. '73.0.3631.0',
  1187. '72.0.3626.7',
  1188. '71.0.3578.86',
  1189. '72.0.3626.6',
  1190. '73.0.3630.1',
  1191. '73.0.3630.0',
  1192. '72.0.3626.5',
  1193. '71.0.3578.85',
  1194. '72.0.3626.4',
  1195. '73.0.3628.3',
  1196. '73.0.3628.2',
  1197. '73.0.3629.1',
  1198. '73.0.3629.0',
  1199. '72.0.3626.3',
  1200. '71.0.3578.84',
  1201. '73.0.3628.1',
  1202. '73.0.3628.0',
  1203. '71.0.3578.83',
  1204. '73.0.3627.1',
  1205. '73.0.3627.0',
  1206. '72.0.3626.2',
  1207. '71.0.3578.82',
  1208. '71.0.3578.81',
  1209. '71.0.3578.80',
  1210. '72.0.3626.1',
  1211. '72.0.3626.0',
  1212. '71.0.3578.79',
  1213. '70.0.3538.124',
  1214. '71.0.3578.78',
  1215. '72.0.3623.4',
  1216. '72.0.3625.2',
  1217. '72.0.3625.1',
  1218. '72.0.3625.0',
  1219. '71.0.3578.77',
  1220. '70.0.3538.123',
  1221. '72.0.3624.4',
  1222. '72.0.3624.3',
  1223. '72.0.3624.2',
  1224. '71.0.3578.76',
  1225. '72.0.3624.1',
  1226. '72.0.3624.0',
  1227. '72.0.3623.3',
  1228. '71.0.3578.75',
  1229. '70.0.3538.122',
  1230. '71.0.3578.74',
  1231. '72.0.3623.2',
  1232. '72.0.3610.3',
  1233. '72.0.3623.1',
  1234. '72.0.3623.0',
  1235. '72.0.3622.3',
  1236. '72.0.3622.2',
  1237. '71.0.3578.73',
  1238. '70.0.3538.121',
  1239. '72.0.3622.1',
  1240. '72.0.3622.0',
  1241. '71.0.3578.72',
  1242. '70.0.3538.120',
  1243. '72.0.3621.1',
  1244. '72.0.3621.0',
  1245. '71.0.3578.71',
  1246. '70.0.3538.119',
  1247. '72.0.3620.1',
  1248. '72.0.3620.0',
  1249. '71.0.3578.70',
  1250. '70.0.3538.118',
  1251. '71.0.3578.69',
  1252. '72.0.3619.1',
  1253. '72.0.3619.0',
  1254. '71.0.3578.68',
  1255. '70.0.3538.117',
  1256. '71.0.3578.67',
  1257. '72.0.3618.1',
  1258. '72.0.3618.0',
  1259. '71.0.3578.66',
  1260. '70.0.3538.116',
  1261. '72.0.3617.1',
  1262. '72.0.3617.0',
  1263. '71.0.3578.65',
  1264. '70.0.3538.115',
  1265. '72.0.3602.3',
  1266. '71.0.3578.64',
  1267. '72.0.3616.1',
  1268. '72.0.3616.0',
  1269. '71.0.3578.63',
  1270. '70.0.3538.114',
  1271. '71.0.3578.62',
  1272. '72.0.3615.1',
  1273. '72.0.3615.0',
  1274. '71.0.3578.61',
  1275. '70.0.3538.113',
  1276. '72.0.3614.1',
  1277. '72.0.3614.0',
  1278. '71.0.3578.60',
  1279. '70.0.3538.112',
  1280. '72.0.3613.1',
  1281. '72.0.3613.0',
  1282. '71.0.3578.59',
  1283. '70.0.3538.111',
  1284. '72.0.3612.2',
  1285. '72.0.3612.1',
  1286. '72.0.3612.0',
  1287. '70.0.3538.110',
  1288. '71.0.3578.58',
  1289. '70.0.3538.109',
  1290. '72.0.3611.2',
  1291. '72.0.3611.1',
  1292. '72.0.3611.0',
  1293. '71.0.3578.57',
  1294. '70.0.3538.108',
  1295. '72.0.3610.2',
  1296. '71.0.3578.56',
  1297. '71.0.3578.55',
  1298. '72.0.3610.1',
  1299. '72.0.3610.0',
  1300. '71.0.3578.54',
  1301. '70.0.3538.107',
  1302. '71.0.3578.53',
  1303. '72.0.3609.3',
  1304. '71.0.3578.52',
  1305. '72.0.3609.2',
  1306. '71.0.3578.51',
  1307. '72.0.3608.5',
  1308. '72.0.3609.1',
  1309. '72.0.3609.0',
  1310. '71.0.3578.50',
  1311. '70.0.3538.106',
  1312. '72.0.3608.4',
  1313. '72.0.3608.3',
  1314. '72.0.3608.2',
  1315. '71.0.3578.49',
  1316. '72.0.3608.1',
  1317. '72.0.3608.0',
  1318. '70.0.3538.105',
  1319. '71.0.3578.48',
  1320. '72.0.3607.1',
  1321. '72.0.3607.0',
  1322. '71.0.3578.47',
  1323. '70.0.3538.104',
  1324. '72.0.3606.2',
  1325. '72.0.3606.1',
  1326. '72.0.3606.0',
  1327. '71.0.3578.46',
  1328. '70.0.3538.103',
  1329. '70.0.3538.102',
  1330. '72.0.3605.3',
  1331. '72.0.3605.2',
  1332. '72.0.3605.1',
  1333. '72.0.3605.0',
  1334. '71.0.3578.45',
  1335. '70.0.3538.101',
  1336. '71.0.3578.44',
  1337. '71.0.3578.43',
  1338. '70.0.3538.100',
  1339. '70.0.3538.99',
  1340. '71.0.3578.42',
  1341. '72.0.3604.1',
  1342. '72.0.3604.0',
  1343. '71.0.3578.41',
  1344. '70.0.3538.98',
  1345. '71.0.3578.40',
  1346. '72.0.3603.2',
  1347. '72.0.3603.1',
  1348. '72.0.3603.0',
  1349. '71.0.3578.39',
  1350. '70.0.3538.97',
  1351. '72.0.3602.2',
  1352. '71.0.3578.38',
  1353. '71.0.3578.37',
  1354. '72.0.3602.1',
  1355. '72.0.3602.0',
  1356. '71.0.3578.36',
  1357. '70.0.3538.96',
  1358. '72.0.3601.1',
  1359. '72.0.3601.0',
  1360. '71.0.3578.35',
  1361. '70.0.3538.95',
  1362. '72.0.3600.1',
  1363. '72.0.3600.0',
  1364. '71.0.3578.34',
  1365. '70.0.3538.94',
  1366. '72.0.3599.3',
  1367. '72.0.3599.2',
  1368. '72.0.3599.1',
  1369. '72.0.3599.0',
  1370. '71.0.3578.33',
  1371. '70.0.3538.93',
  1372. '72.0.3598.1',
  1373. '72.0.3598.0',
  1374. '71.0.3578.32',
  1375. '70.0.3538.87',
  1376. '72.0.3597.1',
  1377. '72.0.3597.0',
  1378. '72.0.3596.2',
  1379. '71.0.3578.31',
  1380. '70.0.3538.86',
  1381. '71.0.3578.30',
  1382. '71.0.3578.29',
  1383. '72.0.3596.1',
  1384. '72.0.3596.0',
  1385. '71.0.3578.28',
  1386. '70.0.3538.85',
  1387. '72.0.3595.2',
  1388. '72.0.3591.3',
  1389. '72.0.3595.1',
  1390. '72.0.3595.0',
  1391. '71.0.3578.27',
  1392. '70.0.3538.84',
  1393. '72.0.3594.1',
  1394. '72.0.3594.0',
  1395. '71.0.3578.26',
  1396. '70.0.3538.83',
  1397. '72.0.3593.2',
  1398. '72.0.3593.1',
  1399. '72.0.3593.0',
  1400. '71.0.3578.25',
  1401. '70.0.3538.82',
  1402. '72.0.3589.3',
  1403. '72.0.3592.2',
  1404. '72.0.3592.1',
  1405. '72.0.3592.0',
  1406. '71.0.3578.24',
  1407. '72.0.3589.2',
  1408. '70.0.3538.81',
  1409. '70.0.3538.80',
  1410. '72.0.3591.2',
  1411. '72.0.3591.1',
  1412. '72.0.3591.0',
  1413. '71.0.3578.23',
  1414. '70.0.3538.79',
  1415. '71.0.3578.22',
  1416. '72.0.3590.1',
  1417. '72.0.3590.0',
  1418. '71.0.3578.21',
  1419. '70.0.3538.78',
  1420. '70.0.3538.77',
  1421. '72.0.3589.1',
  1422. '72.0.3589.0',
  1423. '71.0.3578.20',
  1424. '70.0.3538.76',
  1425. '71.0.3578.19',
  1426. '70.0.3538.75',
  1427. '72.0.3588.1',
  1428. '72.0.3588.0',
  1429. '71.0.3578.18',
  1430. '70.0.3538.74',
  1431. '72.0.3586.2',
  1432. '72.0.3587.0',
  1433. '71.0.3578.17',
  1434. '70.0.3538.73',
  1435. '72.0.3586.1',
  1436. '72.0.3586.0',
  1437. '71.0.3578.16',
  1438. '70.0.3538.72',
  1439. '72.0.3585.1',
  1440. '72.0.3585.0',
  1441. '71.0.3578.15',
  1442. '70.0.3538.71',
  1443. '71.0.3578.14',
  1444. '72.0.3584.1',
  1445. '72.0.3584.0',
  1446. '71.0.3578.13',
  1447. '70.0.3538.70',
  1448. '72.0.3583.2',
  1449. '71.0.3578.12',
  1450. '72.0.3583.1',
  1451. '72.0.3583.0',
  1452. '71.0.3578.11',
  1453. '70.0.3538.69',
  1454. '71.0.3578.10',
  1455. '72.0.3582.0',
  1456. '72.0.3581.4',
  1457. '71.0.3578.9',
  1458. '70.0.3538.67',
  1459. '72.0.3581.3',
  1460. '72.0.3581.2',
  1461. '72.0.3581.1',
  1462. '72.0.3581.0',
  1463. '71.0.3578.8',
  1464. '70.0.3538.66',
  1465. '72.0.3580.1',
  1466. '72.0.3580.0',
  1467. '71.0.3578.7',
  1468. '70.0.3538.65',
  1469. '71.0.3578.6',
  1470. '72.0.3579.1',
  1471. '72.0.3579.0',
  1472. '71.0.3578.5',
  1473. '70.0.3538.64',
  1474. '71.0.3578.4',
  1475. '71.0.3578.3',
  1476. '71.0.3578.2',
  1477. '71.0.3578.1',
  1478. '71.0.3578.0',
  1479. '70.0.3538.63',
  1480. '69.0.3497.128',
  1481. '70.0.3538.62',
  1482. '70.0.3538.61',
  1483. '70.0.3538.60',
  1484. '70.0.3538.59',
  1485. '71.0.3577.1',
  1486. '71.0.3577.0',
  1487. '70.0.3538.58',
  1488. '69.0.3497.127',
  1489. '71.0.3576.2',
  1490. '71.0.3576.1',
  1491. '71.0.3576.0',
  1492. '70.0.3538.57',
  1493. '70.0.3538.56',
  1494. '71.0.3575.2',
  1495. '70.0.3538.55',
  1496. '69.0.3497.126',
  1497. '70.0.3538.54',
  1498. '71.0.3575.1',
  1499. '71.0.3575.0',
  1500. '71.0.3574.1',
  1501. '71.0.3574.0',
  1502. '70.0.3538.53',
  1503. '69.0.3497.125',
  1504. '70.0.3538.52',
  1505. '71.0.3573.1',
  1506. '71.0.3573.0',
  1507. '70.0.3538.51',
  1508. '69.0.3497.124',
  1509. '71.0.3572.1',
  1510. '71.0.3572.0',
  1511. '70.0.3538.50',
  1512. '69.0.3497.123',
  1513. '71.0.3571.2',
  1514. '70.0.3538.49',
  1515. '69.0.3497.122',
  1516. '71.0.3571.1',
  1517. '71.0.3571.0',
  1518. '70.0.3538.48',
  1519. '69.0.3497.121',
  1520. '71.0.3570.1',
  1521. '71.0.3570.0',
  1522. '70.0.3538.47',
  1523. '69.0.3497.120',
  1524. '71.0.3568.2',
  1525. '71.0.3569.1',
  1526. '71.0.3569.0',
  1527. '70.0.3538.46',
  1528. '69.0.3497.119',
  1529. '70.0.3538.45',
  1530. '71.0.3568.1',
  1531. '71.0.3568.0',
  1532. '70.0.3538.44',
  1533. '69.0.3497.118',
  1534. '70.0.3538.43',
  1535. '70.0.3538.42',
  1536. '71.0.3567.1',
  1537. '71.0.3567.0',
  1538. '70.0.3538.41',
  1539. '69.0.3497.117',
  1540. '71.0.3566.1',
  1541. '71.0.3566.0',
  1542. '70.0.3538.40',
  1543. '69.0.3497.116',
  1544. '71.0.3565.1',
  1545. '71.0.3565.0',
  1546. '70.0.3538.39',
  1547. '69.0.3497.115',
  1548. '71.0.3564.1',
  1549. '71.0.3564.0',
  1550. '70.0.3538.38',
  1551. '69.0.3497.114',
  1552. '71.0.3563.0',
  1553. '71.0.3562.2',
  1554. '70.0.3538.37',
  1555. '69.0.3497.113',
  1556. '70.0.3538.36',
  1557. '70.0.3538.35',
  1558. '71.0.3562.1',
  1559. '71.0.3562.0',
  1560. '70.0.3538.34',
  1561. '69.0.3497.112',
  1562. '70.0.3538.33',
  1563. '71.0.3561.1',
  1564. '71.0.3561.0',
  1565. '70.0.3538.32',
  1566. '69.0.3497.111',
  1567. '71.0.3559.6',
  1568. '71.0.3560.1',
  1569. '71.0.3560.0',
  1570. '71.0.3559.5',
  1571. '71.0.3559.4',
  1572. '70.0.3538.31',
  1573. '69.0.3497.110',
  1574. '71.0.3559.3',
  1575. '70.0.3538.30',
  1576. '69.0.3497.109',
  1577. '71.0.3559.2',
  1578. '71.0.3559.1',
  1579. '71.0.3559.0',
  1580. '70.0.3538.29',
  1581. '69.0.3497.108',
  1582. '71.0.3558.2',
  1583. '71.0.3558.1',
  1584. '71.0.3558.0',
  1585. '70.0.3538.28',
  1586. '69.0.3497.107',
  1587. '71.0.3557.2',
  1588. '71.0.3557.1',
  1589. '71.0.3557.0',
  1590. '70.0.3538.27',
  1591. '69.0.3497.106',
  1592. '71.0.3554.4',
  1593. '70.0.3538.26',
  1594. '71.0.3556.1',
  1595. '71.0.3556.0',
  1596. '70.0.3538.25',
  1597. '71.0.3554.3',
  1598. '69.0.3497.105',
  1599. '71.0.3554.2',
  1600. '70.0.3538.24',
  1601. '69.0.3497.104',
  1602. '71.0.3555.2',
  1603. '70.0.3538.23',
  1604. '71.0.3555.1',
  1605. '71.0.3555.0',
  1606. '70.0.3538.22',
  1607. '69.0.3497.103',
  1608. '71.0.3554.1',
  1609. '71.0.3554.0',
  1610. '70.0.3538.21',
  1611. '69.0.3497.102',
  1612. '71.0.3553.3',
  1613. '70.0.3538.20',
  1614. '69.0.3497.101',
  1615. '71.0.3553.2',
  1616. '69.0.3497.100',
  1617. '71.0.3553.1',
  1618. '71.0.3553.0',
  1619. '70.0.3538.19',
  1620. '69.0.3497.99',
  1621. '69.0.3497.98',
  1622. '69.0.3497.97',
  1623. '71.0.3552.6',
  1624. '71.0.3552.5',
  1625. '71.0.3552.4',
  1626. '71.0.3552.3',
  1627. '71.0.3552.2',
  1628. '71.0.3552.1',
  1629. '71.0.3552.0',
  1630. '70.0.3538.18',
  1631. '69.0.3497.96',
  1632. '71.0.3551.3',
  1633. '71.0.3551.2',
  1634. '71.0.3551.1',
  1635. '71.0.3551.0',
  1636. '70.0.3538.17',
  1637. '69.0.3497.95',
  1638. '71.0.3550.3',
  1639. '71.0.3550.2',
  1640. '71.0.3550.1',
  1641. '71.0.3550.0',
  1642. '70.0.3538.16',
  1643. '69.0.3497.94',
  1644. '71.0.3549.1',
  1645. '71.0.3549.0',
  1646. '70.0.3538.15',
  1647. '69.0.3497.93',
  1648. '69.0.3497.92',
  1649. '71.0.3548.1',
  1650. '71.0.3548.0',
  1651. '70.0.3538.14',
  1652. '69.0.3497.91',
  1653. '71.0.3547.1',
  1654. '71.0.3547.0',
  1655. '70.0.3538.13',
  1656. '69.0.3497.90',
  1657. '71.0.3546.2',
  1658. '69.0.3497.89',
  1659. '71.0.3546.1',
  1660. '71.0.3546.0',
  1661. '70.0.3538.12',
  1662. '69.0.3497.88',
  1663. '71.0.3545.4',
  1664. '71.0.3545.3',
  1665. '71.0.3545.2',
  1666. '71.0.3545.1',
  1667. '71.0.3545.0',
  1668. '70.0.3538.11',
  1669. '69.0.3497.87',
  1670. '71.0.3544.5',
  1671. '71.0.3544.4',
  1672. '71.0.3544.3',
  1673. '71.0.3544.2',
  1674. '71.0.3544.1',
  1675. '71.0.3544.0',
  1676. '69.0.3497.86',
  1677. '70.0.3538.10',
  1678. '69.0.3497.85',
  1679. '70.0.3538.9',
  1680. '69.0.3497.84',
  1681. '71.0.3543.4',
  1682. '70.0.3538.8',
  1683. '71.0.3543.3',
  1684. '71.0.3543.2',
  1685. '71.0.3543.1',
  1686. '71.0.3543.0',
  1687. '70.0.3538.7',
  1688. '69.0.3497.83',
  1689. '71.0.3542.2',
  1690. '71.0.3542.1',
  1691. '71.0.3542.0',
  1692. '70.0.3538.6',
  1693. '69.0.3497.82',
  1694. '69.0.3497.81',
  1695. '71.0.3541.1',
  1696. '71.0.3541.0',
  1697. '70.0.3538.5',
  1698. '69.0.3497.80',
  1699. '71.0.3540.1',
  1700. '71.0.3540.0',
  1701. '70.0.3538.4',
  1702. '69.0.3497.79',
  1703. '70.0.3538.3',
  1704. '71.0.3539.1',
  1705. '71.0.3539.0',
  1706. '69.0.3497.78',
  1707. '68.0.3440.134',
  1708. '69.0.3497.77',
  1709. '70.0.3538.2',
  1710. '70.0.3538.1',
  1711. '70.0.3538.0',
  1712. '69.0.3497.76',
  1713. '68.0.3440.133',
  1714. '69.0.3497.75',
  1715. '70.0.3537.2',
  1716. '70.0.3537.1',
  1717. '70.0.3537.0',
  1718. '69.0.3497.74',
  1719. '68.0.3440.132',
  1720. '70.0.3536.0',
  1721. '70.0.3535.5',
  1722. '70.0.3535.4',
  1723. '70.0.3535.3',
  1724. '69.0.3497.73',
  1725. '68.0.3440.131',
  1726. '70.0.3532.8',
  1727. '70.0.3532.7',
  1728. '69.0.3497.72',
  1729. '69.0.3497.71',
  1730. '70.0.3535.2',
  1731. '70.0.3535.1',
  1732. '70.0.3535.0',
  1733. '69.0.3497.70',
  1734. '68.0.3440.130',
  1735. '69.0.3497.69',
  1736. '68.0.3440.129',
  1737. '70.0.3534.4',
  1738. '70.0.3534.3',
  1739. '70.0.3534.2',
  1740. '70.0.3534.1',
  1741. '70.0.3534.0',
  1742. '69.0.3497.68',
  1743. '68.0.3440.128',
  1744. '70.0.3533.2',
  1745. '70.0.3533.1',
  1746. '70.0.3533.0',
  1747. '69.0.3497.67',
  1748. '68.0.3440.127',
  1749. '70.0.3532.6',
  1750. '70.0.3532.5',
  1751. '70.0.3532.4',
  1752. '69.0.3497.66',
  1753. '68.0.3440.126',
  1754. '70.0.3532.3',
  1755. '70.0.3532.2',
  1756. '70.0.3532.1',
  1757. '69.0.3497.60',
  1758. '69.0.3497.65',
  1759. '69.0.3497.64',
  1760. '70.0.3532.0',
  1761. '70.0.3531.0',
  1762. '70.0.3530.4',
  1763. '70.0.3530.3',
  1764. '70.0.3530.2',
  1765. '69.0.3497.58',
  1766. '68.0.3440.125',
  1767. '69.0.3497.57',
  1768. '69.0.3497.56',
  1769. '69.0.3497.55',
  1770. '69.0.3497.54',
  1771. '70.0.3530.1',
  1772. '70.0.3530.0',
  1773. '69.0.3497.53',
  1774. '68.0.3440.124',
  1775. '69.0.3497.52',
  1776. '70.0.3529.3',
  1777. '70.0.3529.2',
  1778. '70.0.3529.1',
  1779. '70.0.3529.0',
  1780. '69.0.3497.51',
  1781. '70.0.3528.4',
  1782. '68.0.3440.123',
  1783. '70.0.3528.3',
  1784. '70.0.3528.2',
  1785. '70.0.3528.1',
  1786. '70.0.3528.0',
  1787. '69.0.3497.50',
  1788. '68.0.3440.122',
  1789. '70.0.3527.1',
  1790. '70.0.3527.0',
  1791. '69.0.3497.49',
  1792. '68.0.3440.121',
  1793. '70.0.3526.1',
  1794. '70.0.3526.0',
  1795. '68.0.3440.120',
  1796. '69.0.3497.48',
  1797. '69.0.3497.47',
  1798. '68.0.3440.119',
  1799. '68.0.3440.118',
  1800. '70.0.3525.5',
  1801. '70.0.3525.4',
  1802. '70.0.3525.3',
  1803. '68.0.3440.117',
  1804. '69.0.3497.46',
  1805. '70.0.3525.2',
  1806. '70.0.3525.1',
  1807. '70.0.3525.0',
  1808. '69.0.3497.45',
  1809. '68.0.3440.116',
  1810. '70.0.3524.4',
  1811. '70.0.3524.3',
  1812. '69.0.3497.44',
  1813. '70.0.3524.2',
  1814. '70.0.3524.1',
  1815. '70.0.3524.0',
  1816. '70.0.3523.2',
  1817. '69.0.3497.43',
  1818. '68.0.3440.115',
  1819. '70.0.3505.9',
  1820. '69.0.3497.42',
  1821. '70.0.3505.8',
  1822. '70.0.3523.1',
  1823. '70.0.3523.0',
  1824. '69.0.3497.41',
  1825. '68.0.3440.114',
  1826. '70.0.3505.7',
  1827. '69.0.3497.40',
  1828. '70.0.3522.1',
  1829. '70.0.3522.0',
  1830. '70.0.3521.2',
  1831. '69.0.3497.39',
  1832. '68.0.3440.113',
  1833. '70.0.3505.6',
  1834. '70.0.3521.1',
  1835. '70.0.3521.0',
  1836. '69.0.3497.38',
  1837. '68.0.3440.112',
  1838. '70.0.3520.1',
  1839. '70.0.3520.0',
  1840. '69.0.3497.37',
  1841. '68.0.3440.111',
  1842. '70.0.3519.3',
  1843. '70.0.3519.2',
  1844. '70.0.3519.1',
  1845. '70.0.3519.0',
  1846. '69.0.3497.36',
  1847. '68.0.3440.110',
  1848. '70.0.3518.1',
  1849. '70.0.3518.0',
  1850. '69.0.3497.35',
  1851. '69.0.3497.34',
  1852. '68.0.3440.109',
  1853. '70.0.3517.1',
  1854. '70.0.3517.0',
  1855. '69.0.3497.33',
  1856. '68.0.3440.108',
  1857. '69.0.3497.32',
  1858. '70.0.3516.3',
  1859. '70.0.3516.2',
  1860. '70.0.3516.1',
  1861. '70.0.3516.0',
  1862. '69.0.3497.31',
  1863. '68.0.3440.107',
  1864. '70.0.3515.4',
  1865. '68.0.3440.106',
  1866. '70.0.3515.3',
  1867. '70.0.3515.2',
  1868. '70.0.3515.1',
  1869. '70.0.3515.0',
  1870. '69.0.3497.30',
  1871. '68.0.3440.105',
  1872. '68.0.3440.104',
  1873. '70.0.3514.2',
  1874. '70.0.3514.1',
  1875. '70.0.3514.0',
  1876. '69.0.3497.29',
  1877. '68.0.3440.103',
  1878. '70.0.3513.1',
  1879. '70.0.3513.0',
  1880. '69.0.3497.28',
  1881. ];
  1882. return $chromeVersions[array_rand($chromeVersions)];
  1883. }
  1884. }
  1885. if (!function_exists('autoRetry')) {
  1886. /**
  1887. * 自动重试
  1888. *
  1889. * @param $func
  1890. * @param int $maxRetryCount
  1891. * @param array $params
  1892. *
  1893. * @return mixed|void
  1894. * @throws Exception
  1895. */
  1896. function autoRetry($func, $maxRetryCount = 3, $params = [])
  1897. {
  1898. $retryCount = 0;
  1899. while (true) {
  1900. try {
  1901. return call_user_func_array($func, $params);
  1902. } catch (\Exception $e) {
  1903. $retryCount++;
  1904. if ($retryCount > $maxRetryCount) {
  1905. throw $e;
  1906. }
  1907. $sleepTime = getSleepTime($retryCount);
  1908. if (stripos($e->getMessage(), '405') !== false) {
  1909. // aws waf token 失效,将重新获取新的 token
  1910. $handleInvalidToken = false;
  1911. foreach ($params as &$param) {
  1912. if ($param instanceof CookieJar) {
  1913. $handleInvalidToken = true;
  1914. $sleepTime = 1;
  1915. delGlobalValue(CommonConst::AWS_WAF_TOKEN);
  1916. $param->setCookie(buildAwsWafCookie(getAwsWafToken()));
  1917. break;
  1918. }
  1919. }
  1920. system_log($handleInvalidToken ? \lang('exception_msg.34520019') : sprintf(lang('exception_msg.34520015'), $sleepTime, $maxRetryCount, $retryCount, $maxRetryCount));
  1921. } else {
  1922. system_log(sprintf(lang('exception_msg.34520016'), $e->getMessage(), $sleepTime, $maxRetryCount, $retryCount, $maxRetryCount));
  1923. }
  1924. sleep($sleepTime);
  1925. }
  1926. }
  1927. }
  1928. }
  1929. if (!function_exists('buildAwsWafCookie')) {
  1930. /**
  1931. * 构建 aws waf cookie
  1932. *
  1933. * @param string $awsWafToken
  1934. *
  1935. * @return SetCookie
  1936. */
  1937. function buildAwsWafCookie(string $awsWafToken)
  1938. {
  1939. $cookie = new SetCookie();
  1940. $cookie->setName('aws-waf-token');
  1941. $cookie->setValue($awsWafToken);
  1942. $cookie->setDomain('.my.freenom.com');
  1943. return $cookie;
  1944. }
  1945. }
  1946. if (!function_exists('getSleepTime')) {
  1947. /**
  1948. * 获取睡眠秒数
  1949. *
  1950. * @param int $i
  1951. * @param int $magRatio
  1952. * @param int $minSleepTime
  1953. *
  1954. * @return int
  1955. */
  1956. function getSleepTime($i, $magRatio = 4, $minSleepTime = 20)
  1957. {
  1958. $sleepTime = $i * $magRatio;
  1959. if ($sleepTime < $minSleepTime) { // 最小休眠 $minSleepTime 秒
  1960. return $minSleepTime;
  1961. }
  1962. return $sleepTime;
  1963. }
  1964. }
  1965. if (!function_exists('getAwsWafToken')) {
  1966. /**
  1967. * 获取 aws waf token
  1968. *
  1969. * @return string
  1970. * @throws LlfException
  1971. * @throws \GuzzleHttp\Exception\GuzzleException
  1972. */
  1973. function getAwsWafToken()
  1974. {
  1975. // 优先从全局变量中获取
  1976. $AWS_WAF_TOKEN = getGlobalValue(CommonConst::AWS_WAF_TOKEN);
  1977. if ($AWS_WAF_TOKEN) {
  1978. return $AWS_WAF_TOKEN;
  1979. }
  1980. // 调用自建接口获取
  1981. $AWS_WAF_SOLVER_URL = \env('AWS_WAF_SOLVER_URL');
  1982. if (!$AWS_WAF_SOLVER_URL) {
  1983. throw new LlfException('34520017');
  1984. }
  1985. $AWS_WAF_SOLVER_URL = rtrim($AWS_WAF_SOLVER_URL, '/');
  1986. $client = new Client([
  1987. 'headers' => [
  1988. 'Accept' => 'application/json',
  1989. 'Authorization' => \env('FF_SECRET_KEY', '')
  1990. ],
  1991. 'timeout' => 32,
  1992. ]);
  1993. $i = 0;
  1994. do {
  1995. try {
  1996. // 获取任务 ID
  1997. $r = $client->get($AWS_WAF_SOLVER_URL);
  1998. $body = json_decode($r->getBody()->getContents(), true);
  1999. if (!isset($body['status']) || $body['status'] !== 'OK') {
  2000. // 一般情况下走不到这个分支
  2001. if (isset($body['msg']) && $body['msg'] === 'A task is already running') {
  2002. sleep(180);
  2003. }
  2004. throw new \Exception(isset($body['msg']) ? $body['msg'] : json_encode($body));
  2005. }
  2006. // 已获取任务 ID,等待任务完成
  2007. $taskId = $body['data']['task_id'];
  2008. $startTime = time();
  2009. while (true) {
  2010. // 最多等你 5 分钟,过时不候
  2011. if (time() - $startTime >= 300) {
  2012. break;
  2013. }
  2014. $r = $client->get(sprintf('%s/%s', $AWS_WAF_SOLVER_URL, $taskId));
  2015. $body = json_decode($r->getBody()->getContents(), true);
  2016. if (!isset($body['status']) || $body['status'] !== 'OK') {
  2017. throw new \Exception(isset($body['msg']) ? $body['msg'] : json_encode($body));
  2018. }
  2019. $taskStatus = $body['data']['task_status'];
  2020. if ($taskStatus !== 'done') { // 任务进行中,继续等待
  2021. sleep(3);
  2022. continue;
  2023. }
  2024. if (!isset($body['data']['result']) || $body['data']['result'] === '') {
  2025. throw new \Exception('no result');
  2026. }
  2027. $awsWafToken = $body['data']['result'] ?? '';
  2028. setGlobalValue(CommonConst::AWS_WAF_TOKEN, $awsWafToken);
  2029. system_log(sprintf(lang('100139'), $awsWafToken));
  2030. return $awsWafToken;
  2031. }
  2032. } catch (\Exception $e) {
  2033. system_log('<red>getAwsWafToken error:</red> ' . $e->getMessage());
  2034. } finally {
  2035. sleep(1);
  2036. }
  2037. $i++;
  2038. } while ($i <= 10);
  2039. throw new LlfException('34520018');
  2040. }
  2041. }
  2042. if (!function_exists('getGlobalValue')) {
  2043. /**
  2044. * 获取全局变量
  2045. *
  2046. * @param string $name
  2047. *
  2048. * @return string|null
  2049. */
  2050. function getGlobalValue(string $name, ?string $default = null)
  2051. {
  2052. return GlobalValue::getInstance()->get($name, $default);
  2053. }
  2054. }
  2055. if (!function_exists('setGlobalValue')) {
  2056. /**
  2057. * 设置全局变量
  2058. *
  2059. * @param string $name
  2060. * @param string $value
  2061. *
  2062. * @return void
  2063. */
  2064. function setGlobalValue(string $name, string $value)
  2065. {
  2066. GlobalValue::getInstance()->set($name, $value);
  2067. }
  2068. }
  2069. if (!function_exists('hasGlobalValue')) {
  2070. /**
  2071. * 是否存在全局变量
  2072. *
  2073. * @param string $name
  2074. *
  2075. * @return bool
  2076. */
  2077. function hasGlobalValue(string $name)
  2078. {
  2079. return GlobalValue::getInstance()->has($name);
  2080. }
  2081. }
  2082. if (!function_exists('delGlobalValue')) {
  2083. /**
  2084. * 删除全局变量
  2085. *
  2086. * @param string $name
  2087. *
  2088. * @return void
  2089. */
  2090. function delGlobalValue(string $name)
  2091. {
  2092. GlobalValue::getInstance()->del($name);
  2093. }
  2094. }