#include "../pch/pch.h" #include "CZhipuziHttpClient.h" #include "rapidjson/document.h" #include "rapidjson/prettywriter.h" #include "rapidjson/writer.h" #include "rapidjson/stringbuffer.h" using namespace rapidjson; #include "../helper/MD5.h" CZhipuziHttpClient CZhipuziHttpClient::m_client; CZhipuziHttpClient::CZhipuziHttpClient() { } CZhipuziHttpClient::~CZhipuziHttpClient() { } void CZhipuziHttpClient::Init(std::string username, std::string password) { m_client.m_username = username; m_client.m_password = password; } bool CZhipuziHttpClient::Login() { std::map params; std::string response; bool ret = m_client.Request("/user/login", params, response); if (!ret) { //网络请求出错 LOG_INFO("network failed!"); return false; } LOG_INFO("response:" << response.c_str()); rapidjson::Document document; document.Parse(response.c_str()); if (!document.IsObject()) { LOG_INFO("message 非法!"); return false; } rapidjson::Value& v_errcode = document["errcode"]; int errcode = v_errcode.GetInt(); if (errcode > 0) { LOG_INFO("login failed! message:" << document["errmsg"].GetString()); return false; } LOG_INFO("login success!"); return true; } bool CZhipuziHttpClient::Request(std::string url, std::map params, std::string& response) { std::string timestamp = to_string(time(NULL)); std::string nonce = "123456"; std::string machinecode = "e6bc5694877b2aec"; //先添加默认参数,用于计算签名 params["username"] = m_username; params["timestamp"] = timestamp; params["nonce"] = nonce; params["machinecode"] = machinecode; params["url"] = m_url + url; //计算签名 std::string postString; for (std::map::iterator it = params.begin(); it != params.end(); ) { postString += it->first + "=" + it->second; it++; if (it != params.end()) { postString += "&"; } } //LOG_INFO("postString:" << postString.c_str()); std::string key = md5(m_password); transform(key.begin(), key.end(), key.begin(), ::toupper); //用于计算签名的临时变量 std::string tmp = postString + key; string sign = md5(tmp); transform(sign.begin(), sign.end(), sign.begin(), ::toupper); //LOG_INFO("sign:" << sign.c_str()); //加上签名,去掉url,计算post params["sign"] = sign; params.erase("url"); postString = ""; for (std::map::iterator it = params.begin(); it != params.end(); ) { postString += it->first + "=" + it->second; it++; if (it != params.end()) { postString += "&"; } } //LOG_INFO("postString:" << postString.c_str()); int ret = m_httpClient.Posts(m_url + url, postString, response, NULL); //LOG_INFO("response:" << response.c_str()); if (!ret) { //ret为0表示没有出错 return true; } return false; /* rapidjson::Document doc; doc.SetObject(); rapidjson::Document::AllocatorType &allocator = doc.GetAllocator(); //获取分配器 doc.AddMember(rapidjson::StringRef("useranme"), rapidjson::StringRef(m_username.c_str()), allocator); doc.AddMember(rapidjson::StringRef("timestamp"), rapidjson::StringRef(timestamp.c_str()), allocator); doc.AddMember(rapidjson::StringRef("nonce"), rapidjson::StringRef(nonce.c_str()), allocator); doc.AddMember(rapidjson::StringRef("machinecode"), rapidjson::StringRef(machinecode.c_str()), allocator); rapidjson::StringBuffer buffer; rapidjson::Writer writer(buffer); doc.Accept(writer); std::string json = std::string(buffer.GetString()); LOG_INFO("json:" << json.c_str());*/ }