login.mjs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import { chromium } from "playwright";
  2. import uniqueRandomArray from "unique-random-array";
  3. import userAgents from "top-user-agents";
  4. export async function login(email, password) {
  5. const browser = await chromium.launch({
  6. headless: true,
  7. devtools: false,
  8. });
  9. const options = {
  10. userAgent: uniqueRandomArray(userAgents)(),
  11. viewport: {
  12. width: parseInt(Math.random() * 100 + 1250),
  13. height: parseInt(Math.random() * 100 + 750),
  14. },
  15. locale: "en-CA",
  16. timezoneId: "America/Toronto",
  17. serviceWorkers: "block",
  18. proxy: {
  19. server: "199.188.93.128:8000",
  20. username: "proxy",
  21. password: "40gyxQ2",
  22. },
  23. };
  24. const context = await browser.newContext(options);
  25. const page = await context.newPage();
  26. let points = null;
  27. await page.route(/points$/, async (route, request) => {
  28. const response = await route.fetch();
  29. points = await response.text();
  30. await route.continue();
  31. });
  32. await page.route(
  33. /(\.png)|(\.jpg)|(\.svg)|(\.otf)|(\.woff2)|(\.ttf)|(\.mp3)/gi,
  34. (route) => route.abort()
  35. );
  36. await page.goto("https://www.pcoptimum.ca/");
  37. const link = await page.$('a > span:has-text("sign in")');
  38. link.click();
  39. await page.waitForURL("https://accounts.pcid.ca/login");
  40. await page.fill('input[id="email"]', email);
  41. await page.fill('input[id="password"]', password);
  42. try {
  43. await new Promise(async (resolve, reject) => {
  44. await page.route(/\/login$/, async (route, request) => {
  45. console.log(
  46. `${request.method()} ${request.resourceType()} ${request.url()}`
  47. );
  48. if (request.method() === "POST") {
  49. const response = await route.fetch();
  50. const status = response.status();
  51. console.log(status);
  52. if (status === 200) {
  53. await route.continue();
  54. resolve();
  55. } else if (status === 401) {
  56. reject(new Error("Invalid email or password"));
  57. } else if (status === 429) {
  58. reject(
  59. new Error(
  60. "Oops, something went wrong. Please try again later."
  61. )
  62. );
  63. } else {
  64. reject(
  65. new Error("Unknown error. Please try again later.")
  66. );
  67. }
  68. } else {
  69. await route.continue();
  70. }
  71. });
  72. await page.click('button:has-text("Sign in")');
  73. });
  74. } catch (error) {
  75. await browser.close();
  76. throw error;
  77. }
  78. try {
  79. await page.waitForURL("https://www.pcoptimum.ca/dashboard");
  80. for (let i = 0; i < 30; i++) {
  81. await page.waitForTimeout(1000);
  82. if (points) break;
  83. }
  84. } catch (error) {
  85. console.error(error.stack);
  86. }
  87. let cookies = null;
  88. try {
  89. cookies = JSON.stringify(await context.cookies());
  90. } catch (error) {}
  91. await browser.close();
  92. return { points, cookies, options };
  93. }