ClashApi.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "stdafx.h"
  2. #include "ClashApi.h"
  3. ClashApi::ClashApi():m_port(0)
  4. {
  5. }
  6. ClashApi::~ClashApi()
  7. {
  8. }
  9. void ClashApi::SetProt(int port)
  10. {
  11. std::string t;
  12. t.append("http://127.0.0.1:");
  13. t.append(std::to_string(port));
  14. m_api_base_url = t;
  15. }
  16. std::string ClashApi::GetVersion()
  17. {
  18. cpr::Session m_cpr_session;
  19. auto url = m_api_base_url + "/version";
  20. m_cpr_session.SetUrl(cpr::Url{ url });
  21. auto res = m_cpr_session.Get();
  22. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  23. return nlohmann::json::parse(res.text).at("version").get<std::string>();
  24. }
  25. ClashConfig ClashApi::GetConfig()
  26. {
  27. cpr::Session m_cpr_session;
  28. auto url = m_api_base_url + "/configs";
  29. m_cpr_session.SetUrl(cpr::Url{ url });
  30. auto res = m_cpr_session.Get();
  31. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  32. return nlohmann::json::parse(res.text).get<ClashConfig>();
  33. }
  34. bool ClashApi::RequestConfigUpdate(std::filesystem::path configPath)
  35. {
  36. try
  37. {
  38. cpr::Session m_cpr_session;
  39. nlohmann::json j = {
  40. {"path",Utf16ToUtf8(configPath.wstring())}
  41. };
  42. // cpr::Put(cpr::Url{ url }, cpr::Body{ j.dump() });
  43. auto url = m_api_base_url + "/configs";
  44. /* auto url = m_api_base_url + "/configs";
  45. m_cpr_session.SetUrl(cpr::Url{ url });
  46. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  47. auto res = m_cpr_session.Put();*/
  48. auto ret = cpr::Put(cpr::Url{ url }, cpr::Body{ j.dump() });
  49. return ret.status_code == 204;
  50. }
  51. CATCH_LOG();
  52. return false;
  53. }
  54. bool ClashApi::UpdateProxyMode(ClashProxyMode mode)
  55. {
  56. cpr::Session m_cpr_session;
  57. nlohmann::json j = {
  58. {"mode",mode}
  59. };
  60. auto url = m_api_base_url + "/configs";
  61. m_cpr_session.SetUrl(cpr::Url{ url });
  62. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  63. auto res = m_cpr_session.Patch();
  64. return res.status_code == 204;
  65. }
  66. bool ClashApi::UpdateLogLevel(ClashLogLevel level)
  67. {
  68. cpr::Session m_cpr_session;
  69. nlohmann::json j = {
  70. {"log-level",level}
  71. };
  72. auto url = m_api_base_url + "/configs";
  73. m_cpr_session.SetUrl(cpr::Url{ url });
  74. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  75. auto res = m_cpr_session.Patch();
  76. return res.status_code == 204;
  77. }
  78. bool ClashApi::UpdateAllowLan(bool allow)
  79. {
  80. cpr::Session m_cpr_session;
  81. nlohmann::json j = {
  82. {"allow-lan",allow}
  83. };
  84. auto url = m_api_base_url + "/configs";
  85. m_cpr_session.SetUrl(cpr::Url{ url });
  86. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  87. auto res = m_cpr_session.Patch();
  88. return res.status_code == 204;
  89. }
  90. u16milliseconds ClashApi::GetProxyDelay(std::string_view proxyName)
  91. {
  92. cpr::Session m_cpr_session;
  93. std::string path = m_api_base_url + "/proxies/";
  94. path.append(Utf16ToUtf8(Utf8ToUtf16(proxyName)));
  95. path.append("/delay"); // "/proxies/\(proxyName.encoded)/delay"
  96. path.append("?timeout=5000&url=");
  97. path.append("http://cp.cloudflare.com/generate_204");
  98. m_cpr_session.SetUrl(cpr::Url{ path });
  99. auto res = m_cpr_session.Get();
  100. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  101. return u16milliseconds(nlohmann::json::parse(res.text).at("delay").get<uint16_t>());
  102. }
  103. ClashProxies ClashApi::GetProxies()
  104. {
  105. cpr::Session m_cpr_session;
  106. auto url = m_api_base_url + "/proxies";
  107. m_cpr_session.SetUrl(cpr::Url{ url });
  108. auto res = m_cpr_session.Get();
  109. THROW_HR_IF(HTTP_E_STATUS_UNEXPECTED, res.status_code != 200);
  110. return nlohmann::json::parse(res.text).get<ClashProxies>();
  111. }
  112. bool ClashApi::UpdateProxyGroup(std::string_view group, std::string_view selectProxy)
  113. {
  114. try
  115. {
  116. cpr::Session m_cpr_session;
  117. nlohmann::json j = {
  118. {"name",selectProxy}
  119. };
  120. auto url = m_api_base_url + "/proxies/";
  121. url.append(group);
  122. auto res = cpr::Put(cpr::Url{ url }, cpr::Body{ j.dump() });
  123. /*std::string path = "/proxies/";
  124. path.append(group);
  125. m_cpr_session.SetUrl(cpr::Url{ path });
  126. m_cpr_session.SetBody(cpr::Body{ j.dump() });
  127. auto res = m_cpr_session.Put()*/;
  128. return res.status_code == 204; // HTTP 204 No Content
  129. }
  130. catch (...)
  131. {
  132. return false;
  133. }
  134. return false;
  135. }