index.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import axios from 'axios'
  2. import { HttpsProxyAgent } from 'https-proxy-agent'
  3. export async function sleep(ms: number) {
  4. return new Promise(resolve => setTimeout(resolve, ms))
  5. }
  6. export function generateRandomString(length: number) {
  7. const characters =
  8. 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
  9. let result = ''
  10. const charactersLength = characters.length
  11. for (let i = 0; i < length; i++) {
  12. result += characters.charAt(Math.floor(Math.random() * charactersLength))
  13. }
  14. return result
  15. }
  16. export function getProxyUrl() {
  17. const pass = `test1234_session-${generateRandomString(8)}_lifetime-24h`
  18. return `http://tuxla:${pass}@geo.iproyal.com:12321`
  19. }
  20. export function getAxiosClient(useProxy: boolean) {
  21. const pass = `test1234_session-${generateRandomString(8)}_lifetime-1h`
  22. const proxyAgent = useProxy
  23. ? new HttpsProxyAgent(`http://tuxla:${pass}@geo.iproyal.com:12321`)
  24. : undefined
  25. return axios.create({
  26. httpsAgent: proxyAgent,
  27. headers: {
  28. 'User-Agent':
  29. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
  30. 'Sec-Ch-Ua':
  31. '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
  32. 'Sec-Ch-Ua-Mobile': '?0',
  33. 'Sec-Ch-Ua-Platform': '"Windows"',
  34. // Origin: 'https://faucet.testnet.initia.xyz',
  35. // Referer: 'https://faucet.testnet.initia.xyz/',
  36. 'Sec-Fetch-Dest': 'empty',
  37. 'Sec-Fetch-Mode': 'cors',
  38. 'Sec-Fetch-Site': 'same-site',
  39. },
  40. withCredentials: true,
  41. })
  42. }
  43. export async function forEachAsync(
  44. array: any[],
  45. concurrency: number,
  46. asyncFn: (item: any, index: number) => Promise<void>,
  47. ) {
  48. let running = 0 // 当前正在运行的任务数
  49. let completed = 0 // 完成的任务数
  50. let currentTaskIndex = 0 // 当前任务索引
  51. return new Promise<void>(resolve => {
  52. // 执行任务的函数
  53. const runTask = async () => {
  54. if (completed >= array.length) {
  55. // 所有任务都完成了
  56. resolve()
  57. return
  58. }
  59. // 如果有可运行的任务且没有超过并发限制
  60. while (currentTaskIndex < array.length && running < concurrency) {
  61. const index = currentTaskIndex
  62. const item = array[currentTaskIndex]
  63. currentTaskIndex++ // 准备下一个任务的索引
  64. running++ // 增加正在运行的任务数
  65. // 立即执行异步函数
  66. ;(async () => {
  67. await asyncFn(item, index) // 等待异步任务完成
  68. running-- // 任务完成,减少正在运行的任务数
  69. completed++ // 增加完成的任务数
  70. runTask() // 尝试运行下一个任务
  71. })()
  72. }
  73. }
  74. // 初始化并发任务
  75. runTask()
  76. })
  77. }