⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 templetidentify.cpp

📁 可以进行膜板定制的动态网页下载分析的源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "TempletIdentify.h"
#include "cgetwebpage.h"
#define Lowcase(x) ((x) >= 'A'&&(x)<='Z'?(x)-'A'+'a':(x))
TempletIdentify::TempletIdentify(char *path)
{
	pGetTree = new IndexTree;
	lClientArgNum = 0;
	pClientArg = NULL;
	pClientUrl = NULL;
	memset(pControlHead,0,8);
	pSecondUrlMode = NULL;
	pServerArg = NULL;
	pServerUrl = NULL;
	pAllBuf = new char[2048000];
	pNowPos = pAllBuf;
	strcpy(this->syspath,path);
	char filename[300];
	sprintf(filename,"%s\\indextree.dat",path);
	if(access(filename,0) == 0)
		pGetTree->LoadTree(filename);
	m_InitSuccess = -1;
	sprintf(filename,"%s\\Enter.ini",path);

	m_InitSuccess = ReadConfigure(filename);

}
long TempletIdentify::ReadConfigure(char *file)
{
	FILE *fp = fopen(file,"rb");
	if(fp == NULL)
		return -1;
	char pReadBuf[1024];
	char *p;
	long lLen = 0;
	FILE *fp1;
	pControlHead[0] = NULL;
	pControlHead[1] = NULL;
	long lNowNum = 0;
	long i,j;
	char filename[300];
	while(fgets(pReadBuf,1020,fp))
	{
		if(strnicmp("模板1=",pReadBuf,6) == 0)
		{
			p = pReadBuf+6;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			sprintf(filename,"%s\\%s",syspath,p);
			fp1 = fopen(filename,"rb");
			if(fp1 == NULL)
			{
				fclose(fp);
				return -1;
			}
			lLen = fread(pAllBuf,1,1048576,fp1);
			fclose(fp1);
			pAllBuf[lLen] = 0;
			pControlHead[0] = CreateTemplet(pAllBuf);
			if(pControlHead[0] == NULL)
			{
				fclose(fp);
				return -1;
			}
		}
		else if(strnicmp("模板2=",pReadBuf,6) == 0)
		{
			p = pReadBuf+6;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			sprintf(filename,"%s\\%s",syspath,p);
			fp1 = fopen(filename,"rb");
			if(fp1 == NULL)
			{
				fclose(fp);
				return -1;
			}
			lLen = fread(pAllBuf,1,1048576,fp1);
			fclose(fp1);
			pAllBuf[lLen] = 0;
			pControlHead[1] = CreateTemplet(pAllBuf);
			if(pControlHead[1] == NULL)
			{
				fclose(fp);
				return -1;
			}
		}
		else if(strnicmp("clientUrl=",pReadBuf,10) == 0)
		{
			p = pReadBuf+10;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			pClientUrl = new char[lLen+10];
			strcpy(pClientUrl,p);
		}
		else if(strnicmp("serverUrl=",pReadBuf,10) == 0)
		{
			p = pReadBuf+10;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			pServerUrl = new char[lLen+10];
			strcpy(pServerUrl,p);
		}
		else if(strnicmp("ServerRule=",pReadBuf,11) == 0)
		{
			p = pReadBuf+11;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			pServerArg = new char[lLen+10];
			strcpy(pServerArg,p);
		}
		else if(strnicmp("SecondUrl=",pReadBuf,10) == 0)
		{
			p = pReadBuf+10;
			while(*p == ' ')p++;
			lLen = strlen(p)-1;
			while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
			p[lLen+1] = 0;
			pSecondUrlMode = new char[lLen+10];
			strcpy(pSecondUrlMode,p);
		}
		else if(strnicmp("clientArgNum=",pReadBuf,13) == 0)
		{
			p = pReadBuf+13;
			lClientArgNum = atol(p);
			pClientArg = new ArgStruct[lClientArgNum];
			memset(pClientArg,0,sizeof(ArgStruct)*lClientArgNum);
			for(i=0;i<lClientArgNum && fgets(pReadBuf,1020,fp);i++)
			{				
				p = pReadBuf;
				while(*p == ' ')p++;
				lLen = strlen(p)-1;
				while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
				p[lLen+1] = 0;
				pClientArg[i].argName = new char[lLen+10];
				strcpy(pClientArg[i].argName,p);
				if(fgets(pReadBuf,1020,fp)==NULL)
				{
					fclose(fp);
					return -1;
				}
				pClientArg[i].lArgValueNum = atol(pReadBuf);
				lLen = pClientArg[i].lArgValueNum;
				pClientArg[i].pArgv = new char *[lLen];
				memset(pClientArg[i].pArgv,0,lLen*4);
				pClientArg[i].pArgvServer = new char*[lLen];
				memset(pClientArg[i].pArgvServer,0,lLen*4);
				for(j=0;j<pClientArg[i].lArgValueNum&&fgets(pReadBuf,1020,fp);j++)
				{
					p = strstr(pReadBuf,"/*");
					if(p == NULL)
					{
						fclose(fp);
						return -1;
					}
					pClientArg[i].pArgv[j] = new char[p-pReadBuf+2];
					memcpy(pClientArg[i].pArgv[j],pReadBuf,p-pReadBuf);
					pClientArg[i].pArgv[j][p-pReadBuf] = 0;
					p = strstr(p,"*/");
					if(p == NULL)
					{
						fclose(fp);
						return -1;
					}
					p+=2;
					while(*p == ' ')p++;
					lLen = strlen(p)-1;
					while(lLen >= 0 && (p[lLen] == (char)0x0d || p[lLen] == (char)0x0a || p[lLen] == '\t' || p[lLen] == ' '))lLen--;
					p[lLen+1] = 0;	
					if(lLen<=0)
						continue;
					lLen++;
					pClientArg[i].pArgvServer[j] = new char[lLen+2];
					strcpy(pClientArg[i].pArgvServer[j],p);
				}
				if(j != pClientArg[i].lArgValueNum)
				{
					fclose(fp);
					return -1;
				}
			}
			if(i != lClientArgNum)
			{
				fclose(fp);
				return -1;
			}
		}
		else 
			break;
	}
	fclose(fp);
	return 0;
}
TempletIdentify::~TempletIdentify()
{
	delete pAllBuf;
	long i,j;
	TempletControl *pNode;
	for(i=0;i<2;i++)
	{
		while(pControlHead[i])
		{
			pNode = pControlHead[i]->pNextControl;
			delete pControlHead[i];
			pControlHead[i] = pNode;
		}
	}
	if(pClientArg)
	{
		for(i=0;i<lClientArgNum;i++)
		{
			for(j=0;j<pClientArg[i].lArgValueNum;j++)
			{
				if(pClientArg[i].pArgv && pClientArg[i].pArgv[j])
					delete pClientArg[i].pArgv[j];
				if(pClientArg[i].pArgvServer && pClientArg[i].pArgvServer[j])
					delete pClientArg[i].pArgvServer[j];
			}
			if(pClientArg[i].pArgv)
				delete pClientArg[i].pArgv;
			if(pClientArg[i].pArgvServer)
				delete pClientArg[i].pArgvServer;
			if(pClientArg[i].argName)
				delete pClientArg[i].argName;
		}
		delete pClientArg;
	}
	if(pClientUrl) delete pClientUrl;
	if(pSecondUrlMode) delete pSecondUrlMode;
	if(pServerArg) delete pServerArg;
	if(pServerUrl) delete pServerUrl;
	if(pGetTree)	delete pGetTree;

}

TempletControl *TempletIdentify::CreateTemplet(char *pTempletBuf)
{
	TempletControl *pHead = new TempletControl;
	TempletControl *pNowNode = pHead,*pNextNode= NULL;
	
	char *p2,*p3;
	char *p = pTempletBuf;
	char *p1 = pHead->description;
	long lLoopStack[100];
	long lLoopNum = 0;
	long lLastSign = 0;//如果为空格则为1
	while(*p)
	{
		if(*p == ' ' || *p == 0x0d || *p == 0x0a || *p == '\t')
		{			
			p++;
			if(lLastSign == 0)
			{
				if(p1 != pNowNode->description)
					*p1++ = ' ';
			}
			lLastSign = 1;
			continue;
		}
		if(*p == '&')
		{
			p++;
			if(strnicmp(p,"nbsp",4) == 0)
				p+=4;
			else if(strnicmp(p,"gb",2) == 0)
				p+=2;
			else if(strnicmp(p,"lt",2) == 0)
				p+=2;
			else if(strnicmp(p,"amp",3) == 0)
				p+=3;
			if(*p == ';')
				p++;
			if(lLastSign == 0)
			{
				if(p1 != pNowNode->description)
					*p1++ = ' ';
			}
			lLastSign = 1;
			continue;
		}
		else if(*p == '<')
		{
			if(*(p+1) == '%')//变量
			{
				*p1 = 0;
				pNowNode->lFlag = 1;//变量
				p+=2;
				p2 = p;
				pNowNode->lDescriptionLen = p1-pNowNode->description;
				if(pNowNode->lDescriptionLen > 0)
				{
					while(p1>pNextNode->description && *(p1-1) == ' ')
					{
						pNowNode->lDescriptionLen--;
						pNowNode->description[pNowNode->lDescriptionLen] = 0;
						p1--;
					}
				}
				p3 = pNowNode->pVariable;
				while(*p && *p != '%')
				{
					*p3++ = *p++;
				}
				*p3 = 0;
				pNowNode->lVariableLen = p3-pNowNode->pVariable;
				if(*p)p++;
				if(*p)p++;
				pNextNode = new TempletControl ;
				pNowNode->pNextControl = pNextNode;
				pNowNode = pNextNode;
				p1 = pNextNode->description;
			}
			else if(*(p+1) == '?')//可变区
			{
				pNextNode = new TempletControl ;
				if(strnicmp(p+2,"MYCHANGE?>",10) == 0)
				{
					pNowNode->lFlag = 0;
					p+=12;
				}
				else if(strnicmp(p+2,"LOOPEND?>",9) == 0)
				{
					pNowNode->pLoopControl = (TempletControl *)lLoopStack[--lLoopNum];
					p+=11;
				}
				else if(strnicmp(p+2,"LOOPBEGIN?>",11) == 0)
				{
					lLoopStack[lLoopNum++] = (long)pNextNode;
					pNextNode->lLoopFlag = 1;
					p+=13;
				}
				pNowNode->lDescriptionLen = p1-pNowNode->description;
				if(pNowNode->lDescriptionLen > 0)
				{
					while(p1>pNextNode->description && *(p1-1) == ' ')
					{
						pNowNode->lDescriptionLen--;
						pNowNode->description[pNowNode->lDescriptionLen] = 0;
						p1--;
					}
				}
				
				pNowNode->lVariableLen = 0;
				pNowNode->pNextControl = pNextNode;
				pNowNode = pNextNode;
				p1 = pNextNode->description;
				lLastSign = 0;
			}
			else if(strnicmp(p+1,"br",2) == 0)
			{
				while(*p && *p != '>')p++;
				if(*p)p++;
				if(lLastSign == 0)
				{
					if(p1 != pNowNode->description)
						*p1++ = ' ';
				}
				lLastSign = 1;
			}
			else
			{
				*p1++ = *p++;
				lLastSign = 0;
			}
		}
		else
		{
			*p1++=*p++;
			lLastSign = 0;
		}
	}
	pNowNode->lDescriptionLen = p1-pNowNode->description;
	pNowNode->lVariableLen = 0;
	if(pNowNode->lDescriptionLen > 0)
	{
		while(p1>pNextNode->description && *(p1-1) == ' ')
		{
			pNowNode->lDescriptionLen--;
			pNowNode->description[pNowNode->lDescriptionLen] = 0;
			p1--;
		}
	}
	return pHead;
}
long TempletIdentify::DelBlank(char *str)
{
	char *p1 = str;
	char *p = p1;
	long lLastSign = 0;
	while(*p)
	{
		if(*p == ' ' || *p == 0x0d || *p == 0x0a || *p == '\t')
		{
			p++;
			if(lLastSign == 0)
				*p1++ = ' ';
			lLastSign = 1;
			continue;
		}
		if(*p == '&')
		{
			p++;
			if(strnicmp(p,"nbsp",4) == 0)
				p+=4;
			else if(strnicmp(p,"gb",2) == 0)
				p+=2;
			else if(strnicmp(p,"lt",2) == 0)
				p+=2;
			else if(strnicmp(p,"amp",3) == 0)
				p+=3;
			if(*p == ';')
				p++;
			if(lLastSign == 0)
				*p1++ = ' ';
			lLastSign = 1;
			continue;
		}
		else if(*p == '<')
		{
			if(strnicmp(p+1,"br",2) == 0)
			{
				while(*p && *p != '>')p++;
				if(lLastSign == 0)
					*p1++ = ' ';
				lLastSign = 1;
				if(*p) p++;
			}
			else
			{
				*p1++ = *p++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -