您的位置:首页 > 编程语言 > Python开发

【详解】Python统一解密再改进版逻辑分析

2015-11-09 15:14 537 查看
虽然经过了一次改进,但依然改了好多次才确定了最终版代码。

中间遇到了很多次可以简化的问题,究其原因,是因为一开始的逻辑就没有思考清楚,导致代码做了很多重复无用的工作!

现在对最终版代码做一次梳理,对其中可以简化的逻辑进行重点说明!

1. 进入主方法

if __name__ == '__main__':
try:
main()
finally:
if tradeDBUtil: tradeDBUtil.close()

def main():
print "===%s start===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))
login()
toWrite()
sendEmail()
print "===%s end===%s"%(sys.argv[0], datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S"))

login的登录方法不赘述

2. 进入toWrite()方法

def toWrite():
#准备写入txt
content = getContent()
content=resolveContent(content)
writeTxt(content)

getContent 方法获取所有要写入的数据,这部分数据从数据库中取出。

def getContent():
#获取数据库内容
goodsIdStr = get360GoodsStr()
sql='SELECT SG.ID,V.GAME_NAME,SG.SERVER_ID,SG.ATTRS_VALUE FROM netgame_trade.SELLING_GOODS SG LEFT JOIN netgame_trade.SELLING_GOODS_PIC P ON P.SELLING_GOODS_ID = SG.ID INNER JOIN netgame_trade.SELLING_GOODS_VIDEO_RECORD V ON V.SELLING_GOODS_ID = SG.ID WHERE SG.GAME_ID = 1027 AND SG.`STATUS` = 1 AND SG.SELLING_STATUS = 0 AND SG.IS_VISIBLE = 1 AND SG.GOODS_ID IN(%s) AND ISNULL(P.ID) ORDER BY SG.ID DESC LIMIT 30'%(goodsIdStr)
rows = tradeDBUtil.queryList(sql)
return rows

接下类解析获得的content,解析为可以方便写入的数据后,才能够进行写入!

3.进入resolveContent()方法

开始解析。

def resolveContent(content):
#解析获取到的内容
length = len(content)
resolvedcontent=[None]*length
data = getDecodeData(content)
for i in range(length):
iresolvedcontent=[None]*7
icontent = content[i]

id = str(icontent[0])
encodeid=getSellingGoodsNo(id)
gamename = str(icontent[1]).decode('utf-8').encode('gbk')
servername = str(getServerName(icontent[2])).decode('utf-8').encode('gbk')
decodename = data['decode'+str(i)].decode('utf-8').encode('gbk')
decodepwd = data['decode'+str(i+length)]
goodsurl="http://www.moyoyo.com/goods-detail-"+str(encodeid)

iresolvedcontent[0]=id
iresolvedcontent[1]=encodeid
iresolvedcontent[2]=gamename
iresolvedcontent[3]=servername
iresolvedcontent[4]=decodename
iresolvedcontent[5]=decodepwd
iresolvedcontent[6]=goodsurl

resolvedcontent[i]=iresolvedcontent
return resolvedcontent

我们可以看到,其中部分数据可以直接拿来使用,或者经过了简单的方法就可以直接使用。如:

id、encodeid、gamename、goodsurl。

剩下的servername、decodename、decodepwd、都是需要进行别的操作才能够得到的。

无非是再连数据库取数据,加密解密,不再赘述。

目前为止,两处简化过的核心逻辑需要注意。

一、从数据库中取数据,运行一次SQL语句即可做到,不用多次运行,如果多次运行,不仅拉长了脚本运行时间,做了无用功,还给数据库带来了不必要的压力;

二、加密解密,访问url一次就足可以将所有待解密的密文传输到后台解密,不必一次次解密。这样减轻了对解密后台的压力。

4.开始写入,进入writeTxt方法。

def writeTxt(content):
#写入txt文件
f = open(fileName, 'a')
for i in range(len(content)):
f.write("SELLING_GOODS_ID: "+content[i][0]+',')
f.write("加密后SELLING_GOODS_ID: ".decode('utf-8').encode('gbk')+content[i][1]+',')
f.write("游戏名称: ".decode('utf-8').encode('gbk')+content[i][2]+',')
f.write("服务器名称: ".decode('utf-8').encode('gbk')+content[i][3]+',')
f.write("账户: ".decode('utf-8').encode('gbk'))
f.write(content[i][4]+',')
f.write("密码: ".decode('utf-8').encode('gbk'))
f.write(content[i][5]+',')
f.write("商品URL: ".decode('utf-8').encode('gbk')+content[i][6]+'\n')
f.close()

这里注意一点。
f = open(fileName, 'a')

这一句,只需要打开一次就行了,然后关闭一次。
f.close()

也是需要重视的,如果每次写入都要重新开,无端白做了很多操作。

打开,然后循环写入,才是比较科学的方法。

最后的发送邮件不再赘述。

【注意】

1. 访问解密url是最废时间的。

我们要注意,这里解密时要访问解密后台的url链接,只访问一次可以减轻后台压力,同时,

同等重要的一点是,可以加快脚本运行速度。因为我们平时打开一个普通的网页,网速一般时,需要花费数秒,如果访问很多次url,

相当于打开n多网页,花费的时间自然很多。

2. 方法调用。

加密解密的方法中,我们实现了一次访问就可以获得解密数据。但同时也要注意,

该方法不要放到循环体中,因为每一次循环都要运行方法的话,相当于还是遍历访问url,很费时间和资源。

即,方法一定要注意:

能减少运行次数就减少运行次数!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: