This repository has been archived on 2021-11-25. You can view files and clone it, but cannot push or open issues or pull requests.
CardWatcher/main.cpp
Kiritow 5543cc6473 Add auto-toolchain mode.
Auto-Toolchain: Passing 5 paraments, this program will switch to auto
mode. In this mode, data will be fetched and saved to a file
automatically.
Fix Bug: Now if you don't press any key, the program will enter normal
mode and start fetching data with default settings.
2017-03-30 16:57:57 +08:00

471 lines
11 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <thread>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cpplib/cpplib#time>
#include <conio.h>
using namespace std;
int parseValue(string Filename,double& val,double& val2)
{
printf("Filename : %s\n",Filename.c_str());
ifstream ifs(Filename);
string temp,s;
while(getline(ifs,temp)) s.append(temp);
printf("%s\n",s.c_str());
string target="amt";
string::size_type ans=s.find(target);
printf("Found value 1 in ... %u\n",ans);
if(ans==string::npos)
{
return -2;
}
istringstream istr(s.substr(ans+7));
double a=-1;
istr>>a;
ans=s.find(target,ans+target.size());
printf("Found value 2 in ... %u\n",ans);
if(ans==string::npos)
{
return -3;
}
istr.str(s.substr(ans+7));
double b=-1;
istr>>b;
val=a;
val2=b;
return 0;
}
struct cashinfo
{
cashinfo(bool Status=false,double Current=0,double TransForming=0):status(Status),current(Current),transforming(TransForming){}
bool status;
double current;
double transforming;
};
cashinfo LocalParse(int id)
{
char buff[1024];
sprintf(buff,"data/%d.txt",id);
string Filename(buff);
cashinfo info;
info.status=(parseValue(Filename,info.current,info.transforming)==0);
return info;
}
void prepareCookie()
{
system(R"(curl -s "life.ccb.com/tran/WCCMainPlatV5?CCB_IBSVersion=V5&SERVLET_NAME=WCCMainPlatV5&TXCODE=100119&USERID=&SKEY=" --user-agent "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1" -c temp/cookie1.txt > temp/step1.txt)");
}
bool _fetched_cookie=false;
void BeginNetwork()
{
if(!_fetched_cookie)
{
prepareCookie();
_fetched_cookie=true;
}
}
void RunCommand(string stuNumber,string outputFilename)
{
string cmd=R"(curl -s "life.ccb.com/tran/WCCMainPlatV5?CCB_IBSVersion=V5&SERVLET_NAME=WCCMainPlatV5&isAjaxRequest=true&TXCODE=JF1103&OPUN_COD=370200&MERCHANT=#STUCODE#100010&COMM=#STUCODE#&BANK_COD=370000&BIll_CODE=100010&PAY_TYPE=11&BILL_FLAG=0&BIll_MERCHANT=600007&BANK_NAME=%E5%B1%B1%E4%B8%9C%E7%9C%81&OPUN_NAME=%E9%9D%92%E5%B2%9B%E5%B8%82&MERCHANT_NAME=%E9%9D%92%E5%B2%9B%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6%E6%A0%A1%E5%9B%AD%E5%8D%A1%E5%85%85%E5%80%BC&BILL_TYPE=2&BRAN_NO=371000000&BILL_ITEM=01013&BILL_NAME=IC%E5%8D%A1%E3%80%81%E8%81%94%E5%90%8D%E5%8D%A1%E5%85%85%E5%80%BC&RE1CON=&RE2CON=" --user-agent "Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101 Firefox/14.0.1" -b "temp/cookie1.txt" > )" ;
string target="#STUCODE#";
while( cmd.find(target)!= string::npos )
{
cmd=cmd.replace(cmd.find(target),target.size(),stuNumber);
}
cmd.append(outputFilename);
system(cmd.c_str());
}
void RemoteQuery(string PreCode,int ID)
{
char buff[1024];
sprintf(buff,"%s%02d",PreCode.c_str(),ID);
string stuCode(buff);
sprintf(buff,"data/%d.txt",ID);
string Filename(buff);
printf("ִ<EFBFBD>в<EFBFBD>ѯ.. StuID=%s\n",stuCode.c_str());
RunCommand(stuCode,Filename);
/// Delay 1~4 seconds
this_thread::sleep_for(chrono::seconds(rand()%3+1));
}
/*****************<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>***************/
char _head_str[16]{"15080801"};
const char* HEAD_STR = _head_str;
int _num = 40;
const int& NUM=_num;
int _beginnum=0;
const int& BEGIN_NUM = _beginnum;
bool _begin_after_singlemode = false;
void _ClearKbhit()
{
while(kbhit()) getch();
}
int ParseCommand(string Command)
{
istringstream istr(Command);
string cmd;
istr>>cmd;
if(cmd=="help")
{
printf("=====SingleMode <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>=====\n");
printf("===<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>===\n");
printf("help <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>\n");
printf("query StudentID <20><>ѯij<D1AF><C4B3>ID<49><44>Ӧ<EFBFBD>ļ<EFBFBD>¼\n");
printf("===<3D>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>===\n");
printf("sethead HEAD_STR <20>޸<EFBFBD>HeadStr,<2C><>ǰֵ<C7B0><D6B5>%s(<28>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>)\n",HEAD_STR);
printf("setbegin BeginVal <20>޸<EFBFBD>ID<49><44>ʼ<EFBFBD><CABC>,<2C><>ǰֵ<C7B0><D6B5>%d(<28>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>)\n",BEGIN_NUM);
printf("setend EndVal <20>޸<EFBFBD>ID<49>յ<EFBFBD>,<2C><>ǰֵ<C7B0><D6B5>%d(<28>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>)\n",NUM);
printf("updatecookie <20><><EFBFBD>»<EFBFBD>ȡcookie(<28>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD>)\n");
printf("===<3D>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>===\n");
printf("enterauto <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>ǰģʽ)\n");
printf("exit <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ģʽ\n");
return 0;
}
else if(cmd=="enterauto")
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ!<21><><EFBFBD>ٴ<EFBFBD>ȷ<EFBFBD>ϵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>enterautoyes\n");
printf("<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: HEAD_STR=%s BeginVal=%d EndVal=%d\n",HEAD_STR,BEGIN_NUM,NUM);
return 0;
}
else if(cmd=="updatecookie")
{
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡCookie<EFBFBD><EFBFBD>...\n");
prepareCookie();
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡCookie<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
return 0;
}
else if(cmd=="sethead")
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>HEAD_STR\n");
string headstr;
if(istr>>headstr)
{
if(headstr.size()!=8)
{
printf("<EFBFBD><EFBFBD>HEAD_STR<EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD><EFBFBD>ȷ\n");
return 0;
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>HEAD_STR<EFBFBD><EFBFBD>...\n");
memset(_head_str,0,16);
strcpy(_head_str,headstr.c_str());
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
}
else
{
printf("<EFBFBD><EFBFBD>ȡHEAD_STRʧ<EFBFBD><EFBFBD>.\n");
}
return 0;
}
else if(cmd=="setbegin")
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>\n");
int val;
if(istr>>val)
{
if(val<0)
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD>ΪID<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>\n");
return 0;
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>...\n");
_beginnum=val;
}
else
{
printf("<EFBFBD><EFBFBD>ȡID<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>\n");
}
return 0;
}
else if(cmd=="setend")
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD>յ<EFBFBD>(<28><>).\n");
int val;
if(istr>>val)
{
if(val<0||val<=BEGIN_NUM)
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ID<EFBFBD>յ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ.\n");
return 0;
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD>յ<EFBFBD>...\n");
_num=val;
}
else
{
printf("<EFBFBD><EFBFBD>ȡID<EFBFBD>յ<EFBFBD>ʧ<EFBFBD><EFBFBD>\n");
}
return 0;
}
else if(cmd=="enterautoyes")
{
printf("<EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ...\n");
_begin_after_singlemode=true;
return -1;
}
else if(cmd=="exit")
{
printf("<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ.\n");
return -1;
}
else if(cmd=="query")
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯģʽ\n");
string id;
if(istr>>id)
{
printf("<EFBFBD><EFBFBD>ѯID=%s<>ļ<EFBFBD>¼\n",id.c_str());
if(id.size()!=10)
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
return 0;
}
int val;
sscanf(id.c_str()+8,"%d",&val);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...\n");
BeginNetwork();
printf("ִ<EFBFBD>в<EFBFBD>ѯǰ...\n");
RemoteQuery(id.substr(0,8),val);
printf("ִ<EFBFBD>в<EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
printf("<EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD><EFBFBD><EFBFBD>ǰ...\n");
cashinfo info=LocalParse(val);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
printf("[%s] <20><><EFBFBD><EFBFBD>:%.2f <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:%.2f\n",info.status?"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>":"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>",info.current,info.transforming);
}
else
{
printf("<EFBFBD><EFBFBD>ȡIDʧ<EFBFBD><EFBFBD>.\n");
}
return 0;
}
else
{
if(cmd.size()) printf("δ֪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
return 0;
}
}
void SingleModeMain()
{
printf("<EFBFBD>ѽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ.\n");
_ClearKbhit();
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD>\n");
while(1)
{
printf("SingleMode> ");
fflush(stdout);
string command;
getline(cin,command);
if(ParseCommand(command)<0) break;
}
printf("<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ...\n");
}
bool EnterSingleMode()
{
int lastval=-1;
int interval=50;/// ms
int looptime=3000/interval;
for(int i=0;i<looptime;i++)
{
if((looptime-i)*interval/1000!=lastval)
{
lastval=(looptime-i)*interval/1000;
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κΰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. %d<><64><EFBFBD>󽫽<EFBFBD><F3BDABBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ.\n",lastval);
}
if(kbhit())
{
SingleModeMain();
return true;
}
this_thread::sleep_for(chrono::milliseconds(interval));
}
return false;
}
bool _out_file_targeted=false;
char _out_file_name[1024];
int main(int argc,char* argv[])
{
/// <20><><EFBFBD><EFBFBD>argc==5,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ.
if(argc!=5)
{
if(EnterSingleMode())
{
printf("<EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>˳<EFBFBD>.\n");
if(!_begin_after_singlemode) return 0;
}
}
if(argc==4)
{
strncpy(_head_str,argv[1],8);
sscanf(argv[2],"%d",&_beginnum);
sscanf(argv[3],"%d",&_num);
_out_file_targeted=true;
strcpy(_out_file_name,argv[4]);
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>Զ<EFBFBD>ģʽ.\n");
printf("Target: Fetch %s01 to %s%02d...\n",HEAD_STR,HEAD_STR,NUM);
if(strlen(HEAD_STR)!=10-2)
{
printf("ѧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD>Զ<EFBFBD>ģʽ.\n");
return 0;
}
printf("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...\n");
srand(time(NULL));
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>..\n");
system("mkdir temp");
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>...\n");
system("mkdir data");
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>...\n");
system("mkdir result");
printf("׼<EFBFBD><EFBFBD>Cookies<EFBFBD>ļ<EFBFBD>...\n");
BeginNetwork();
printf("<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ѯ...\n");
for(int i=BEGIN_NUM;i<NUM;i++)
{
RemoteQuery(HEAD_STR,i+1);
}
printf("<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>...\n");
vector<cashinfo> vec;
queue<pair<int,int>> needrefetch;
for(int i=0;i<NUM;i++)
{
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d of %d\n",i+1,NUM);
cashinfo val=LocalParse(i+1);
if(!val.status)
{
needrefetch.push(make_pair(i+1,0));
}
vec.push_back(val);
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡ...\n");
if(!needrefetch.empty())
{
printf("<EFBFBD><EFBFBD>%u<><75><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>»<EFBFBD>ȡ...\n",needrefetch.size());
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡ...\n");
BeginNetwork();
while(!needrefetch.empty())
{
pair<int,int> pack=needrefetch.front();
needrefetch.pop();
int id=pack.first;
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡID: %d\n",id);
RemoteQuery(HEAD_STR,id);
cashinfo val=LocalParse(id);
if(!val.status)
{
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡID: %d ʧ<><CAA7>.\n",id);
if(pack.second<3)
{
needrefetch.push(make_pair(id,pack.second+1));
}
else
{
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡʧ<EFBFBD>ܶ<EFBFBD><EFBFBD><EFBFBD>,ֹͣ<CDA3><D6B9>ȡID: %d.\n",id);
}
}
else
{
printf("<EFBFBD><EFBFBD><EFBFBD>»<EFBFBD>ȡID: %d <20>ɹ<EFBFBD>.\n",id);
vec.at(id-1)=val;
}
}
}
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n");
string fname;
if(_out_file_targeted)
{
s_time now=whattime();
char gpbuff[1024];
sprintf(gpbuff,"-%04d%02d%02d-%02d%02d%02d",now.year,now.mon,now.day,now.hour,now.min,now.sec);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E4BDAB><EFBFBD>Զ<EFBFBD>׷<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>β,<2C><>׺<EFBFBD><D7BA>Ϊtxt\n");
getline(cin,fname);
fname=string("result/")+fname;
fname.append(gpbuff);
fname.append(".txt");
}
else
{
fname=string(_out_file_name);
}
printf("<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD>浽 %s\n",fname.c_str());
ofstream ofs(fname);
for(size_t i=0;i<vec.size();i++)
{
if(vec.at(i).status) ofs<<i+1<<" "<<vec.at(i).current<<" "<<vec.at(i).transforming<<endl;
else ofs<<i+1+BEGIN_NUM<<" -1 -1"<<endl;
}
ofs.flush();
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>.\n");
return 0;
}