中國聯通通話記錄、身份認證、上網記錄等信息


#coding=utf8
import requests
import re
import time
import calendar
import gevent
import json
import chardet
import traceback

from Logger import Logger
Logger(logname='myrequests.txt', loglevel=1, logger="myrequests").getlog()
logger=Logger(logname='log5.txt', loglevel=1, logger="unicome").getlog()

from myrequests import Myrequests

from gevent import monkey
monkey.patch_socket()
monkey.patch_select()
# monkey.patch_all(socket=True, select=True)
from gevent.pool import Pool,Group

import sys
reload(sys)
sys.setdefaultencoding('utf8')

class ChinaUnicom(Myrequests):

    headerx={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
    login_url='https://uac.10010.com/portal/Service/MallLogin'
    info_url='https://uac.10010.com/cust/infomgr/anonymousInfoAJAX'

    def __init__(self,phone,server_passwd):
        #self.myreq=Myrequests()
        logger.info('傳入的賬號和密碼分別是:%s  %s' % (phone, server_passwd))
        super(ChinaUnicom,self).__init__()
        self.session=requests.session()
        self.phone=phone
        self.server_passwd=server_passwd

        self.group=Group()

        self.dates={}

        self.info={}
        self.info.update({'phone':self.phone})
        self.bill=[]

    def deco(func):
        def wrapper(self, *args, **kwargs):
            try:
                return func(self, *args, **kwargs)
            except Exception, e:
                logger.error('\n%s\n方法 %s發生錯誤,原因是: %s\n' % ('-'*100,func.__name__, traceback.format_exc()))
        return wrapper

    @deco
    def login(self,times=1):

        datax={
        'callback':'jQuery17208315958887266249_1502520335284',
        'req_time':'1502520347528',
        'redirectURL':'http://www.10010.com',
        'userName':self.phone,
        'password':self.server_passwd,
        'pwdType':'01',
        'productType':'01',
        'redirectType':'01',
        'rememberMe':'1',
        '_':'1502520347531',
        }

        resp=self.get(self.login_url,params=datax,headers=self.headerx)  ##可以不要真實瀏覽器ua

        logger.debug('登錄返回的內容是:%s'% resp.content)

        if 'resultCode:"0000"' in resp.content:
            logger.debug('\033[5;31;0m%s登陸成功\033[0m'%self.phone)
            return 0,resp.content
        elif   'resultCode:"7007" ' in resp.content:
            logger.warning(resp.content)
            return 7007,resp.content
        elif 'resultCode:"7001"' in resp.content:
            logger.warning('驗證碼錯誤')
            return 7001,resp.content
        elif 'resultCode:"7009"' in resp.content:    #系統忙,請稍后再試7009,重試10次
            logger.warning('系統忙,請稍后再試')
            if times<10:
                return self.login(times+1)
            else:
                return 7009,resp.content
        elif 'resultCode:"7005"' in resp.content:
            logger.warning('您的號碼所屬省份系統正在升級,請稍后再試。')
            return 7005,resp.content
        else:
            logger.error('登錄異常返回的 內容是:%s'%resp.content)
            resultCode=re.search('resultCode:"(.*?)"',resp.content).group(1)
            return  resultCode,resp.content

    @deco
    def get_e3(self,times=1):
        ###檢查是否登錄了,非常重要的步驟
        t1 = time.time()
        resp = self.post('http://iservice.10010.com/e3/static/check/checklogin/', data={'_': '1502766200122'})  ####這個十分重要,即使登錄成功了,不請求這個會造成請求不到通話記錄。要在第一次登錄后立馬抓包才能抓到,后面情況下無論怎么刷新通話記錄頁面,fiddler都抓不到這個了。
        #resp=self.get('http://iservice.10010.com/e3/static/common/mall_info?callback=jQuery17208521103973034769_1502784024036&_=1502784025299')

        logger.debug('checklogin返回:%s' % resp.content)
        try:
            json.loads(resp.content)['userInfo']
        except:
            logger.debug('第%s次checklogin返回不ok'%times)
            if times<5:
                return self.get_e3(times+1)
            else:
                return 'check login error'

        dictx = json.loads(resp.content)['userInfo']
        self.info.update({'custlvl': dictx['custlvl'], 'custName': dictx['nickName'], 'sex': dictx['custsex'],
                          'certnum': dictx['certnum'], 'certaddr': dictx['certaddr'],
                          "packageName": dictx["packageName"], "paytype": dictx["paytype"],
                          "subscrbstat": dictx["subscrbstat"], "opendate": dictx["opendate"][:8],
                          "custName": dictx["custName"],
                          "brand_name": dictx["brand_name"],
                          })
        logger.debug('請求e3接口消耗時間:%s' % (time.time() - t1))

    @deco
    def get_infomgrInit(self):
        '''獲取個人信息'''
        resp=self.post(self.info_url)
        logger.info('%s的個人信息:%s'%(self.phone,resp.content))

    @deco
    def get_phone_info(self):
        '''獲取號碼信息'''
        resp=self.post('http://iservice.10010.com/e3/static/query/searchPerInfoDetail/?_=1504753169884')
        logger.info('%s的號碼信息:%s' % (self.phone, resp.content))
        dictx=json.loads(resp.content)
        self.info.update({
            "landlvl":dictx["result"]["MyDetail"]["landlvl"],"pukcode":dictx["result"]["pukcode"],
        })
        #return resp.content

    @deco
    def get_contract_period_info(self,times=1):  ###有時候會獲取出錯沒得到合約信息,重試times次
        '''獲取合約期信息'''
        resp = self.post('http://iservice.10010.com/e3/static/query/contractPeriodQuery?_=1504753170508&accessURL=http://iservice.10010.com/e4/query/basic/personal_xx_iframe.html')
        logger.info('%s的合約期信息:%s' % (self.phone, resp.content))
        if '尊敬的客戶,您的號碼無合約' in resp.content:
            self.info.update({
                "activityName":"",
                "effectTime":"",
                "endTime":"",
            })
        elif '"errMessage":"尊敬的客戶,暫時無法為您提供服務' in resp.content:
            if times<5:                                                        ###重試5次,再提示無法提供服務,就不再重試了。
                return self.get_contract_period_info(times+1)
            else:
                self.info.update({
                    "activityName": "",
                    "effectTime": "",
                    "endTime": "",
                })
        else:
            dictx = json.loads(resp.content)
            self.info.update({
                "activityName": dictx["result"]["activityInfo"][0]["activityName"],
                "effectTime": dictx["result"]["activityInfo"][0]["effectTime"][:8],
                "endTime": dictx["result"]["activityInfo"][0]["endTime"][:8],
                             })


    @deco
    def get_caller_location(self):
        '''手機歸屬地查詢,用了第三方的接口查詢歸屬地,聯通官網自帶的歸屬地查詢有次數限制'''
        datax={
            'm': self.phone,
            'output': 'json',
            'callback': 'querycallback',
            'timestamp': '1504690861415',
        }
        resp=self.post('http://v.showji.com/Locating/showji.com2016234999234.aspx?m=13148804508&output=json&callback=querycallback&timestamp=1504690861415',data=datax)
        matchx=re.search('"Province":"(.*?)","City":"(.*?)"',resp.content).groups()
        logger.info('手機號碼 %s 的歸屬地是: %s %s'%(self.phone,matchx[0],matchx[1]))
        self.info.update({'caller_location':matchx[1]})
        return matchx

    @staticmethod
    def get_year_month(n):
        '''獲取n個月前的年份和月份和天數'''
        day_now = time.localtime()
        year0 = day_now.tm_year
        month0 = day_now.tm_mon

        monthx = month0 - n
        yearx = year0
        if monthx < 1:
            yearx = year0 - n
            monthx = month0 + 12 - n

        day_begin = '%d%02d01' % (yearx, monthx)  # 月初肯定是1號
        wday, monthRange = calendar.monthrange(yearx, monthx)  # 得到本月的天數 第一返回為月第一日為星期幾(0-6), 第二返回為此月天數
        day_end = '%d%02d%02d' % (yearx, monthx, monthRange)

        day_begin2='%d-%02d-01' % (yearx, monthx)
        day_end2 = '%d-%02d-%02d' % (yearx, monthx, monthRange)

        return yearx,monthx,day_begin,day_end,monthRange,day_begin2,day_end2



    @deco
    def get_all_call_detail(self):
        '''獲取通話記錄'''
        day_now = time.localtime()
        year0=day_now.tm_year
        month0=day_now.tm_mon

        self.call_details = []

        def get_call_month(m):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)

            datax={
                'pageNo': '1',
                'pageSize': '200',
                'beginDate': day_begin,
                'endDate':day_end,
            }
            url='http://iservice.10010.com/e3/static/query/callDetail?_=1502703492095&accessURL=http://iservice.10010.com/e4/query/bill/call_dan-iframe.html?menuCode=000100030001&menuid=000100030001'
            get_times=0
            while (get_times<5):
                resp = self.post(url, data=datax )
                if '尊敬的客戶,出了一點點問題,請您稍候' in resp.content:
                    logger.warning( '尊敬的客戶,出了一點點問題,請您稍候')
                    get_times+=1
                else:
                    break
            logger.info('通話記錄:%s'%resp.content)
            dictx = json.loads(resp.content)
            if '"respDesc":"無詳單記錄' in resp.content:
                pass
            else:
                self.call_details.append(dictx)
            logger.debug('月初日期為:%s 月末日期為:%s' % (day_begin, day_end))

        # poolx=Pool(6)
        # poolx.map(get_call_month,[i for i in range(6)])
        [self.group.add(gevent.spawn(get_call_month,m)) for m in range(6)]
        #return self.call_details


    @deco
    def get_current_month_bill(self,times=1):
        '''獲取當前月份的賬單'''   #http://iservice.10010.com/e4/index_server.html
        headerx={'Accept':'application/json, text/javascript, */*; q=0.01'}
        resp = self.post('http://iservice.10010.com/e3/static/query/userinfoquery?_=1504092545814',headers=headerx)
        logger.info('獲取當前月份的賬單信息是:%s'%resp.content)
        if  'balance'  not  in  resp.content:                 ####可能出現沒查到
            if times<6:
                logger.info('第%s次獲取當前月份的賬單信息是:%s' % (times,resp.content))
                return self.get_current_month_bill(times+1)
            else:
                logger.warning('超過5次沒有獲取到獲取當前月份的賬單信息')
        dictx = json.loads(resp.content)
        mydict={
            'acctBalance':dictx['resource'].get('acctBalance','--'),
            'creditBalance':dictx['resource'].get('creditBalance','--'),
            'totalFlow':dictx['resource'].get('totalFlow','--'),
            'remainFlow':dictx['resource'].get('remainFlow','--'),
            'totalVoice': dictx['resource'].get('totalVoice', '--'),
            'remainVoice': dictx['resource'].get('remainVoice', '--'),
        }
        listx, totalFee=self.get_current_month_consumption()
        mydict.update({
            'billdata':'current_month',
            'feeList':listx,
            'totalFee':totalFee,
        })
        self.bill.append(mydict)

    @deco
    def get_current_month_consumption(self):
        '''獲取當前月份的消費統計'''  # http://iservice.10010.com/e4/index_server.html
        resp = self.post('http://iservice.10010.com/e3/static/query/consumptionAnalysis?_=1504763190181&accessURL=http://iservice.10010.com/e4/index_server.html')
        logger.info('獲取當前月份消費統計信息是:%s' % resp.content)
        dictx = json.loads(resp.content)
        listx=[]
        for i in dictx['maplist']:
            listx.append({'name':i['name'],'value':i['y']})
        totalFee=dictx.get('totalfee','--')
        return listx,totalFee

    @deco
    def get_all_history_bill(self):
        '''獲取歷史月份的賬單'''     ###http://iservice.10010.com/e4/skip.html?menuCode=000100020001&menuCode=000100020001
        history_bill=[]

        def get_histoty_month(m):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2=self.get_year_month(m)
            datax={
                'querytype': '0001',
                'querycode': '0001',
                'billdate': '%d%02d'%(yearx,monthx),
                'flag': '1',
            }

            resp = self.post('http://iservice.10010.com/e3/static/query/queryHistoryBill?_=1504093213145&accessURL=http://iservice.10010.com/e4/skip.html',data=datax)
            logger.info('獲取%s年%s月的賬單信息是:%s\n'%(yearx,monthx,resp.content))
            dictx=json.loads(resp.content)
            ###需要進行判斷,2g用戶和4g用戶的返回數據不一樣,也可能是后付費的原因
            listx=[]
            if 'historyResultList' in dictx:
                for i  in  dictx['historyResultList']:
                    listx.append({'name':i['name'],'value': i['value']})
                mydict={'totalFee':dictx['nowFee'],
                    'feeList':listx,
                    'billdate': '%d%02d' % (yearx, monthx),}
            elif 'result' in dictx:
                for i in dictx['result']['billinfo']:
                    listx.append({'name':i['integrateitem'] ,'value':i['fee']})
                mydict={'totalFee': dictx['result']['allfee'],
                        'feeList': listx,
                        'billdate': '%d%02d' % (yearx, monthx),}
            elif '"service":"fail"' in resp.content:
                logger.warning('%s號碼%s年%s月的賬單信息獲取返回的狀態是fail'%(self.phone,yearx,monthx))
                mydict = {'totalFee': '--',
                          'feeList': '--',
                          'billdate': '%d%02d' % (yearx, monthx), }
            else:
                logger.warning('%s號碼%s年%s月的賬單信息是其他類型的賬單'%(self.phone,yearx,monthx))
                mydict = {'totalFee': '--',
                          'feeList': '--',
                          'billdate': '%d%02d' % (yearx, monthx), }
            self.bill.append(mydict)

        [self.group.add(gevent.spawn(get_histoty_month,m)) for m in range(1,6)]

    @deco
    def get_all_business_record(self):
        '''獲取業務辦理記錄'''
        self.business_record=[]

        def get_business_month(m,times=1):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)
            datax={
                'queryContent': 'acceptedRecord',
                'beginDate': '%d-%02d-01'%(yearx,monthx),
                'endDate': '%d-%02d-%d'%(yearx,monthx,monthRange),
            }
            resp = self.post('http://iservice.10010.com/e3/static/transact/handleRecord/?_=1504094856266&accessURL=http://iservice.10010.com/e4/transact/basic/handle_record_iframe.html?menuCode=000300070001&menuid=000300070001',data=datax)
            logger.info('獲取%s年%s月的業務辦理記錄是:%s'%(yearx,monthx,resp.content))

            if '神馬?你要幫它交費?' in resp.content:  ##網站有時候抽風了
                if times<6:
                    logger.info('第%s次獲取%s年%s月的業務辦理記錄是:%s' % (times,yearx, monthx, resp.content))
                    return get_business_month(i,times+1)
                else:
                    logger.info('超過5次獲取%s年%s月的業務辦理記錄是:%s' % ( yearx, monthx, resp.content))
                    return

            dictx=json.loads(resp.content)

            if 'acceptedRecordResult' in dictx:
                for i in dictx['acceptedRecordResult']['record']:
                    mydict={
                        'acptsitename':i['acptsitename'],
                        'itemname':i['itemname'],
                        'optrdate':i['optrdate'],
                    }
                    self.business_record.append(mydict)

            if '無受理日志記錄' in resp.content:
                pass



        for m in range(6):
            self.group.add(gevent.spawn(get_business_month,m))

    @deco
    def get_footprint(self):
        resp = self.post('https://uac.10010.com/cust/myfootmark/myfootmarkQuery')
        logger.info('獲取足跡記錄是:%s' % ( resp.content))
        self.footprint=[]
        dictx=json.loads(resp.content)
        if dictx['result_code']=='0000':
            for i in dictx["markList"]:
                footTime=i['footTime']
                footDescribe=i['footDescribe']
                self.footprint.append({'fooTtime':footTime,'footDescribe':footDescribe  })
        else:
            logger.waning('獲取足跡記錄不成功:%s' % (resp.content))

        return self.footprint


    @deco
    def get_all_sms(self):
        self.sms=[]
        def get_sms_month(m,times=1):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)
            if m==0:
                day_end=time.strftime('%Y%m%d')
            datax={
                'pageNo': 1,
                'pageSize': 10000,
                'begindate': day_begin,
                'enddate': day_end,
            }

            headerx={'Accept':'application/json, text/javascript, */*; q=0.01'}
            resp=self.post('http://iservice.10010.com/e3/static/query/sms?_=1504098130310&accessURL=http://iservice.10010.com/e4/query/calls/call_sms-iframe.html?menuCode=000100030002&menuid=000100030002',data=datax,headers=headerx)
            logger.info('第%s次獲取%s號碼第%s年%s月的短信記錄是%s'%(times,self.phone,yearx,monthx,resp.content))
            dictx=json.loads(resp.content)
            if '尊敬的客戶,由於同一時間使用該業務人數較多,暫時無法為您提供服務,為您帶來的不便敬請諒解' in resp.content:  ##小概率出現這個
                if times<5:
                    return get_sms_month(i,times+1)

            elif '詳單查詢最大支持近6個月的查詢' in resp.content:
                pass
            elif 'mmsCount' in dictx:
                self.sms.append(dictx)

        [self.group.add(gevent.spawn(get_sms_month,m)) for m in range(6)]

    @deco
    def get_all_flow_records(self):
        '''獲取流量使用記錄,在哪里上的網'''   ###http://iservice.10010.com/e4/query/basic/call_flow_iframe1.html?menuCode=000100030004
        self.flow_records=[]
        def get_flow_month(m,times=1):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)
            datax = {
                'pageNo': '1',
                'pageSize': 10000,
                'beginDate': day_begin2,
                'endDate': day_end2,
            }
            datax = {
                'pageNo': '1',
                'pageSize': 1000,
                'beginDate': '2017-08-01',
                'endDate': '2017-08-01',
            }
            url='http://iservice.10010.com/e3/static/query/callFlow?_=1504506035718&accessURL=http://iservice.10010.com/e4/query/basic/call_flow_iframe1.html?menuCode=000100030004'
            resp=self.post(url,data=datax)

            if '神馬?你要幫它交費?' in resp.content:
                logger.warning('第%s次獲取%s號碼第%s年%s月的l流量記錄返回到神馬頁面了' % (times, self.phone, yearx, monthx))
            dictx=json.loads(resp.content)

            if "errormessage" in dictx :
                logger.warning('第%s次獲取%s號碼第%s年%s月的l流量記錄異常,返回是:%s' % (times, self.phone, yearx, monthx, resp.content))
            else:
                logger.info('第%s次獲取%s號碼第%s年%s月的l流量記錄是%s' % (times, self.phone, yearx, monthx, resp.content))
                self.flow_records.append(dictx)

        [self.group.add(gevent.spawn(get_flow_month, m)) for m in range(6)]

    @deco
    def get_all_internet_records(self):
        ''' 獲取手機上網記錄,不獲取wifi上網記錄 '''    ##http://iservice.10010.com/e4/query/basic/call_phont_record_new.html?menuId=000100030009&menuCode=000100030009
        self.internet_records=[]
        def get_internet_month(m):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)
            datax={'pageNo':1,
            'pageSize':10000,
            'beginDate':day_begin2,
            'endDate':day_end2,
            }
            resp = self.post('http://iservice.10010.com/e3/static/query/callNetPlayRecord?_=1504144646940&accessURL=http://iservice.10010.com/e4/query/basic/call_phont_record-iframe.html&menuid=000100030009',data=datax)
            logger.info('獲取%s號碼的%s年%s月上網記錄是:%s'%(self.phone,yearx,monthx,resp.content))
            dictx=json.loads(resp.content)
            if "errorMessage" in dictx:
                if '"respDesc":"尊敬的客戶,出了一點點問題,請您稍候再試或立即反饋我們處理,給您帶來不便敬請諒解' in resp.content:                ###有些月份的上網記錄可能會返回這個json
                    self.internet_records.append(dictx)
                    pass
            else:
                self.internet_records.append(dictx)
        [self.group.add(gevent.spawn(get_internet_month,m)) for m in range(4)]

    @deco
    def get_all_payment_records(self):
        '''獲取交費記錄'''   ##http://iservice.10010.com/e4/query/calls/paid_record-iframe.html?menuCode=000100010003
        self.payment_records=[]
        def get_payment_month(m,times=1):
            yearx, monthx, day_begin, day_end, monthRange, day_begin2, day_end2 = self.get_year_month(m)
            datax={'pageNo':1,
            'pageSize':10000,
            'beginDate':day_begin,
            'endDate':day_end,
            }
            resp=self.post('http://iservice.10010.com/e3/static/query/paymentRecord?_=1504151974387&accessURL=http://iservice.10010.com/e4/query/calls/paid_record-iframe.html',data=datax)

            dictx=json.loads(resp.content)

            if "errorMessage" in dictx:
                if '業..務..連..接..超....時....過一會再來吧' in resp.content:
                    logger.warning('獲取%s號碼%s年%s月的交費記錄業..務..連..接..超....時,返回的內容是:%s' % (self.phone, yearx, monthx, resp.content))
                    if times<6:
                        return get_payment_month(m,times+1)
                else :
                    logger.warning('獲取%s號碼%s年%s月的交費記錄返回結果異常,返回的內容是:%s' % (self.phone, yearx, monthx, resp.content))
            else:
                logger.info('獲取%s號碼%s年%s月的交費記錄ok,返回的內容是:%s' % (self.phone, yearx, monthx, resp.content))
                for d in dictx['pageMap']['result']:
                    self.payment_records.append(d)
        [self.group.add(gevent.spawn(get_payment_month, m)) for m in range(6)]

def dict2chinese(dictx):
    return json.dumps(dictx, ensure_ascii=False)



def main():
    cu = ChinaUnicom(132xxxxxxx,3xxxxx) 
    if cu.login()[0] == 0:
        cu.get_e3()
        cu.group.spawn(cu.get_caller_location)
        cu.group.spawn(cu.get_infomgrInit)
        cu.group.spawn(cu.get_phone_info)
        cu.group.spawn(cu.get_contract_period_info)

        cu.group.spawn(cu.get_current_month_bill)
        cu.get_all_history_bill()

        cu.get_all_business_record()

        cu.group.spawn(cu.get_footprint)

        cu.get_all_call_detail()

        cu.get_all_sms()

        cu.get_all_flow_records()

        cu.get_all_internet_records()
        cu.get_all_payment_records()

        cu.group.join()
        print '全部交費記錄是:   ', json.dumps(cu.payment_records, ensure_ascii=False)
        print '全部流量記錄是:   ', json.dumps(cu.flow_records, ensure_ascii=False)
        print '全部上網記錄是:   ', json.dumps(cu.internet_records, ensure_ascii=False)
        print '全部短信記錄是:   ', json.dumps(cu.sms, ensure_ascii=False)
        print '全部通話記錄是:   ', json.dumps(cu.call_details, ensure_ascii=False)
        print '足跡記錄是:   ', json.dumps(cu.footprint, ensure_ascii=False)
        print '業務辦理記錄是:   ', json.dumps(cu.business_record, ensure_ascii=False)
        print '個人信息是:   ', json.dumps(cu.info, ensure_ascii=False)
        print '賬單信息是:   ', dict2chinese(cu.bill)

    else:
        return 'login fail'


if __name__=="__main__":
  
    main()

 

附上引入的文件一:

Logger.py

#coding=utf-8
import logging,time,os
from logging.handlers import TimedRotatingFileHandler,RotatingFileHandler

format_dict = {
   1 : logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s -  %(message)s\n',"%Y-%m-%d %H:%M:%S"),
   2 : logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s -  %(message)s\n',"%Y-%m-%d %H:%M:%S"),
   3 : logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s -  %(message)s\n',"%Y-%m-%d %H:%M:%S"),
   4 : logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s -  %(message)s\n',"%Y-%m-%d %H:%M:%S"),
   5 : logging.Formatter('%(asctime)s - %(name)s - %(lineno)d - %(levelname)s -  %(message)s\n',"%Y-%m-%d %H:%M:%S"),
}

class Logger():

    def __init__(self, logname, loglevel, logger):
        if not os.path.exists('logs'):
            os.mkdir('logs')
        self.logname=logname

        self.logger = logging.getLogger(logger)
        if  loglevel==1:
            lv=logging.DEBUG
        elif loglevel == 2:
            lv = logging.INFO
        elif loglevel == 3:
            lv = logging.WARNING
        elif loglevel == 4:
            lv = logging.ERROR
        elif loglevel == 5:
            lv = logging.CRITICAL

        self.logger.setLevel(lv)

        ch = logging.StreamHandler()
        ch.setLevel(logging.DEBUG)
        self.formatter = format_dict[int(loglevel)]
        ch.setFormatter(self.formatter)
        self.logger.addHandler(ch)

        '''
        filename='logs\\'+self.logname
        tmfh=TimedRotatingFileHandler(filename,"M",10,0)  ##按時間切割
        self.formatter = format_dict[int(loglevel)]
        tmfh.setFormatter(self.formatter)
        self.logger.addHandler(tmfh)
        self.logger.setLevel(logging.DEBUG)
        '''
        filename = 'logs/' + self.logname
        tmfh = RotatingFileHandler(filename, maxBytes=10*1024*1024,backupCount=100)  ##按大小切割
        ch.setLevel(logging.DEBUG)
        self.formatter = format_dict[int(loglevel)]
        tmfh.setFormatter(self.formatter)
        self.logger.addHandler(tmfh)

    def getlog(self):
        return self.logger

 

 

附上引入的文件二

myrequests.py文件,繼承這個類,這樣在ChinaUnicom中的self.post就是session類的post,每個請求都攜帶了登錄和請求e3 checklogin接口的cookie。

#coding=utf8
import requests
import logging
logger=logging.getLogger('myrequests')

MAX_RETYIES=5

class Myrequests(object):

    def __init__(self):
        self.session=requests.session()

    def post(self,url,data=None,**kwargs):
        for i  in range(MAX_RETYIES):
            try:
                resp=self.session.post(url,data=data,**kwargs)
                if self.check_content(resp.content):
                    logger.warning('對%s再請求post一次%s'%(url,data))
                elif '尊敬的客戶您好,系統檢測您的訪問過於頻繁,為保障您的賬戶安全請明天再試'  in resp.content:
                    return resp
                else:
                    return resp
            except Exception,e:
                logger.error('網絡連接出錯:%s'%str(e))

    def get(self,url,**kwargs):
        for i in range(MAX_RETYIES):
            try:
                resp = self.session.get(url,**kwargs)
                if self.check_content(resp.content):
                    logger.warning('對%s再請求get一次' % (url))
                else:
                    return resp
            except Exception, e:
                logger.error('網絡連接出錯:%s'%str(e))

    @staticmethod
    def check_content(content):
        if '業..務..連..接..超....時....過一會再來吧' in content or '尊敬的客戶,出了一點點問題,請您稍候再試或立即反饋我們處理' in content \
                or '神馬?你要幫它交費' in  content:
            return 1
        else:
            return 0

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM