Compare commits
10 Commits
9353d3dccc
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 426db0ede6 | |||
| 1e3d3e5a83 | |||
| 3f064f651c | |||
| 7bc3939581 | |||
| be6fc14981 | |||
| 922fcea866 | |||
| eca3fb03f2 | |||
| 6c0d5642ba | |||
| 7ddc6aad72 | |||
| be611c26c8 |
@@ -14,23 +14,9 @@ add_compile_options(
|
|||||||
-Wextra
|
-Wextra
|
||||||
)
|
)
|
||||||
|
|
||||||
if (ENABLE_ASAN)
|
|
||||||
add_compile_options(
|
|
||||||
-fsanitize=address
|
|
||||||
-fsanitize=undefined
|
|
||||||
-fno-omit-frame-pointer
|
|
||||||
)
|
|
||||||
|
|
||||||
add_link_options(
|
|
||||||
-fsanitize=address
|
|
||||||
-fsanitize=undefined
|
|
||||||
)
|
|
||||||
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)
|
||||||
set(CURL_USE_SCHANNEL ON)
|
set(CURL_USE_SCHANNEL ON)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
@@ -55,4 +41,19 @@ FetchContent_MakeAvailable(cJSON curl)
|
|||||||
|
|
||||||
add_executable(main main.c)
|
add_executable(main main.c)
|
||||||
target_include_directories(main PUBLIC ${cJSON_SOURCE_DIR})
|
target_include_directories(main PUBLIC ${cJSON_SOURCE_DIR})
|
||||||
target_link_libraries(main cjson-static libcurl_static pthread)
|
target_link_libraries(main cjson-static libcurl_static pthread)
|
||||||
|
|
||||||
|
if (ENABLE_ASAN)
|
||||||
|
target_link_options(
|
||||||
|
main BEFORE PUBLIC
|
||||||
|
-fsanitize=address
|
||||||
|
-fsanitize=undefined
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (WIN32)
|
||||||
|
target_link_options(
|
||||||
|
main BEFORE PUBLIC
|
||||||
|
-static
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
150
main.c
150
main.c
@@ -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,16 +32,24 @@ 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();
|
||||||
|
|
||||||
const char ENC_URL[] = "https://lbapi-rk.chaoxing.com/lb/parise/enc/get?subRoomId=%s×tamp=%llu&ss=%s";
|
const char ENC_URL[] = "https://lbapi-rk.chaoxing.com/lb/parise/enc/get?subRoomId=%s×tamp=%llu&ss=%s";
|
||||||
const char URL[] = "https://zhibo.chaoxing.com/apis/live/setLivePariseCountByEnc?subroomId=%s&enc=%s×tamp=%llu";
|
const char URL[] = "https://zhibo.chaoxing.com/apis/live/setLivePariseCountByEnc?subroomId=%s&enc=%s×tamp=%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;
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -57,67 +65,67 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
curl_global_init(CURL_GLOBAL_ALL);
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
printf("线程\t状态\t点赞量\n");
|
printf("线程\t状态\t点赞量\t(按下回车键退出)\n");
|
||||||
|
|
||||||
pthread_t **thread_pool = malloc(sizeof(pthread_t *) * thread);
|
pthread_t *thread_pool = malloc(sizeof(pthread_t) * thread);
|
||||||
|
|
||||||
for (int i = 0; i < thread; i++)
|
for (int i = 0; i < thread; i++)
|
||||||
{
|
{
|
||||||
thread_pool[i] = malloc(sizeof(pthread_t));
|
if (i == thread - 1)
|
||||||
pthread_create(thread_pool[i], NULL, (void *)&parise, (void *)i);
|
pthread_create(&thread_pool[i], NULL, (void *)&exit_handler, NULL);
|
||||||
|
else
|
||||||
|
pthread_create(&thread_pool[i], NULL, (void *)&parise, (void *)i);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < thread; i++)
|
for (int i = 0; i < thread; i++)
|
||||||
{
|
pthread_join(thread_pool[i], NULL);
|
||||||
pthread_join(*thread_pool[i], NULL);
|
|
||||||
}
|
free(thread_pool);
|
||||||
|
|
||||||
curl_global_cleanup();
|
curl_global_cleanup();
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++)
|
|
||||||
{
|
|
||||||
free(thread_pool[i]);
|
|
||||||
}
|
|
||||||
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 =
|
||||||
"Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0");
|
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");
|
||||||
|
|
||||||
|
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_HTTPHEADER, headers);
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
long long current_timestamp()
|
long long current_timestamp()
|
||||||
{
|
{
|
||||||
time_t timestamp = time(NULL);
|
const time_t timestamp = time(NULL);
|
||||||
return timestamp * 1000;
|
srand(timestamp);
|
||||||
|
return timestamp * 1000 + (rand() % 1999 - 999); // -999 ~ 999
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
|
size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
|
||||||
@@ -130,31 +138,36 @@ size_t cb(char *data, size_t size, size_t nmemb, void *clientp)
|
|||||||
return 0; /* out of memory! */
|
return 0; /* out of memory! */
|
||||||
|
|
||||||
mem->response = ptr;
|
mem->response = ptr;
|
||||||
memcpy(&(mem->response[mem->size]), data, realsize);
|
memcpy(&mem->response[mem->size], data, realsize);
|
||||||
mem->size += realsize;
|
mem->size += realsize;
|
||||||
mem->response[mem->size] = 0;
|
mem->response[mem->size] = 0;
|
||||||
|
|
||||||
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);
|
||||||
@@ -164,20 +177,33 @@ char *get_enc()
|
|||||||
// {'data': 293687, 'msg': '操作成功', 'result': 1}
|
// {'data': 293687, 'msg': '操作成功', 'result': 1}
|
||||||
void parise(void *arg)
|
void parise(void *arg)
|
||||||
{
|
{
|
||||||
while (true)
|
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)
|
||||||
{
|
{
|
||||||
char url[200];
|
char url[200];
|
||||||
const int idx = (int)arg;
|
|
||||||
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");
|
||||||
@@ -188,12 +214,22 @@ 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);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
curl_slist_free_all(headers);
|
||||||
|
printf("\rSignal Received: exit. T%d exiting\n", idx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void exit_handler()
|
||||||
|
{
|
||||||
|
getchar();
|
||||||
|
flag = 0;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user