#include #include #include #include #include #include #include #include #include #include #include #include #include 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("执行查询.. StuID=%s\n",stuCode.c_str()); RunCommand(stuCode,Filename); /// Delay 1~4 seconds this_thread::sleep_for(chrono::seconds(rand()%3+1)); } /*****************参数设置***************/ char* _head_str = (char*)"15080801"; const char* const 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 帮助列表=====\n"); printf("===常规操作===\n"); printf("help 显示本帮助列表\n"); printf("query StudentID 查询某个ID对应的记录\n"); printf("===高级操作===\n"); printf("sethead HEAD_STR 修改HeadStr,当前值是%s(高级操作)\n",HEAD_STR); printf("setbegin BeginVal 修改ID起始点,当前值是%d(高级操作)\n",BEGIN_NUM); printf("setend EndVal 修改ID终点,当前值是%d(高级操作)\n",NUM); printf("updatecookie 重新获取cookie(高级操作)\n"); printf("===退出操作===\n"); printf("enterauto 进入自动模式(这个操作将退出当前模式)\n"); printf("exit 退出特殊模式\n"); return 0; } else if(cmd=="enterauto") { printf("将进入自动模式!请再次确认当前参数并键入enterautoyes\n"); printf("当前参数: HEAD_STR=%s BeginVal=%d EndVal=%d\n",HEAD_STR,BEGIN_NUM,NUM); return 0; } else if(cmd=="updatecookie") { printf("重新获取Cookie中...\n"); prepareCookie(); printf("重新获取Cookie完成\n"); return 0; } else if(cmd=="sethead") { printf("设置HEAD_STR\n"); string headstr; if(istr>>headstr) { if(headstr.size()!=8) { printf("新HEAD_STR长度不正确\n"); return 0; } printf("设置HEAD_STR中...\n"); _head_str=new char[16]; memset(_head_str,0,16); strcpy(_head_str,headstr.c_str()); printf("设置完成.\n"); } else { printf("获取HEAD_STR失败.\n"); } return 0; } else if(cmd=="setbegin") { printf("设置ID起始点\n"); int val; if(istr>>val) { if(val<0) { printf("不能设置负数为ID起始点\n"); return 0; } printf("设置ID起点...\n"); _beginnum=val; } else { printf("读取ID起始点失败\n"); } return 0; } else if(cmd=="setend") { printf("设置ID终点(含).\n"); int val; if(istr>>val) { if(val<0||val<=BEGIN_NUM) { printf("所设置的ID终点值不正确.\n"); return 0; } printf("设置ID终点...\n"); _num=val; } else { printf("读取ID终点失败\n"); } return 0; } else if(cmd=="enterautoyes") { printf("设置常规启动标识...\n"); _begin_after_singlemode=true; return -1; } else if(cmd=="exit") { printf("退出特殊模式.\n"); return -1; } else if(cmd=="query") { printf("单点查询模式\n"); string id; if(istr>>id) { printf("查询ID=%s的记录\n",id.c_str()); if(id.size()!=10) { printf("不正确的ID长度.\n"); return 0; } int val; sscanf(id.c_str()+8,"%d",&val); printf("启动网络程序...\n"); BeginNetwork(); printf("执行查询前...\n"); RemoteQuery(id.substr(0,8),val); printf("执行查询完毕.\n"); printf("调用解析前...\n"); cashinfo info=LocalParse(val); printf("解析完成.\n"); printf("[%s] 余额:%.2f 过渡余额:%.2f\n",info.status?"解析成功":"解析失败",info.current,info.transforming); } else { printf("读取ID失败.\n"); } return 0; } else { if(cmd.size()) printf("未知的命令.\n"); return 0; } } void SingleModeMain() { printf("已进入特殊模式.\n"); _ClearKbhit(); printf("键入指令以实现功能\n"); while(1) { printf("SingleMode> "); fflush(stdout); string command; getline(cin,command); if(ParseCommand(command)<0) break; } printf("退出特殊模式...\n"); } bool EnterSingleMode() { int lastval=-1; int interval=50;/// ms int looptime=3000/interval; for(int i=0;i vec; queue> needrefetch; for(int i=0;i pack=needrefetch.front(); needrefetch.pop(); int id=pack.first; printf("重新获取ID: %d\n",id); RemoteQuery(HEAD_STR,id); cashinfo val=LocalParse(id); if(!val.status) { printf("重新获取ID: %d 失败.\n",id); if(pack.second<3) { printf("重新获取失败多次,停止获取ID: %d.\n",id); needrefetch.push(make_pair(id,pack.second+1)); } } else { printf("重新获取ID: %d 成功.\n",id); vec.at(id-1)=val; } } } printf("解析完成.\n"); string fname; printf("请输入保存文件名称,时间将会自动追加到结尾,后缀名为txt\n"); getline(cin,fname); fname=string("result/")+fname; 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); fname.append(gpbuff); fname.append(".txt"); printf("正在保存到 %s\n",fname.c_str()); ofstream ofs(fname); for(size_t i=0;i