Compare commits

..

6 Commits

2 changed files with 67 additions and 49 deletions

View File

@@ -14,15 +14,6 @@ add_compile_options(
-Wextra -Wextra
) )
if (ENABLE_ASAN)
add_compile_options(
-fsanitize=address
-fsanitize=undefined
-fno-omit-frame-pointer
)
message("asan is on. if have any problems, disable it.")
endif ()
# For CURL # For CURL
set(BUILD_STATIC_LIBS ON) set(BUILD_STATIC_LIBS ON)
if (WIN32) if (WIN32)

105
main.c
View File

@@ -17,10 +17,10 @@
sprintf(u, URL, SUBROOMID, enc, timestamp); \ sprintf(u, URL, SUBROOMID, enc, timestamp); \
} }
#ifdef Debug #ifndef NDEBUG
#define DPRINT(s, __VA_ARGS__) \ #define DPRINT(s, __VA_ARGS__) \
{ \ { \
printf(s, ...); \ printf(s, __VA_ARGS__); \
} }
#else #else
#define DPRINT(s, ...) #define DPRINT(s, ...)
@@ -32,10 +32,15 @@ struct memory
size_t size; size_t size;
}; };
CURLcode curl_get(const char *, struct memory *); struct enc
long long current_timestamp(); {
char *enc;
long long timestamp;
};
CURLcode curl_get(CURL *, const char *, struct memory *);
size_t cb(char *, size_t, size_t, void *); size_t cb(char *, size_t, size_t, void *);
char *get_enc(); struct enc get_enc(CURL *);
void parise(void *); void parise(void *);
void exit_handler(); void exit_handler();
@@ -43,6 +48,7 @@ const char ENC_URL[] = "https://lbapi-rk.chaoxing.com/lb/parise/enc/get?subRoomI
const char URL[] = "https://zhibo.chaoxing.com/apis/live/setLivePariseCountByEnc?subroomId=%s&enc=%s&timestamp=%llu"; const char URL[] = "https://zhibo.chaoxing.com/apis/live/setLivePariseCountByEnc?subroomId=%s&enc=%s&timestamp=%llu";
const char SUBROOMID[] = "381236458034402305"; const char SUBROOMID[] = "381236458034402305";
const char SS[] = "381237373432790016"; const char SS[] = "381237373432790016";
const char DNS[] = "8.8.8.8:53,114.114.114.114:53";
static int flag = 1; static int flag = 1;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
@@ -81,36 +87,37 @@ int main(int argc, char *argv[])
return 0; return 0;
} }
CURLcode curl_get(const char *const url, struct memory *chunk) CURLcode curl_custom_init(CURL **curl, struct curl_slist **headers)
{ {
int status; *curl = curl_easy_init();
CURL *curl = NULL;
struct curl_slist *headers = NULL;
curl = curl_easy_init(); if (*curl == NULL)
if (curl == NULL)
return CURLE_FAILED_INIT; return CURLE_FAILED_INIT;
headers = curl_slist_append(headers, "Accept: application/json, text/javascript, */*; q=0.01"); *headers = curl_slist_append(*headers, "Accept: application/json, text/javascript, */*; q=0.01");
headers = curl_slist_append(headers, "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like " *headers =
curl_slist_append(*headers, "User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like "
"Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0"); "Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(*curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(*curl, CURLOPT_DNS_SERVERS, DNS);
curl_easy_setopt(*curl, CURLOPT_USE_SSL, true);
curl_easy_setopt(*curl, CURLOPT_WRITEFUNCTION, cb);
return CURLE_OK;
}
CURLcode curl_get(CURL *curl, const char *const url, struct memory *chunk)
{
int status;
curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_USE_SSL, true);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, cb);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk); curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)chunk);
status = curl_easy_perform(curl); status = curl_easy_perform(curl);
if (status != CURLE_OK) if (status != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(status)); fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(status));
exit(status);
}
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
return status; return status;
} }
@@ -138,24 +145,29 @@ size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
return realsize; return realsize;
} }
char *get_enc() struct enc get_enc(CURL *curl)
{ {
char url[200]; char url[200];
char *ret = NULL; struct enc ret = {0};
struct memory data = {0}; struct memory data = {0};
const cJSON *enc = NULL; const cJSON *json = NULL;
cJSON *data_json = NULL;
REGEN_ENC_URL_F(url, current_timestamp()); ret.timestamp = current_timestamp();
curl_get(url, &data);
REGEN_ENC_URL_F(url, ret.timestamp);
if (curl_get(curl, url, &data) != CURLE_OK)
return ret;
DPRINT("%s\n", data.response); DPRINT("%s\n", data.response);
cJSON *data_json = cJSON_Parse(data.response); data_json = cJSON_Parse(data.response);
enc = cJSON_GetObjectItemCaseSensitive(data_json, "enc"); json = cJSON_GetObjectItemCaseSensitive(data_json, "enc");
const size_t s = strlen(enc->valuestring); const size_t s = strlen(json->valuestring);
ret = malloc(s + 1); ret.enc = malloc(s + 1);
memcpy(ret, enc->valuestring, s + 1); memcpy(ret.enc, json->valuestring, s + 1);
free(data.response); free(data.response);
cJSON_Delete(data_json); cJSON_Delete(data_json);
@@ -166,20 +178,32 @@ char *get_enc()
void parise(void *arg) void parise(void *arg)
{ {
const int idx = (int)arg; const int idx = (int)arg;
CURL *curl = NULL;
struct curl_slist *headers = NULL;
if (curl_custom_init(&curl, &headers) != CURLE_OK)
{
fprintf(stderr, "T%d: curl_custom_init() failed\n", idx);
return;
}
while (flag) while (flag)
{ {
char url[200]; char url[200];
struct memory json_c = {0}; struct memory json_c = {0};
const char *enc = get_enc(); struct enc enc;
const cJSON *result = NULL; const cJSON *result = NULL;
const cJSON *msg = NULL; const cJSON *msg = NULL;
const cJSON *data = NULL; const cJSON *data = NULL;
const cJSON *errorMsg = NULL; const cJSON *errorMsg = NULL;
cJSON *json = NULL; cJSON *json = NULL;
if ((enc = get_enc(curl)).enc == NULL)
continue;
REGEN_URL_F(url, enc, current_timestamp()); REGEN_URL_F(url, enc.enc, enc.timestamp);
curl_get(url, &json_c);
if (curl_get(curl, url, &json_c) != CURLE_OK)
goto clean;
json = cJSON_Parse(json_c.response); json = cJSON_Parse(json_c.response);
result = cJSON_GetObjectItemCaseSensitive(json, "result"); result = cJSON_GetObjectItemCaseSensitive(json, "result");
@@ -190,15 +214,18 @@ void parise(void *arg)
if (result->valueint == 1) if (result->valueint == 1)
printf("\rT%d\t%s\t%d", idx, msg->valuestring, data->valueint); printf("\rT%d\t%s\t%d", idx, msg->valuestring, data->valueint);
else else
printf("\rT%d\t%s", idx, errorMsg->valuestring); fprintf(stderr, "\rT%d\t%s", idx, errorMsg->valuestring);
fflush(stdout); fflush(stdout);
free((void *)enc); clean:
free(enc.enc);
free(json_c.response); free(json_c.response);
cJSON_Delete(json); cJSON_Delete(json);
} }
fprintf(stderr, "\rSignal Received: exit. T%d exiting\n", idx);
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
printf("\rSignal Received: exit. T%d exiting\n", idx);
} }
void exit_handler() void exit_handler()