pinnacleClient.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import dotenv from 'dotenv';
  2. import https from 'https';
  3. import axios from "axios";
  4. import { HttpsProxyAgent } from "https-proxy-agent";
  5. import Logs from "./logs.js";
  6. import { getAccountInfo } from "./getAccount.js";
  7. dotenv.config();
  8. const axiosDefaultOptions = {
  9. baseURL: "",
  10. url: "",
  11. method: "GET",
  12. headers: {},
  13. params: {},
  14. data: {},
  15. timeout: 10000,
  16. };
  17. const BaseURL = {
  18. pinnacle: "https://api.pinnacle888.com",
  19. ps3838: "https://api.ps3838.com",
  20. pstery: "http://127.0.0.1:9055",
  21. }
  22. export const pinnacleRequest = async (options, channel) => {
  23. const { username, password, localAddress, platform } = getAccountInfo() ?? {};
  24. const { url, ...optionsRest } = options;
  25. if (!url || !channel && (!username || !password)) {
  26. throw new Error("url、username、password、channel is required");
  27. }
  28. Logs.outDev('pinnacle request', { url, channel, username, password, localAddress, platform });
  29. const authHeader = channel ? `Basic ${channel}` : `Basic ${Buffer.from(`${username}:${password}`).toString("base64")}`;
  30. const axiosConfig = { ...axiosDefaultOptions, ...optionsRest, url, baseURL: BaseURL[platform] ?? BaseURL.pinnacle };
  31. Object.assign(axiosConfig.headers, {
  32. "Authorization": authHeader,
  33. "Accept": "application/json",
  34. });
  35. const proxy = process.env.NODE_HTTP_PROXY;
  36. if (proxy) {
  37. axiosConfig.proxy = false;
  38. axiosConfig.httpsAgent = new HttpsProxyAgent(proxy);
  39. // Logs.outDev('pinnacle request using proxy', axiosConfig.httpsAgent);
  40. }
  41. else if (localAddress) {
  42. axiosConfig.httpsAgent = new https.Agent({ localAddress });
  43. }
  44. return axios(axiosConfig)
  45. .then(res => {
  46. // Logs.out('pinnacle request', url, axiosConfig, res.data);
  47. return res.data;
  48. })
  49. .catch(err => {
  50. let user_name = '';
  51. if (channel) {
  52. user_name = Buffer.from(channel, "base64").toString().split(':')[0];
  53. }
  54. else {
  55. user_name = username;
  56. }
  57. const source = { url, params, username: user_name };
  58. if (err?.response?.data) {
  59. const data = err.response.data;
  60. Object.assign(source, { data });
  61. }
  62. err.source = source;
  63. return Promise.reject(err);
  64. });
  65. }
  66. /**
  67. * Pinnacle API Get请求
  68. * @param {*} url
  69. * @param {*} params
  70. * @returns
  71. */
  72. export const pinnacleGet = async (url, params, channel) => {
  73. return pinnacleRequest({
  74. url,
  75. params
  76. }, channel)
  77. }
  78. /**
  79. * Pinnacle API Post请求
  80. * @param {*} url
  81. * @param {*} data
  82. * @returns
  83. */
  84. export const pinnaclePost = async (url, data, channel) => {
  85. return pinnacleRequest({
  86. url,
  87. method: 'POST',
  88. headers: {
  89. 'Content-Type': 'application/json',
  90. },
  91. data
  92. }, channel);
  93. }
  94. export const getPsteryRelations = async (mk=-1) => {
  95. const axiosConfig = {
  96. baseURL: BaseURL.pstery,
  97. url: '/api/pstery/get_games_relation',
  98. method: 'GET',
  99. params: {
  100. mk,
  101. },
  102. proxy: false,
  103. };
  104. return axios(axiosConfig).then(res => res.data);
  105. }
  106. export const updateBaseEvents = async (data) => {
  107. const axiosConfig = {
  108. baseURL: BaseURL.pstery,
  109. url: '/api/pstery/update_base_events',
  110. method: 'POST',
  111. headers: {
  112. 'Content-Type': 'application/json',
  113. },
  114. data: JSON.stringify(data),
  115. proxy: false,
  116. };
  117. axios(axiosConfig).then(res => res.data)
  118. .then(() => {
  119. Logs.out('update base events success', JSON.stringify(data));
  120. })
  121. .catch(err => {
  122. Logs.err('failed to update base events:', err.response?.data ?? err.message);
  123. });
  124. }
  125. export const notifyException = async (message) => {
  126. const axiosConfig = {
  127. baseURL: BaseURL.pstery,
  128. url: '/api/pstery/notify_exception',
  129. method: 'POST',
  130. data: { message },
  131. proxy: false,
  132. };
  133. axios(axiosConfig).then(res => res.data)
  134. .then(() => {
  135. Logs.out('notify exception success');
  136. })
  137. .catch(err => {
  138. Logs.err('failed to notify exception:', err.message);
  139. });
  140. }