Subversion Repositories SmartDukaan

Rev

Rev 13679 | Rev 13721 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
13569 amit.gupta 1
'''
2
Created on Jan 15, 2015
3
 
4
@author: amit
5
'''
13690 amit.gupta 6
from BeautifulSoup import BeautifulSoup
13569 amit.gupta 7
from dtr import main
13690 amit.gupta 8
from dtr.dao import AffiliateInfo, Order, SubOrder
9
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
10
    Store as MStore, sourceMap
11
from pprint import pprint
12
from pymongo.mongo_client import MongoClient
13
import hashlib
13658 manas 14
import importlib
13690 amit.gupta 15
import json
16
import mechanize
13658 manas 17
import re
18
import urllib
19
 
20
USERNAME='saholic1@gmail.com'
21
PASSWORD='spice@2020'
22
ORDER_TRACK_URL='https://m.flipkart.com/order_details'
13679 manas 23
AFFILIATE_URL='https://www.flipkart.com/affiliate/login'
13690 amit.gupta 24
AFFILIATE_LOGIN_URL='https://www.flipkart.com/affiliate/a_login'
25
AFF_REPORT_URL='http://www.flipkart.com/affiliate/reports/ordersReport?order_status_filter=%s&startdate=%s&enddate=%s'
26
AFF_STATUS_CANCELLED='cancelled'
27
AFF_STATUS_APPROVED='approved'
28
AFF_STATUS_DISAPPROVED='disapproved'
29
AFF_STATUS_PENDING='pending'
13658 manas 30
 
13679 manas 31
 
13569 amit.gupta 32
class Store(main.Store):
13658 manas 33
    OrderStatusMap = {
13690 amit.gupta 34
                      main.Store.ORDER_PLACED : ['Approval', 'Processing'],
35
                      main.Store.ORDER_DELIVERED : ['Shipping'],
13658 manas 36
                      main.Store.ORDER_SHIPPED : ['In Transit'],
13690 amit.gupta 37
                      main.Store.ORDER_CANCELLED : ['']
13658 manas 38
 
39
                      }
40
    def __init__(self,store_id):
41
        client = MongoClient('mongodb://localhost:27017/')
42
        self.db = client.dtr
43
        super(Store, self).__init__(store_id)
44
 
13569 amit.gupta 45
    def getName(self):
46
        return "flipkart"
47
 
13690 amit.gupta 48
    def scrapeStoreOrders(self,):
49
        orders = self._getActiveOrders()
50
 
13679 manas 51
    def scrapeAffiliate(self, startDate=None, endDate=None):
52
        br = getBrowserObject()
53
        br.open(AFFILIATE_URL)
13690 amit.gupta 54
        response = br.response()  # copy
55
        token =  re.findall('window.__FK = "(.*?)"', ungzipResponse(response), re.IGNORECASE)[0]
56
        data = {'__FK':token,
57
                'email':'saholic1@gmail.com',
58
                'password':'e8aacf6fc1e3998186a4a8e56e428f66'
59
        }
60
        br.open(AFFILIATE_LOGIN_URL, urllib.urlencode(data))
61
        for status in [AFF_STATUS_CANCELLED, AFF_STATUS_APPROVED, AFF_STATUS_PENDING, AFF_STATUS_DISAPPROVED]:
62
            br.open(AFF_REPORT_URL % (status, '2015-01-02', '2015-02-01'))
63
            page = ungzipResponse(br.response())
64
            soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
65
            try:
66
                tableElement = soup.findAll('table', {'class':'report-table fixtable'})[1]
67
            except:
68
                continue
69
            trElements = tableElement.findAll('tr')
70
            trElements.pop(0)
71
            for trElement in trElements:
72
                tdElements = trElement.findAll('td')
73
                productCode = re.findall(r'pid=(.*)$', tdElements[0].find('a')['href'])[0]
74
                quantity =int(tdElements[3].text)
75
                price = int(float(tdElements[2].text))
76
                payOut = tdElements[6].text
77
                subTagId = tdElements[7].text
78
                reason = tdElements[9].text
13569 amit.gupta 79
 
13658 manas 80
    def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
81
        br = getBrowserObject()
82
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
83
 
84
        response = br.open(url)
13690 amit.gupta 85
        page = ungzipResponse(response)
13658 manas 86
 
13690 amit.gupta 87
        merchantOrderId = re.findall('reference_id=(.*?)&', orderSuccessUrl,re.IGNORECASE)[0]
88
        print merchantOrderId
89
 
13658 manas 90
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
91
 
92
        sections = soup.findAll("div", {"class":"ui-app-card-body"})
93
        sections.pop(1)
13690 amit.gupta 94
 
95
        merchantOrder = Order(orderId, userId, subTagId, self.store_id, orderSuccessUrl)
13658 manas 96
        for data in sections:
97
            name = data.findAll("span")
98
            i=0
99
            while i< len(name):
100
                if "key" in str(name[i]):
101
                    if "Grand Total" in str(name[i]):
102
                        #Total Amount
13690 amit.gupta 103
                        merchantOrder.paidAmount = re.findall(r'\d+', name[i+1].text)[0]
13658 manas 104
                    elif "Order Date" in str(name[i]):
13690 amit.gupta 105
                        merchantOrder.placedOn = name[i+1].text 
13658 manas 106
                i=i+1    
13690 amit.gupta 107
 
108
        merchantOrder.merchantOrderId = merchantOrderId
109
 
110
        mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
111
        fkSubOrders = mainOrder.findAll("li")
112
        #remove unwanted list
113
        fkSubOrders.pop(-1)
114
        subOrders = []
115
        merchantOrder.subOrders = subOrders
116
 
13658 manas 117
        #fetching suborders details
13690 amit.gupta 118
        for subOrder in fkSubOrders:
119
            y = subOrder.find("header").findAll("span")
120
            for suborderId in y:
121
                if "value emp" in str(suborderId):
122
                    merchantSubOrderId = suborderId.text
123
                    break
124
            orderItems = subOrder.find("ul").findAll("div", recursive=False)
125
            i=0
126
            for orderItem in orderItems:
127
                merchantOrder.placedOn
128
                merchantSubOrderId = merchantSubOrderId + str(i)
129
                divs = orderItem.findAll('div', recursive=False)
130
                content = divs[0]
131
                orderTracking = divs[2]
132
                orderTrackingDet = divs[3]
133
 
134
 
135
                imgUrl = content.find('img')['src']
136
                lineDet = content.find("div",{"class":"product-info"})
137
                productTitle = lineDet.find("a",{"class":"product-title"}).text
138
                productUrl =  str(lineDet.find("a")['href'])
139
 
140
                start='pid='
141
                s=str(lineDet.find("a")['href'])
142
                productCode = re.findall(re.escape(start)+"(.*)",s)[0]
143
                mname = lineDet.findAll("span")
144
                k=0
145
                while k<len(mname):
146
                    if "note" in str(mname[k]):
147
                        if "Color:" in str(mname[k]):
148
                            productTitle = productTitle + " " + mname[k+1].text
149
 
150
                        elif "Qty:" in str(mname[k]):
151
                            quantity = int(mname[k+1].text)
152
                        elif "Subtotal:" in str(mname[k]):
153
                            amountPaid = re.findall(r'\d+', mname[k+1].text)[0]
154
                        elif "Delivery:" in str(mname[k]):
155
                            #Delivery Date for sub order
156
                            print "Delivery Date " +mname[k+1].text
157
                    k=k+1
158
                merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
159
                merchantsubOrder.imgUrl  = imgUrl
160
                merchantsubOrder.productCode = productCode
161
 
162
                cashbackAmount = self.getCashbackAmount(subOrder.productCode, amountPaid)
163
                cashbackStatus = Store.CB_INIT
164
                if cashbackAmount <= 0:
165
                    cashbackStatus = Store.CB_NA
166
                merchantsubOrder.cashBackAmount = cashbackAmount
167
                merchantsubOrder.cashBackStatus = cashbackStatus      
168
 
169
                subOrders.append(merchantsubOrder)
170
                #To track shipping details         
13658 manas 171
                status=-1    
13690 amit.gupta 172
                tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
173
                if "approveDetails-complete" in str(tr):
174
                    if "processingDetails-complete" in str(tr):
175
                        if "shippingDetails-complete" in str(tr):
176
                            if "delivery-complete" in str(tr):
177
                                status = MStore.ORDER_DELIVERED
178
                            else:     
179
                                status = MStore.ORDER_SHIPPED
180
                        else:
181
                            status = MStore.ORDER_PLACED
182
                    else: 
183
                        status = MStore.ORDER_PLACED
184
                elif str(tr) in ["approveDetails-ongoing"]:
185
                    status=MStore.ORDER_PLACED             
186
                if "dead" in str(tr):
187
                    status = MStore.ORDER_CANCELLED    
13658 manas 188
                print "Sub Order Status " + str(status)                      
189
 
13690 amit.gupta 190
                trackingDetailsActive = orderTrackingDet.find("div",{"class":"c-tabs-content m-top active"})
191
                print "Sub order tracking description " + trackingDetailsActive.text
192
        self._saveToOrder(todict(merchantOrder))
13658 manas 193
 
194
    def flipkartOrderTracking(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
195
        br = getBrowserObject()
196
        url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
197
 
198
        response = br.open(url)
199
        page = ungzipResponse(response, br)
200
 
201
 
202
        soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
203
 
204
 
205
        mainOrder = soup.findAll("ul",{"class":"m-bottom p-cart"})
206
        #fetching suborders details
207
        for subOrder in mainOrder:
208
            subOrd = subOrder.findAll("li")
209
 
210
            subOrd.pop(len(subOrd)-1)
211
            for productInfo in subOrd:
212
                status=-1    
213
                #To track shipping details         
214
                n = productInfo.findAll("div",{"class":"tracking-progress grid-row cf"})
215
                for trackingStatus in n:
216
                    tr = trackingStatus.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
217
                    if "approveDetails-complete" in str(tr):
13679 manas 218
                        print "Here"
13658 manas 219
                        if "processingDetails-complete" in str(tr):
13679 manas 220
                            print "There"
13658 manas 221
                            if "shippingDetails-complete" in str(tr):
13679 manas 222
                                print "Share"
13658 manas 223
                                if "delivery-complete" in str(tr):
13679 manas 224
                                    print "Last"
13658 manas 225
                                    status = 3
226
                                else:     
227
                                    status = 2
228
                            else:
229
                                status = 1 
230
                        else: 
231
                            status = 0     
232
                    if "dead" in str(tr):
233
                        status = 4    
234
                print status                      
235
 
236
 
237
 
238
def _saveToOrderFlipkart(self, order):
239
        collection = self.db.merchantOrder
240
        order = collection.insert(order)
241
 
13690 amit.gupta 242
 
243
 
244
def hex_md5(password):
245
    m = hashlib.md5()
246
    print(m.digest())
247
 
13658 manas 248
def main():
249
 
250
    store = getStore(2)
13690 amit.gupta 251
    #store.scrapeAffiliate()
252
    store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3019717576543723&token=14abca87835b66da4ce8fa9d7594d95f&src=or&pr=1')
13658 manas 253
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3016502908102575&token=0db4c692bacbfbfc158b52358ac9e91e&src=or&pr=1')
254
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3018701137253850&token=f7402ddcf2b63b37cc6bc528cc115d2f&src=or&pr=1')
13679 manas 255
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13658 manas 256
    #store.flipkartOrderTracking(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
13679 manas 257
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019365336126533&token=dbce2bd4dc4023295b436a7d3c7986c9&src=or&pr=1')
258
    #store.parseOrderRawHtml(12346, "subtagId", 122324,  "html", 'https://dl.flipkart.com/orderresponse?reference_id=OD1019453634552336&token=e8e04871ad65b532aa53fa82bb34b901&src=or&pr=1')
13690 amit.gupta 259
    #hex_md5('spice@2020')
13679 manas 260
 
13690 amit.gupta 261
 
13658 manas 262
if __name__ == '__main__':
263
        main()
264
 
13690 amit.gupta 265
 
266
 
267
 
13658 manas 268
def todict(obj, classkey=None):
269
    if isinstance(obj, dict):
270
        data = {}
271
        for (k, v) in obj.items():
272
            data[k] = todict(v, classkey)
273
        return data
274
    elif hasattr(obj, "_ast"):
275
        return todict(obj._ast())
276
    elif hasattr(obj, "__iter__"):
277
        return [todict(v, classkey) for v in obj]
278
    elif hasattr(obj, "__dict__"):
279
        data = dict([(key, todict(value, classkey)) 
280
            for key, value in obj.__dict__.iteritems() 
281
            if not callable(value) and not key.startswith('_')])
282
        if classkey is not None and hasattr(obj, "__class__"):
283
            data[classkey] = obj.__class__.__name__
284
        return data
285
    else:
13690 amit.gupta 286
        return obj
287