start.mjs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. import Vorpal from "vorpal";
  2. import { chromium } from "playwright";
  3. import os from "os";
  4. import fs from "fs";
  5. import path from "path";
  6. import { fileURLToPath } from "url";
  7. const __dirname = path.dirname(fileURLToPath(import.meta.url));
  8. console.log(__dirname);
  9. const vorpal = new Vorpal();
  10. const contexts = {};
  11. vorpal
  12. .command("new <name>")
  13. .alias("n")
  14. .action(async function (args, cb) {
  15. if (contexts[args.name]) {
  16. this.log("Context already exists");
  17. return cb();
  18. }
  19. function formatCookies(cookies) {
  20. return cookies.map((i) => {
  21. switch (i.sameSite) {
  22. case "no_restriction":
  23. case "None":
  24. i.sameSite = "None";
  25. break;
  26. case "lax":
  27. case "Lax":
  28. i.sameSite = "Lax";
  29. break;
  30. case "strict":
  31. case "Strict":
  32. i.sameSite = "Strict";
  33. break;
  34. default:
  35. i.sameSite = undefined;
  36. break;
  37. }
  38. return i;
  39. });
  40. }
  41. const userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), "myapp"));
  42. const pathToExtension = path.join(
  43. __dirname,
  44. "fngmhnnpilhplaeedifhccceomclgfbg"
  45. );
  46. // 启动浏览器
  47. const context = await chromium.launchPersistentContext(userDataDir, {
  48. headless: false,
  49. // proxy: {
  50. // server: "199.188.92.93:8000",
  51. // username: "proxy",
  52. // password: "rPZHv9U",
  53. // },
  54. args: [
  55. "--window-position=0,0",
  56. ],
  57. userAgent:
  58. "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3105.3 Safari/537.36",
  59. });
  60. let accountInfo;
  61. try {
  62. accountInfo = JSON.parse(
  63. fs
  64. .readFileSync(
  65. path.join(
  66. __dirname,
  67. "validAccounts",
  68. `${args.name}.json`
  69. )
  70. )
  71. .toString()
  72. );
  73. context.addCookies(accountInfo.cookies);
  74. } catch (error) {
  75. this.log("accountInfo not found");
  76. return;
  77. }
  78. contexts[args.name] = context;
  79. context.on("page", (page) => {
  80. vorpal.log("New page created");
  81. page.on("close", async () => {
  82. vorpal.log("Page closed");
  83. accountInfo.cookies = await page.context().cookies();
  84. fs.writeFileSync(
  85. path.join(__dirname, "validAccounts", `${args.name}.json`),
  86. JSON.stringify(accountInfo, null, 4)
  87. );
  88. });
  89. });
  90. context.on("close", () => {
  91. vorpal.log("Context closed");
  92. delete contexts[args.name];
  93. });
  94. // 创建一个新的浏览器页面
  95. const page = await context.newPage();
  96. page.goto("https://www.paypal.com/myaccount/summary");
  97. cb();
  98. });
  99. vorpal
  100. .command("close [name]")
  101. .alias("c")
  102. .option("-a, --all", "Close all contexts")
  103. .validate(function (args) {
  104. if (Object.keys(contexts).length === 0) {
  105. return "No context to close";
  106. }
  107. if (args.options.all && args.name) {
  108. return "Cannot use --all and a context name at the same time";
  109. }
  110. if (
  111. !args.options.all &&
  112. !args.name &&
  113. !Object.keys(contexts).length === 1
  114. ) {
  115. return "You must specify a context name or use --all";
  116. }
  117. return true;
  118. })
  119. .action(async function (args, cb) {
  120. this.log(args);
  121. if (args.options.all) {
  122. for (const name of Object.keys(contexts)) {
  123. await contexts[name].close();
  124. delete contexts[name];
  125. }
  126. } else if (args.name) {
  127. if (!contexts[args.name]) {
  128. this.log.error("Context not found");
  129. return cb();
  130. }
  131. await contexts[args.name].close();
  132. delete contexts[args.name];
  133. } else if (Object.keys(contexts).length === 1) {
  134. const name = Object.keys(contexts)[0];
  135. await contexts[name].close();
  136. delete contexts[name];
  137. }
  138. });
  139. vorpal.delimiter("myapp$").show();