deepcoin.test.js 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594
  1. const {
  2. describe,
  3. test,
  4. expect,
  5. } = require('@jest/globals')
  6. const { WebDriver } = require('../common/web_driver')
  7. const fs = require('fs')
  8. const path = require('node:path')
  9. const CryptoJS = require('crypto-js')
  10. const axios = require('axios')
  11. const timeout = 9999999
  12. async function sleep (ms) {
  13. return new Promise(resolve => setTimeout(resolve, ms))
  14. }
  15. describe('deepcoin站点测试', () => {
  16. let targetInfo = {
  17. 'targetId': '',
  18. 'type': '',
  19. 'title': '',
  20. 'url': '',
  21. 'attached': true,
  22. 'canAccessOpener': false,
  23. 'browserContextId': '',
  24. }
  25. const driver = new WebDriver({
  26. // port: 23035,
  27. })
  28. const init = async () => {
  29. // await driver.setProxy('socks://localhost:8880')
  30. await driver.setProxy('socks://127.0.0.1:7898')
  31. await driver.builder()
  32. let target = await driver.cdp.Target
  33. targetInfo = await target.getTargetInfo()
  34. console.info('info>>>>', targetInfo)
  35. }
  36. //【重要】#这个网站的 入口地址一定是这个,他会往请求的地址写入cookie 并且读取验证,所以domain会变,
  37. const baseUrl = 'https://www.deepcoin.com/zh/'
  38. const prefix = 'deepcoin'
  39. let cookiesPath = path.join(__dirname, 'tmp', prefix + '_cookies')
  40. let storagePath = path.join(__dirname, 'tmp', prefix + '_storage')
  41. test('测试打开', async (done) => {
  42. await init()
  43. const page = driver.cdp.Page
  44. page.navigate({ url: baseUrl })
  45. done()
  46. }, timeout)
  47. const login = async (Storage, Runtime) => {
  48. let cookie = '', localStorage = ''
  49. if (fs.existsSync(cookiesPath)) {
  50. cookie = fs.readFileSync(cookiesPath, 'utf8')
  51. }
  52. // 借助localStorage中的jwt信息登录
  53. if (fs.existsSync(storagePath)) {
  54. localStorage = fs.readFileSync(storagePath, 'utf8')
  55. }
  56. if (cookie) {
  57. await Storage.setCookies(JSON.parse(cookie))
  58. }
  59. if (localStorage) {
  60. let storage = {}
  61. try {
  62. storage = JSON.parse(`${localStorage}`) || {}
  63. } catch (e) {
  64. console.error(e)
  65. }
  66. for (const k in storage) {
  67. await Runtime.evaluate({
  68. expression: `localStorage.setItem(\`${k}\`, \`${storage[k]}\`)`,
  69. // awaitPromise: true,
  70. })
  71. }
  72. }
  73. }
  74. test('自动登录', async (done) => {
  75. await init()
  76. const {
  77. Storage,
  78. Page,
  79. Runtime,
  80. } = driver.cdp
  81. await Runtime.enable()
  82. try {
  83. Page.navigate({ url: baseUrl })
  84. await login(Storage, Runtime)
  85. let t = Date.now()
  86. let s = setInterval(async () => {
  87. let cookies = await Storage.getCookies()
  88. fs.writeFileSync(cookiesPath, JSON.stringify(cookies), 'utf8')
  89. let localStorage = await Runtime.evaluate({
  90. expression: 'JSON.stringify(localStorage)',
  91. })
  92. fs.writeFileSync(storagePath, localStorage?.result?.value, 'utf8')
  93. if (Date.now() - t > 5 * 60 * 1000) {
  94. clearInterval(s)
  95. }
  96. }, 1000)
  97. } catch (e) {
  98. console.error(e)
  99. }
  100. await sleep(timeout)
  101. done()
  102. }, timeout)
  103. test('监听wss', async (done) => {
  104. let cookie = `{"cookies":[{"name":"correction_token","value":"310E2571173CDED821B3A1AD35E9185Aweb_1732184528628_2205118","domain":"www.coinw.com","path":"/","expires":1763725752,"size":73,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"correction_accessToken","value":"57e887d018f2839ae8f6aa9bcdbc913e548ee2f8d011c381862d6af44674d5e7","domain":"www.coinw.com","path":"/","expires":1763725752,"size":86,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"accessToken","value":"57e887d018f2839ae8f6aa9bcdbc913e548ee2f8d011c381862d6af44674d5e7","domain":"www.coinw.com","path":"/","expires":1763725752,"size":75,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"i18n_redirected","value":"zh_CN","domain":"www.coinw.com","path":"/","expires":1763726435,"size":20,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"THEME","value":"LIGHT","domain":"www.coinw.com","path":"/","expires":-1,"size":10,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"i","value":"MYnbZm73hZFXKjvyuWX97J3MI7CSTu8G3SSCX5p2v1B715+g4AuaW6paCH2sx0jgBDyKw7fE8r9cqyg6/fLbN4Xq/Aw=","domain":".yandex.ru","path":"/","expires":1766314336.073629,"size":93,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"yandexuid","value":"1082721261731754335","domain":".yandex.ru","path":"/","expires":1766314337.187696,"size":28,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"yashr","value":"9313470971731754335","domain":".yandex.ru","path":"/","expires":1763290336.073696,"size":24,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"yabs-sid","value":"1189116901731754337","domain":"mc.yandex.ru","path":"/","expires":-1,"size":27,"httpOnly":false,"secure":true,"session":true,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"yuidss","value":"1082721261731754335","domain":".yandex.ru","path":"/","expires":1766314337.187779,"size":25,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"ymex","value":"2047114337.yrts.1731754337","domain":".yandex.ru","path":"/","expires":1763290337.187796,"size":30,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"receive-cookie-deprecation","value":"1","domain":".yandex.ru","path":"/","expires":1763365276.902871,"size":27,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"A3","value":"d=AQABBGR5OGcCECcnHnFFdVRGNZ0QidBKQzAFEgEBAQHKOWdCZ69B8HgB_eMAAA&S=AQAAArNukj6ZxkbkdIaws160s3o","domain":".yahoo.com","path":"/","expires":1763386880.032238,"size":96,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"TapAd_TS","value":"1731754340127","domain":".tapad.com","path":"/","expires":1737013279.698306,"size":21,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"TapAd_DID","value":"80c41233-3cfb-4186-8962-ba1811cf5f58","domain":".tapad.com","path":"/","expires":1737013279.698375,"size":45,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"t_gid","value":"7407c311-7a51-438c-a550-abc4aaf1a4bb-tucte31fee4","domain":".taboola.com","path":"/","expires":1763365279.615811,"size":53,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"t_pt_gid","value":"7407c311-7a51-438c-a550-abc4aaf1a4bb-tucte31fee4","domain":".taboola.com","path":"/","expires":1763365279.615863,"size":56,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"khaos","value":"M3K1TKXZ-1V-ALPN","domain":".rubiconproject.com","path":"/","expires":1763365279.086621,"size":21,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"khaos_p","value":"M3K1TKXZ-1V-ALPN","domain":".rubiconproject.com","path":"/","expires":1763365279.086649,"size":23,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"receive-cookie-deprecation","value":"1","domain":".rubiconproject.com","path":"/","expires":1739605279.086703,"size":27,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"KRTBCOOKIE_10","value":"22808-NWMxZjZhNGQ5NWUxMGEyYTRlNDUxNTNjNDJjMmViNzg&KRTB&22883-NWMxZjZhNGQ5NWUxMGEyYTRlNDUxNTNjNDJjMmViNzg&KRTB&23504-NWMxZjZhNGQ5NWUxMGEyYTRlNDUxNTNjNDJjMmViNzg&KRTB&23615-NWMxZjZhNGQ5NWUxMGEyYTRlNDUxNTNjNDJjMmViNzg","domain":".pubmatic.com","path":"/","expires":1739605278.920147,"size":227,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"did","value":"fuqyP8VLZvC8paK5","domain":".pippio.com","path":"/","expires":1763290342.23782,"size":19,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"didts","value":"1731754342","domain":".pippio.com","path":"/","expires":1763290342.237877,"size":15,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"nnls","value":"","domain":".pippio.com","path":"/","expires":1736938342.237897,"size":4,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"pxrc","value":"CAA=","domain":".pippio.com","path":"/","expires":1736938342.237912,"size":8,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"CMID","value":"Zzh5ZIsFVgwAAHfXAakqjQAA","domain":".casalemedia.com","path":"/","expires":1763365278.44026,"size":28,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"CMPS","value":"4932","domain":".casalemedia.com","path":"/","expires":1739530340.008481,"size":8,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"CMPRO","value":"4932","domain":".casalemedia.com","path":"/","expires":1739605278.440373,"size":9,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga","value":"GA1.1.1027142390.1731754330","domain":".bitget.com","path":"/","expires":1766389284.225349,"size":30,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bitget_lang","value":"zh-CN","domain":"www.bitget.com","path":"/","expires":1763365280,"size":16,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"theme","value":"white","domain":"www.bitget.com","path":"/","expires":1763290333,"size":10,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_clientid","value":"1027142390.1731754330","domain":"www.bitget.com","path":"/","expires":-1,"size":33,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_dx_kvani5r","value":"c161941072692b13cb747d61e70b7f1a16d930aa14318b52b30c8e822bf102c6fc250511","domain":"www.bitget.com","path":"/","expires":1766389188.343604,"size":83,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ym_uid","value":"1731754337128758006","domain":".bitget.com","path":"/","expires":1763290336,"size":26,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ym_d","value":"1731754337","domain":".bitget.com","path":"/","expires":1763290336,"size":15,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"__adroll_fpc","value":"aa9a3144222fd50022333b81656baf2f-1731754337129","domain":".bitget.com","path":"/","expires":1763386877,"size":58,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_cfuvid","value":"8Pnwv85lIuhfGbMBgD4CiRu22h1LcMS2xPweCtEOOFw-1731754338507-0.0.1.1-604800000","domain":".bitget.com","path":"/","expires":-1,"size":82,"httpOnly":true,"secure":true,"session":true,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"OptanonAlertBoxClosed","value":"Sat%20Nov%2016%202024%2021:05:05%20GMT+0800%20(%E4%B8%AD%E5%9B%BD%E6%A0%87%E5%87%86%E6%97%B6%E9%97%B4)","domain":"www.bitget.com","path":"/","expires":1763298305,"size":123,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"OptanonConsent","value":"isMarketing=1&isStatistic=1","domain":"www.bitget.com","path":"/","expires":1763298305,"size":41,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"tuuid","value":"65968270-018a-45e1-b2ba-8b928c0e7798","domain":".bidswitch.net","path":"/","expires":1763290339.682657,"size":41,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"c","value":"1731754339","domain":".bidswitch.net","path":"/","expires":1763290339.455306,"size":11,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"tuuid_lu","value":"1731754339","domain":".bidswitch.net","path":"/","expires":1763290339.682705,"size":18,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"TDID","value":"b415b044-15af-49ff-b3fd-6a031b39df68","domain":".adsrvr.org","path":"/","expires":1763365279.484294,"size":40,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"__adroll","value":"5c1f6a4d95e10a2a4e45153c42c2eb78-a_1731754337","domain":".d.adroll.com","path":"/","expires":1765957279.200233,"size":53,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"receive-cookie-deprecation","value":"1","domain":".d.adroll.com","path":"/","expires":1765957279.200294,"size":27,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"receive-cookie-deprecation","value":"1","domain":".adroll.com","path":"/","expires":1765957279.200339,"size":27,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"__adroll_shared","value":"5c1f6a4d95e10a2a4e45153c42c2eb78-a_1731754337","domain":".adroll.com","path":"/","expires":1765957279.200362,"size":60,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"ar_debug","value":"1","domain":"x.adroll.com","path":"/","expires":-1,"size":9,"httpOnly":true,"secure":true,"session":true,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"XANDR_PANID","value":"5c9IHgbUkzcItQUHc7u3UwWja6IZoCKqBKm3MoMjGq1kckhjojkTNObEglxZNtF6V5bdFtmihBTAblQOaxgqXzbzMc6kuCLe0NdYA5PNXoM.","domain":".adnxs.com","path":"/","expires":1739605280.080393,"size":119,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"receive-cookie-deprecation","value":"1","domain":".adnxs.com","path":"/","expires":1766389280.080509,"size":27,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"uuid2","value":"4644616257718275807","domain":".adnxs.com","path":"/","expires":1739605280.080534,"size":24,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"tluidp","value":"182728306274547648373","domain":".3lift.com","path":"/","expires":1739605280.202445,"size":27,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"tluid","value":"182728306274547648373","domain":".3lift.com","path":"/","expires":1739605280.202537,"size":26,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"fingerprint-1731829185303-3545.7000000001863-0.7236135316236552","value":"true","domain":"www.bitget.com","path":"/","expires":-1,"size":67,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"terminalCode-1731829185304-3546.8000000000466-0.18525561286883852","value":"true","domain":"www.bitget.com","path":"/","expires":-1,"size":69,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_sessionid","value":"1731829184","domain":"www.bitget.com","path":"/","expires":-1,"size":23,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"dy_token","value":"67399dc5hiUvg4aoo4NWraanMpYDjUCvr9KiHWa1","domain":"www.bitget.com","path":"/","expires":1732433990,"size":48,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"IDSYNC","value":"1770~2lvj","domain":".analytics.yahoo.com","path":"/","expires":1763365280.032166,"size":15,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"stel_ssid","value":"031666165d33327d34_13128692807439905706","domain":"oauth.telegram.org","path":"/","expires":1763072315.19006,"size":48,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"captcha_v4_user","value":"1c843149fb454144b41619715e45aee5","domain":"www.bitget.com","path":"/","expires":1763365217.676247,"size":47,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bt_rtoken","value":"upex:session:id:5eb86cb5fb6aaf4270acdd3ef754eba58f0c69220ea60a6f485785a657ace4d0","domain":".bitget.com","path":"/","expires":-1,"size":89,"httpOnly":false,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bt_uid","value":"ACA75325DA2E88554EE21FFD71180F5D","domain":".bitget.com","path":"/","expires":-1,"size":38,"httpOnly":false,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bt_sessonid","value":"7681bb60-3a56-4027-9b19-29d6346e70b8","domain":"www.bitget.com","path":"/","expires":-1,"size":47,"httpOnly":true,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bt_newsessionid","value":"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI3OThmNmE5NC04ZWQyLTRiYmItODdiNy1hNmExNDkxYzhlYWMzMjA0NjQzNTgiLCJ1aWQiOiJ3OXhvaFJFRU1iSGszOUpNZkNDT2NRPT0iLCJzdWIiOiJkb24qKipvbSIsImlwIjoiVGZ6YlllRnRHbys3WVhQS25rejlBb0UycHJNd3g5a21CZHl5RkVqKzVKST0iLCJkaWQiOiI0ZHVEMEI3K3oza0MzWEFmVzloT3J0MG5wTkhLS3VNZ04vUHg4bUJYeHhoMTJSSXNaUUtNNUhCa1M0eVRSaG5XIiwic3RzIjowLCJpYXQiOjE3MzE4MjkyNjgsImV4cCI6MTczMjI2MTI2OCwicHVzaGlkIjoiZGRrU0xHVUNqT1J3WkV1TWswWVoxZz09IiwiaXNzIjoidXBleCJ9.Eoma_kP6lz-bZC3WAbvnA0iogkLp1Tao-IoGSbvP4mQ","domain":"www.bitget.com","path":"/","expires":-1,"size":508,"httpOnly":true,"secure":true,"session":true,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"BITGET_LOCAL_COOKIE","value":"{%22bitget_lang%22:%22zh-CN%22%2C%22bitget_unit%22:%22CNY%22%2C%22bitget_showasset%22:true%2C%22bitget_theme%22:%22white%22%2C%22bitget_layout%22:%22right%22%2C%22bitget_valuationunit%22:1%2C%22bitget_valuationunitandfiat%22:1%2C%22bitgt_login%22:false}","domain":"www.bitget.com","path":"/","expires":1763365282,"size":272,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"bh","value":"Ej8iR29vZ2xlIENocm9tZSI7dj0iMTMxIiwiQ2hyb21pdW0iO3Y9IjEzMSIsIk5vdF9BIEJyYW5kIjt2PSIyNCIaBSJ4ODYiIg8iMTMxLjAuNjc3OC42OSIqAj8wOgciTGludXgiQgciNi44LjAiSgQiNjQiUloiR29vZ2xlIENocm9tZSI7dj0iMTMxLjAuNjc3OC42OSIsIkNocm9taXVtIjt2PSIxMzEuMC42Nzc4LjY5IiwiTm90X0EgQnJhbmQiO3Y9IjI0LjAuMC4wIiI=","domain":".yandex.ru","path":"/","expires":1763365276.902998,"size":282,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"__ar_v4","value":"2WBEMJJKHFG5PLSUZ7B5OY%3A20241116%3A5%7CR3652JF77NH6ZC5OBZHWIH%3A20241116%3A5","domain":".www.bitget.com","path":"/","expires":1763365277,"size":84,"httpOnly":false,"secure":false,"session":false,"sameSite":"Lax","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"PugT","value":"1731762724","domain":".pubmatic.com","path":"/","expires":1734421278.920256,"size":14,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"pxrc","value":"COTy4bkGEgUI6AcQABIFCOhHEAASCAi66gEQ7sgEEggIwuoBELrJBBIHCLjrARCnBQ==","domain":".rlcdn.com","path":"/","expires":1737013279.85696,"size":72,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"audit_p","value":"1|KU3TUTGG3tk5xe39Mf6aM6EbHmL3ALMsBuG8IOzTGs0aGBMLXkl4hkBwdewdhHogrKjBDh6NdrgwHTRO1/p4iGlty70eE65yR164mUDQhphJnKuoXdYGNpSO9CBF/oObGiojn9sUFMEIMMUC6OwqjlfUnwg8qmwpwvlwdUAHMD7Fl2nkzsvwfCbyzRQDbtqQCwfRAfYnv8yyqVI1k5poNA==","domain":".rubiconproject.com","path":"/","expires":1763365279.086559,"size":225,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443,"partitionKey":{"topLevelSite":"https://bitget.com","hasCrossSiteAncestor":true}},{"name":"audit","value":"1|KU3TUTGG3tk5xe39Mf6aM6EbHmL3ALMsBuG8IOzTGs0aGBMLXkl4hkBwdewdhHogrKjBDh6NdrgwHTRO1/p4iGlty70eE65yR164mUDQhphJnKuoXdYGNpSO9CBF/oObGiojn9sUFMEIMMUC6OwqjlfUnwg8qmwpwvlwdUAHMD7Fl2nkzsvwfCbyzRQDbtqQCwfRAfYnv8yyqVI1k5poNA==","domain":".rubiconproject.com","path":"/","expires":1763365279.086677,"size":223,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"TDCPM","value":"CAESFAoFdGFwYWQSCwiS1uXIornDPRAFEhcKCGxpdmVyYW1wEgsIppusoai5wz0QBRgBIAEoAjILCPyRr86-ucM9EAU4AVoIbGl2ZXJhbXBgAg..","domain":".adsrvr.org","path":"/","expires":1763365279.484469,"size":117,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"TapAd_3WAY_SYNCS","value":"1!7735-2!7735","domain":".tapad.com","path":"/","expires":1737013279.698424,"size":29,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"rlas3","value":"+asAlsegDNqYMhMmYl+49Az7yNufyAWanBdlHRj6BdY=","domain":".rlcdn.com","path":"/","expires":1763365279.856791,"size":49,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"anj","value":"dTM7k!M4/rD>6NRF']wIg2E?cq2FwR!]tdAM\`u8]DvI[!O4]7Q=E?/X\`o!>T1e=Vvi-xc5\`+4KR\`8)Od1-)]\`\`+.O:3Cdaa2)Fp42GYiTC#!_)F37hq*bpRz*qF1\`*b\`g*-U'o[","domain":".adnxs.com","path":"/","expires":1739605280.080483,"size":138,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_Z8Q93KHR0F","value":"GS1.1.1731829184.3.1.1731829281.49.0.0","domain":".bitget.com","path":"/","expires":1766389281.008201,"size":52,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_B8RNGYK5MS","value":"GS1.1.1731829284.1.1.1731829284.0.0.0","domain":".bitget.com","path":"/","expires":1766389284.229991,"size":51,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"ar_debug","value":"1","domain":".www.google-analytics.com","path":"/","expires":1739966444.793104,"size":9,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"COINW_LANGUAGE","value":"zh_CN","domain":"www.coinw.com","path":"/","expires":-1,"size":19,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_gcl_au","value":"1.1.413755305.1732189754","domain":".coinw.com","path":"/","expires":1739965754,"size":31,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"HMACCOUNT_BFESS","value":"88620D986C302A2C","domain":".hm.baidu.com","path":"/","expires":1766749754.61278,"size":31,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"Hm_lvt_525b7a4b6599566fc46ec53565d28557","value":"1732189755","domain":".coinw.com","path":"/","expires":1763726444,"size":49,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"HMACCOUNT","value":"88620D986C302A2C","domain":".coinw.com","path":"/","expires":-1,"size":25,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"selectType","value":"CNY","domain":"www.coinw.com","path":"/","expires":-1,"size":13,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_gid","value":"GA1.2.1427289152.1732189755","domain":".coinw.com","path":"/","expires":1732276842,"size":31,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"SESSION","value":"fae4976d-c3cb-4898-82f8-44bc9873263c","domain":"www.coinw.com","path":"/","expires":-1,"size":43,"httpOnly":true,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"token","value":"310E2571173CDED821B3A1AD35E9185Aweb_1732184528628_2205118","domain":"www.coinw.com","path":"/","expires":-1,"size":62,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"JSESSION","value":"4CEF8D2F89AFB90CCF5F36F3FF3D567D","domain":"www.coinw.com","path":"/","expires":-1,"size":40,"httpOnly":true,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"CLID","value":"65b9dc144ffc4bb28f269e188e760058.20231210.20251121","domain":"www.clarity.ms","path":"/","expires":1763725755.368452,"size":54,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_clck","value":"1cvgqwo%7C2%7Cfr2%7C0%7C1786","domain":".coinw.com","path":"/","expires":1763725755,"size":33,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_hjSession_3376431","value":"eyJpZCI6IjE0YmQzMjViLWQ4ZmQtNDQ1ZC1hYzIzLThjM2M5YjhlNTExYiIsImMiOjE3MzIxODk3NTYyMzAsInMiOjAsInIiOjAsInNiIjowLCJzciI6MCwic2UiOjAsImZzIjoxLCJzcCI6MH0=","domain":".coinw.com","path":"/","expires":1732191556,"size":166,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"MUID","value":"166EFB3BFDB56A481987EE05FCF06BF8","domain":".bing.com","path":"/","expires":1765885760.508774,"size":36,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"High","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"MR","value":"0","domain":".c.bing.com","path":"/","expires":1732794560.50884,"size":3,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"SRM_B","value":"166EFB3BFDB56A481987EE05FCF06BF8","domain":".c.bing.com","path":"/","expires":1765885760.508862,"size":37,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"SM","value":"C","domain":".c.clarity.ms","path":"/","expires":-1,"size":3,"httpOnly":false,"secure":true,"session":true,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"MUID","value":"166EFB3BFDB56A481987EE05FCF06BF8","domain":".clarity.ms","path":"/","expires":1765885761.89438,"size":36,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"High","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"MR","value":"0","domain":".c.clarity.ms","path":"/","expires":1732794561.894425,"size":3,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"__cf_bm","value":"cvKsGFgcJCbdnohzaF7JYqf4STevreKQq47BtRwUdl0-1732190432-1.0.1.1-0BN7av48B5_doq6HOkJT7i0Vdh0c601_RS7IFcdYOr5_e2hp_rFy6BvfJ8QDgybFD61l0xEujQ3j742OS2O.oA","domain":".coinw.com","path":"/","expires":1732192232.271815,"size":156,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"deviceId","value":"9fd27bbac6284310908baac5159f69a0","domain":"www.coinw.com","path":"/","expires":1766750439.764839,"size":40,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"coinwsessionid","value":"fae4976d-c3cb-4898-82f8-44bc9873263c","domain":"www.coinw.com","path":"/","expires":-1,"size":50,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_CGPRXKB35T","value":"GS1.1.1732189754.1.1.1732190440.60.0.0","domain":".coinw.com","path":"/","expires":1766750440.481414,"size":52,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"JSESSIONID","value":"C4C687541A4CCADC7015D477144B04A5","domain":"www.coinw.com","path":"/","expires":-1,"size":42,"httpOnly":true,"secure":true,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_gat_UA-257710828-1","value":"1","domain":".coinw.com","path":"/","expires":1732190502,"size":20,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_BH36WRPKLN","value":"GS1.1.1732189755.1.1.1732190443.0.0.0","domain":".coinw.com","path":"/","expires":1766750443.146893,"size":51,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga","value":"GA1.1.1575037858.1732189754","domain":".coinw.com","path":"/","expires":1766750444.349872,"size":30,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"Hm_lpvt_525b7a4b6599566fc46ec53565d28557","value":"1732190444","domain":".coinw.com","path":"/","expires":-1,"size":50,"httpOnly":false,"secure":false,"session":true,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_ga_H9F6SYN3JW","value":"GS1.1.1732189756.1.1.1732190444.60.0.0","domain":".coinw.com","path":"/","expires":1766750444.339502,"size":52,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"IDE","value":"AHWqTUns-5NXb2iv2QrMAWmE4BdBrec2PKQ0-FEDWDeOSI0I5lsCM0-GD4uHo7HE","domain":".doubleclick.net","path":"/","expires":1766750445.983704,"size":67,"httpOnly":true,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_hjSessionUser_3376431","value":"eyJpZCI6IjliZjViOTRmLWNlMGMtNTBlMC1hNGY1LTEzYjVkYTdiNDhkMCIsImNyZWF0ZWQiOjE3MzIxODk3NTYyMjksImV4aXN0aW5nIjp0cnVlfQ==","domain":".coinw.com","path":"/","expires":1763726446,"size":138,"httpOnly":false,"secure":true,"session":false,"sameSite":"None","priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443},{"name":"_clsk","value":"7qwymi%7C1732190448643%7C2%7C1%7Ct.clarity.ms%2Fcollect","domain":".coinw.com","path":"/","expires":1732276848,"size":60,"httpOnly":false,"secure":false,"session":false,"priority":"Medium","sameParty":false,"sourceScheme":"Secure","sourcePort":443}]}`
  105. await init()
  106. const {
  107. Storage,
  108. Page,
  109. Network,
  110. } = driver.cdp
  111. Network.enable()
  112. Page.navigate({ url: baseUrl })
  113. Storage.setCookies(JSON.parse(cookie))
  114. const decode = (data) => {
  115. let str = data
  116. while (/^\d/.test(str)) {
  117. str = str.substring(1)
  118. }
  119. try {
  120. return JSON.parse(str)
  121. } catch (e) {
  122. console.warn('非json格式,不用惊慌:', e)
  123. }
  124. return data
  125. }
  126. // 一个二进制数据流还原
  127. // opcode number WebSocket message opcode.
  128. // mask boolean WebSocket message mask.
  129. // payloadData string WebSocket message payload data. If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
  130. // If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
  131. const formatResponse = (params = {
  132. opcode: 1,
  133. mask: false,
  134. payloadData: '',
  135. }) => {
  136. try {
  137. if (!params.response?.opcode) {
  138. return params.response
  139. }
  140. if (params.response?.opcode === 1) {
  141. let data = params.response.payloadData
  142. return decode(data)
  143. }
  144. // const binaryData = Buffer.from(params.response.payloadData, 'base64')
  145. //数据 前缀
  146. // let type = ['open', 'close', 'ping', 'pong', 'message', 'upgrade', 'noop']
  147. // 例如 payloadData: '42["subscribe",{"channel":"spot/ticker:ALL","su...
  148. // 4开头 type[4] message
  149. console.info('结果解析:', params.response.payloadData)
  150. } catch (e) {
  151. console.error(e)
  152. }
  153. }
  154. Network.webSocketCreated(params => {
  155. console.log('WebSocket created:', params.url)
  156. })
  157. // 订阅 Network.webSocketFrameSent 和 Network.webSocketFrameReceived 事件,监听 WebSocket 帧的发送和接收:
  158. Network.webSocketFrameSent(params => {
  159. console.log('WebSocket frame sent:', params.response)
  160. // formatResponse(params)
  161. })
  162. Network.webSocketFrameReceived(params => {
  163. console.log('WebSocket frame received:', params.response)
  164. // formatResponse(params)
  165. })
  166. // 订阅 Network.webSocketClosed 事件,监听 WebSocket 连接的关闭:
  167. Network.webSocketClosed(params => {
  168. console.log('WebSocket closed:', params.closeCode, params.closeReason)
  169. // formatResponse(params)
  170. })
  171. // 订阅Network.webSocketWillSendHandshakeRequest事件,拦截WebSocket连接的握手请求:
  172. Network.webSocketWillSendHandshakeRequest(params => {
  173. console.log('WebSocket handshake request:', params.request)
  174. // formatResponse(params)
  175. })
  176. // 订阅Network.webSocketHandshakeResponseReceived事件,拦截WebSocket连接的握手响应:
  177. Network.webSocketHandshakeResponseReceived(params => {
  178. console.log('WebSocket handshake response:', params.response)
  179. let data = formatResponse(params)
  180. console.info('webSocketHandshakeResponseReceived解析结果:', data)
  181. })
  182. // 订阅Network.webSocketFrameSent和Network.webSocketFrameReceived事件,拦截WebSocket数据帧的发送和接收:
  183. Network.webSocketFrameSent(params => {
  184. console.log('WebSocket frame sent:', params.response)
  185. // formatResponse(params)
  186. })
  187. Network.webSocketFrameReceived(params => {
  188. // console.log('WebSocket frame received:', params.response)
  189. console.info('webSocketFrameReceived 回复', params.response)
  190. let data = formatResponse(params)
  191. console.info('webSocketFrameReceived解析结果:', data)
  192. })
  193. Network.webSocketFrameError(params => {
  194. console.log('WebSocket frame error:', params.response)
  195. let data = formatResponse(params)
  196. console.info('webSocketFrameError解析结果:', data)
  197. })
  198. await sleep(timeout)
  199. done()
  200. }, timeout)
  201. test('签名', (done) => {
  202. // TODO 写死的 i 是Appid s是 HmacSHA256 秘钥
  203. let info = {
  204. 'i': 547798,
  205. 's': '61dd6c49529a05569900e71f49a0cd87',
  206. }
  207. function randomStr (e) {
  208. e = e || 32
  209. var t = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  210. , n = ''
  211. for (let r = 0; r < e; r++) {
  212. n += t.charAt(Math.floor(48 * Math.random()))
  213. }
  214. return n
  215. }
  216. // 替换到params中
  217. let timestamp = +new Date,
  218. convertPOST = 1,
  219. randomstr = randomStr(6),
  220. appid = info.i
  221. let params = {
  222. 'ExchangeID': 'DeepCoin',
  223. 'InstrumentID': '1BTCUSD',
  224. 'MemberID': '9313134',
  225. 'ActionType': '1',
  226. 'AccountID': '9313134',
  227. 'IsCrossMargin': 1,
  228. 'TradeUnitID': '9313134',
  229. 'LongLeverage': 32,
  230. 'ShortLeverage': 32,
  231. 'UserID': '9313134',
  232. 'appid': 547798,
  233. 'randomstr': 'EQDcpG',
  234. 'timestamp': 1734795772348,
  235. 'convertPOST': convertPOST,
  236. }
  237. let CryptoJS = require('crypto-js')
  238. function toStr (e) {
  239. const t = []
  240. return Object.keys(e).forEach((n => {
  241. let r = e[n]
  242. Array.isArray(r) || '[object Object]' === Object.prototype.toString.call(r) || (void 0 !== r && '[object Null]' !== Object.prototype.toString.call(r) || (r = ''),
  243. 'object' == typeof r && (r = JSON.stringify(r)),
  244. t.push(n + '=' + r))
  245. }
  246. )), t.join('&')
  247. }
  248. let signData = {
  249. appid,
  250. convertPOST,
  251. randomstr,
  252. timestamp,
  253. ...params,
  254. }
  255. // 获取对象的所有键,将其转换为数组
  256. const keys = Object.keys(signData)
  257. keys.sort()
  258. const distData = {}
  259. keys.forEach(key => {
  260. distData[key] = signData[key]
  261. })
  262. let queryStr = toStr(distData)
  263. console.info('===>', queryStr)
  264. let sha256Str = CryptoJS.HmacSHA256(queryStr, info.s),
  265. sign = CryptoJS.MD5(sha256Str.toString())
  266. console.info('sha256Str==>', sha256Str.toString())
  267. console.info('-sign-->', sign.toString().toLocaleLowerCase())
  268. signData.sgin = sign
  269. axios.post('https://www.deepcoin.com/v2/public/swap/SendPositionLeverage', signData, {
  270. headers: {
  271. 'accept': 'application/json, text/plain, */*',
  272. 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
  273. 'appid': '547798',
  274. 'content-type': 'application/json',
  275. 'device': 'pc-c9cdc03711159d3e72025c1e428cd4d8',
  276. 'hmac': '7ca70f92ed75168a1089249efc074f02',
  277. 'lang': 'zh',
  278. 'otoken': 'TQHOtqhQqXYD2tTc/KG0KKIDoPnC861ktL8jc2bOJb3i8FF2Cz3mfwQACbSBPKk0fW1UJve4t1LjH1Uo4aHRDQ==',
  279. 'platform': 'pc',
  280. 'priority': 'u=1, i',
  281. 'requestid': 'f529a1eb30a2d433e6fd2db15fe6c971',
  282. 'sec-ch-ua': '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
  283. 'sec-ch-ua-mobile': '?0',
  284. 'sec-ch-ua-platform': '"Linux"',
  285. 'sec-fetch-dest': 'empty',
  286. 'sec-fetch-mode': 'cors',
  287. 'sec-fetch-site': 'same-origin',
  288. 'timestamp': '1734795964022',
  289. 'token': 'TQHOtqhQqXYD2tTc/KG0KKIDoPnC861ktL8jc2bOJb3i8FF2Cz3mfwQACbSBPKk0fW1UJve4t1LjH1Uo4aHRDQ==',
  290. 'uid': '9313134',
  291. 'x-requested-with': 'XMLHttpRequest',
  292. 'cookie': 'sajssdk_2015_cross_new_user=1; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%229313134%22%2C%22first_id%22%3A%22193e8c24272581-04d378df0f85838-76574611-2073600-193e8c242731372%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E8%87%AA%E7%84%B6%E6%90%9C%E7%B4%A2%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22https%3A%2F%2Faccounts.google.com%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkzZThjMjQyNzI1ODEtMDRkMzc4ZGYwZjg1ODM4LTc2NTc0NjExLTIwNzM2MDAtMTkzZThjMjQyNzMxMzcyIiwiJGlkZW50aXR5X2xvZ2luX2lkIjoiOTMxMzEzNCIsImlkZW50aXR5X2g1X2lkIjoicGMtYzljZGMwMzcxMTE1OWQzZTcyMDI1YzFlNDI4Y2Q0ZDgifQ%3D%3D%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%24identity_login_id%22%2C%22value%22%3A%229313134%22%7D%2C%22%24device_id%22%3A%22193e8c24272581-04d378df0f85838-76574611-2073600-193e8c242731372%22%7D',
  293. 'Referer': 'https://www.deepcoin.com/zh/futures/1BTCUSD',
  294. 'Referrer-Policy': 'strict-origin-when-cross-origin',
  295. },
  296. proxy: {
  297. protocol: 'socks',
  298. host: '127.0.0.1',
  299. // hostname: '127.0.0.1' // Takes precedence over 'host' if both are defined
  300. port: 3128,
  301. },
  302. }).then(resp => {
  303. console.info('11>>>', resp.data)
  304. done()
  305. }).catch(reason => {
  306. console.error(reason)
  307. done()
  308. })
  309. done()
  310. },
  311. )
  312. test('wss', async () => {
  313. const WebSocket = require('ws')
  314. const hpa = require('https-proxy-agent')
  315. const proxy = 'socks5://127.0.0.1:7899' // 替换为你的 SOCKS 代理地址
  316. const agent = new hpa.HttpsProxyAgent(proxy)
  317. const headers = {
  318. 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6',
  319. 'cache-control': 'no-cache',
  320. 'pragma': 'no-cache',
  321. 'sec-websocket-extensions': 'permessage-deflate; client_max_window_bits',
  322. 'sec-websocket-key': 's85PYXnHSbN6OJKSBa4qjg==',
  323. 'sec-websocket-version': '13',
  324. }
  325. const ws = new WebSocket('wss://net-wss.deepcoin.com/public/spotws', {
  326. agent: agent,
  327. headers: headers,
  328. })
  329. ws
  330. .on('open', function open () {
  331. console.log('已连接到 Deepcoin WebSocket 服务器')
  332. // 发送订阅消息(示例:订阅 BTC/USDT 市场数据)
  333. const subscribeMessage = {
  334. method: 'subscribe',
  335. params: ['spot/ticker:BTC-USDT'], // 订阅的具体频道
  336. id: 1,
  337. }
  338. ws.send(JSON.stringify(subscribeMessage))
  339. })
  340. ws
  341. .on('message', function incoming (data) {
  342. console.log('接收到消息:', data.toString())
  343. // 在这里处理接收到的数据
  344. try {
  345. const message = JSON.parse(data)
  346. if (message.result && message.result.channel === 'spot/ticker:BTC-USDT') {
  347. //对 BTC-USDT 的市场数据进行处理
  348. console.log('BTC-USDT 数据:', message.result.data)
  349. }
  350. console.info('=message==>', message)
  351. } catch (error) {
  352. console.error('解析 JSON 数据时出错:', error)
  353. }
  354. })
  355. ws
  356. .on('close', function close () {
  357. console.log('与 Deepcoin WebSocket 服务器断开连接')
  358. })
  359. ws
  360. .on('error', function error (err) {
  361. console.error('WebSocket 错误:', err)
  362. })
  363. // 如果需要,可以添加一个定时器来发送心跳包,以保持连接活跃
  364. setInterval(() => {
  365. if (ws.readyState === WebSocket.OPEN) {
  366. ws.send(JSON.stringify({ method: 'ping' }))
  367. }
  368. }
  369. ,
  370. 30000,
  371. ) // 每 30 秒发送一次心跳包
  372. await sleep(timeout)
  373. })
  374. test('wss2', async (done) => {
  375. await init()
  376. const {
  377. Storage,
  378. Page,
  379. Network,
  380. } = driver.cdp
  381. Network.enable()
  382. Page.navigate({ url: 'https://www.deepcoin.com/zh/Spot?currentId=BTC%2FUSDT' })
  383. const decode = (data) => {
  384. let str = data
  385. while (/^\d/.test(str)) {
  386. str = str.substring(1)
  387. }
  388. try {
  389. return JSON.parse(str)
  390. } catch (e) {
  391. console.warn('非json格式,不用惊慌:', e)
  392. }
  393. return data
  394. }
  395. // 一个二进制数据流还原
  396. // opcode number WebSocket message opcode.
  397. // mask boolean WebSocket message mask.
  398. // payloadData string WebSocket message payload data. If the opcode is 1, this is a text message and payloadData is a UTF-8 string.
  399. // If the opcode isn't 1, then payloadData is a base64 encoded string representing binary data.
  400. const formatResponse = (params = {
  401. opcode: 1,
  402. mask: false,
  403. payloadData: '',
  404. }) => {
  405. try {
  406. if (!params.response?.opcode) {
  407. return params.response
  408. }
  409. if (params.response?.opcode === 1) {
  410. let data = params.response.payloadData
  411. return decode(data)
  412. }
  413. // const binaryData = Buffer.from(params.response.payloadData, 'base64')
  414. //数据 前缀
  415. // let type = ['open', 'close', 'ping', 'pong', 'message', 'upgrade', 'noop']
  416. // 例如 payloadData: '42["subscribe",{"channel":"spot/ticker:ALL","su...
  417. // 4开头 type[4] message
  418. console.info('结果解析:', params.response.payloadData)
  419. } catch (e) {
  420. console.error(e)
  421. }
  422. }
  423. Network.webSocketCreated(params => {
  424. console.log('WebSocket created:', params.url)
  425. })
  426. // 订阅 Network.webSocketFrameSent 和 Network.webSocketFrameReceived 事件,监听 WebSocket 帧的发送和接收:
  427. Network.webSocketFrameSent(params => {
  428. console.log('WebSocket frame sent:', params.response)
  429. // formatResponse(params)
  430. })
  431. Network.webSocketFrameReceived(params => {
  432. console.log('WebSocket frame received:', params.response)
  433. // formatResponse(params)
  434. })
  435. // 订阅 Network.webSocketClosed 事件,监听 WebSocket 连接的关闭:
  436. Network.webSocketClosed(params => {
  437. console.log('WebSocket closed:', params.closeCode, params.closeReason)
  438. // formatResponse(params)
  439. })
  440. // 订阅Network.webSocketWillSendHandshakeRequest事件,拦截WebSocket连接的握手请求:
  441. Network.webSocketWillSendHandshakeRequest(params => {
  442. console.log('WebSocket handshake request:', params.request)
  443. // formatResponse(params)
  444. })
  445. // 订阅Network.webSocketHandshakeResponseReceived事件,拦截WebSocket连接的握手响应:
  446. Network.webSocketHandshakeResponseReceived(params => {
  447. console.log('WebSocket handshake response:', params.response)
  448. let data = formatResponse(params)
  449. console.info('webSocketHandshakeResponseReceived解析结果:', data)
  450. })
  451. // 订阅Network.webSocketFrameSent和Network.webSocketFrameReceived事件,拦截WebSocket数据帧的发送和接收:
  452. Network.webSocketFrameSent(params => {
  453. console.log('WebSocket frame sent:', params.response)
  454. // formatResponse(params)
  455. })
  456. Network.webSocketFrameReceived(params => {
  457. // console.log('WebSocket frame received:', params.response)
  458. console.info('webSocketFrameReceived 回复', params.response)
  459. let data = formatResponse(params)
  460. console.info('webSocketFrameReceived解析结果:', data)
  461. })
  462. Network.webSocketFrameError(params => {
  463. console.log('WebSocket frame error:', params.response)
  464. let data = formatResponse(params)
  465. console.info('webSocketFrameError解析结果:', data)
  466. })
  467. await sleep(timeout)
  468. done()
  469. }, timeout)
  470. })