Api.hpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. ******************************************************************************
  3. * @file : Api.hpp
  4. * @author : Dream
  5. * @brief : API class for handling authentication and data requests
  6. * @attention : None
  7. * @date : 24-10-3
  8. ******************************************************************************
  9. */
  10. #ifndef API_HPP
  11. #define API_HPP
  12. #include <json.hpp>
  13. #include <map>
  14. #include <string>
  15. #include <string_view>
  16. #include "obfuscate.hpp"
  17. struct LoginResponse
  18. {
  19. int code = -1; // 登录状态码
  20. struct Msg
  21. {
  22. time_t id = -1; // 卡密ID
  23. std::string kmtype; // 卡密时长类型
  24. std::string token; // 登录令牌
  25. std::string ktype; // 卡密类型
  26. time_t vip = 0; // 到期时间戳
  27. std::string check; // 数据校验
  28. std::string dateTime; // 服务器时间
  29. std::string expireDateTime; // 到期时间
  30. } msg;
  31. time_t time = 0; // 服务器时间戳
  32. bool login = false;
  33. };
  34. struct CustomResponse
  35. {
  36. std::string token; // 登录令牌
  37. int code = -1; // 状态码
  38. struct Msg
  39. {
  40. time_t endtime = 0; // 到期时间戳
  41. std::string type; // 卡密类型
  42. std::string timetype; // 卡密时长类型
  43. std::string check; // 数据校验
  44. } msg;
  45. time_t time = 0; // 当前时间戳
  46. std::string timeStr; // 格式化剩余时间
  47. };
  48. struct AnnouncementResponse
  49. {
  50. int code = -1; // 公告状态码
  51. struct Msg
  52. {
  53. std::string app_gg; // 公告内容
  54. } msg;
  55. time_t time = 0; // 服务器时间戳
  56. std::string dateTime; // 格式化时间
  57. };
  58. struct UpdateInfo
  59. {
  60. int code = -1; // 状态码
  61. std::string msg; // 消息
  62. std::string version; // 版本号
  63. std::string updateshow; // 更新显示内容
  64. std::string updateurl; // 更新URL
  65. std::string updatemust; // 是否强制更新
  66. time_t time = 0; // 服务器时间戳
  67. };
  68. inline const std::map<std::string, std::string> kmtypeDescription = {
  69. {std::string(AY_OBFUSCATE("free")), std::string(AY_OBFUSCATE("免费模式"))},
  70. {std::string(AY_OBFUSCATE("hour")), std::string(AY_OBFUSCATE("小时卡"))},
  71. {std::string(AY_OBFUSCATE("day")), std::string(AY_OBFUSCATE("日卡"))},
  72. {std::string(AY_OBFUSCATE("week")), std::string(AY_OBFUSCATE("周卡"))},
  73. {std::string(AY_OBFUSCATE("month")), std::string(AY_OBFUSCATE("月卡"))},
  74. {std::string(AY_OBFUSCATE("season")), std::string(AY_OBFUSCATE("高级VIP"))}, // TODO 季节
  75. {std::string(AY_OBFUSCATE("year")), std::string(AY_OBFUSCATE("高级SVIP"))}, // TODO 年卡
  76. {std::string(AY_OBFUSCATE("longuse")), std::string(AY_OBFUSCATE("至尊SVIP"))}, // TODO 长期
  77. {std::string(AY_OBFUSCATE("single")), std::string(AY_OBFUSCATE("点卡"))}
  78. };
  79. inline const std::map<int, std::string> loginStatusDescription = {
  80. {732, std::string(AY_OBFUSCATE("登录成功"))},
  81. {201, std::string(AY_OBFUSCATE("未知报错请联系客服"))},
  82. {100, std::string(AY_OBFUSCATE("未绑定应用ID"))},
  83. {101, std::string(AY_OBFUSCATE("应用不存在"))},
  84. {102, std::string(AY_OBFUSCATE("应用已关闭"))},
  85. {103, std::string(AY_OBFUSCATE("已关闭登录"))},
  86. {104, std::string(AY_OBFUSCATE("签名为空"))},
  87. {105, std::string(AY_OBFUSCATE("数据过期"))},
  88. {106, std::string(AY_OBFUSCATE("签名有误"))},
  89. {107, std::string(AY_OBFUSCATE("数据为空"))},
  90. {108, std::string(AY_OBFUSCATE("未提交时间戳"))},
  91. {112, std::string(AY_OBFUSCATE("未提交设备码"))},
  92. {148, std::string(AY_OBFUSCATE("卡密为空"))},
  93. {149, std::string(AY_OBFUSCATE("卡密不存在"))},
  94. {150, std::string(AY_OBFUSCATE("卡密已使用"))},
  95. {151, std::string(AY_OBFUSCATE("卡密已被禁用"))},
  96. {152, std::string(AY_OBFUSCATE("卡密类型不一致"))}
  97. };
  98. class API
  99. {
  100. public:
  101. API(std::string kami, std::string device_key);
  102. [[nodiscard]] bool single_code_login(LoginResponse& ret) const;
  103. static void parseAnnouncementResponse(AnnouncementResponse& response);
  104. [[nodiscard]] UpdateInfo parseUpdateResponse() const;
  105. void parseCustomResponse(CustomResponse& ret) const;
  106. [[nodiscard]] uint64_t get_remote_variable(std::string_view variable_name, std::string_view token) const;
  107. [[nodiscard]] nlohmann::json single_code_unbind() const;
  108. private:
  109. std::string kami;
  110. std::string device_key;
  111. [[nodiscard]] std::string generate_sign(time_t tt, std::string_view extra = "") const;
  112. [[nodiscard]] static nlohmann::json send_encrypted_request(std::string_view data_to_encrypt, const std::string& key);
  113. [[nodiscard]] static LoginResponse parseLoginResponse(const nlohmann::json& root);
  114. [[nodiscard]] static std::string convertTimestampToDateTime(time_t timestamp);
  115. [[nodiscard]] nlohmann::json get_updates() const;
  116. [[nodiscard]] static nlohmann::json get_announcement();
  117. inline static const std::string appkey = std::string(AY_OBFUSCATE("Zpmr6I7JP6yM5R0I"));
  118. inline static const std::string login_id = std::string(AY_OBFUSCATE("778FF5312FC"));
  119. inline static const std::string unbind_id = std::string(AY_OBFUSCATE("F16EC9E49D9"));
  120. inline static const std::string announcement_id = std::string(AY_OBFUSCATE("B1C1837EE43"));
  121. inline static const std::string update_id = std::string(AY_OBFUSCATE("AB6FA9E9E52"));
  122. inline static const std::string remote_variable_id = std::string(AY_OBFUSCATE("19C09E8F9B1"));
  123. inline static const std::string heartbeat_id = std::string(AY_OBFUSCATE("835A8437B2C"));
  124. inline static constexpr int Local_heck_code = 98458;
  125. inline static constexpr int remote_variable_code = 7816;
  126. inline static constexpr int heartbeat_code = 53522;
  127. inline static constexpr int announcement_code = 11355;
  128. inline static constexpr int update_code = 99442;
  129. };
  130. void convertSecondsToTime(time_t seconds, std::string& timeStr);
  131. time_t calculateRemainingTime(const CustomResponse& response);
  132. #endif // API_HPP