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 9c953fc2f9 [Fix Bugs] Refetch Status and time string of Saved File
Bug of refetch: if an id is unreachable, the error message will be printed
3 times. Now we have fixed it and it will only be shown 1 time.
Bug of time string: if data has been generated but you don't enter
filename in time, the file will be saved with a time string of the moment
you enter the filename. Now the time string will be generated before
you entering filename.
2017-03-29 19:39:48 +08:00

447 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];
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;
}
int main()
{
if(EnterSingleMode())
{
printf("<EFBFBD>Ѵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>˳<EFBFBD>.\n");
if(!_begin_after_singlemode) return 0;
}
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");
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);
string fname;
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");
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;
}