| Line 2... |
Line 2... |
| 2 |
Created on Jan 15, 2015
|
2 |
Created on Jan 15, 2015
|
| 3 |
|
3 |
|
| 4 |
@author: amit
|
4 |
@author: amit
|
| 5 |
'''
|
5 |
'''
|
| 6 |
from BeautifulSoup import BeautifulSoup
|
6 |
from BeautifulSoup import BeautifulSoup
|
| - |
|
7 |
from datetime import datetime, date, timedelta
|
| 7 |
from dtr import main
|
8 |
from dtr import main
|
| 8 |
from dtr.dao import AffiliateInfo, Order, SubOrder
|
9 |
from dtr.dao import AffiliateInfo, Order, SubOrder
|
| 9 |
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
|
10 |
from dtr.main import getBrowserObject, getStore, ParseException, ungzipResponse, \
|
| 10 |
Store as MStore, sourceMap
|
11 |
Store as MStore, sourceMap
|
| 11 |
from pprint import pprint
|
12 |
from pprint import pprint
|
| Line 45... |
Line 46... |
| 45 |
def getName(self):
|
46 |
def getName(self):
|
| 46 |
return "flipkart"
|
47 |
return "flipkart"
|
| 47 |
|
48 |
|
| 48 |
def scrapeStoreOrders(self,):
|
49 |
def scrapeStoreOrders(self,):
|
| 49 |
orders = self._getActiveOrders()
|
50 |
orders = self._getActiveOrders()
|
| 50 |
|
- |
|
| 51 |
def scrapeAffiliate(self, startDate=None, endDate=None):
|
- |
|
| 52 |
br = getBrowserObject()
|
51 |
br = getBrowserObject()
|
| 53 |
br.open(AFFILIATE_URL)
|
52 |
for order in orders:
|
| - |
|
53 |
|
| 54 |
response = br.response() # copy
|
54 |
closed = True
|
| 55 |
token = re.findall('window.__FK = "(.*?)"', ungzipResponse(response), re.IGNORECASE)[0]
|
55 |
url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', order['orderSuccessUrl'],re.IGNORECASE)[0]
|
| 56 |
data = {'__FK':token,
|
56 |
response = br.open(url)
|
| 57 |
'email':'saholic1@gmail.com',
|
57 |
page = ungzipResponse(response)
|
| 58 |
'password':'e8aacf6fc1e3998186a4a8e56e428f66'
|
- |
|
| 59 |
}
|
58 |
|
| 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)
|
59 |
soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
|
| - |
|
60 |
|
| - |
|
61 |
sections = soup.findAll("div", {"class":"ui-app-card-body"})
|
| - |
|
62 |
sections.pop(1)
|
| - |
|
63 |
|
| - |
|
64 |
mainOrder = soup.find("ul",{"class":"m-bottom p-cart"})
|
| - |
|
65 |
fkSubOrders = mainOrder.findAll("li")
|
| - |
|
66 |
|
| - |
|
67 |
#remove unwanted list
|
| - |
|
68 |
fkSubOrders.pop(-1)
|
| - |
|
69 |
|
| - |
|
70 |
|
| - |
|
71 |
bulk = self.db.merchantOrder.initialize_ordered_bulk_op()
|
| - |
|
72 |
#fetching suborders details
|
| - |
|
73 |
for subOrder in fkSubOrders:
|
| - |
|
74 |
updateMap = {}
|
| - |
|
75 |
y = subOrder.find("header").findAll("span")
|
| - |
|
76 |
for suborderId in y:
|
| - |
|
77 |
if "value emp" in str(suborderId):
|
| - |
|
78 |
merchantSubOrderId = suborderId.text
|
| - |
|
79 |
break
|
| - |
|
80 |
orderItems = subOrder.find("ul").findAll("div", recursive=False)
|
| - |
|
81 |
i=0
|
| - |
|
82 |
for orderItem in orderItems:
|
| - |
|
83 |
closedStatus = False
|
| - |
|
84 |
merchantSubOrderId = merchantSubOrderId + str(i)
|
| - |
|
85 |
subOrder = self._isSubOrderActive(order, merchantSubOrderId)
|
| - |
|
86 |
if subOrder is None:
|
| - |
|
87 |
break
|
| - |
|
88 |
findMap = {"orderId": order['orderId'], "subOrders.merchantSubOrderId": merchantSubOrderId}
|
| - |
|
89 |
divs = orderItem.findAll('div', recursive=False)
|
| - |
|
90 |
orderTracking = divs[2]
|
| - |
|
91 |
orderTrackingDetDiv = divs[3].find('div',{'class':'c-tabs-content m-top active'})
|
| - |
|
92 |
orderTrackingDet = orderTrackingDetDiv.div.header.div.text
|
| - |
|
93 |
updateMap["subOrders.$.detailedStatus"] = orderTrackingDet
|
| - |
|
94 |
tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
|
| - |
|
95 |
|
| - |
|
96 |
cashbackStatus = subOrder.get("cashBackStatus")
|
| - |
|
97 |
if "approveDetails-complete" in str(tr):
|
| - |
|
98 |
if "processingDetails-complete" in str(tr):
|
| - |
|
99 |
if "shippingDetails-complete" in str(tr):
|
| - |
|
100 |
if "delivery-complete" in str(tr):
|
| - |
|
101 |
status = MStore.ORDER_DELIVERED
|
| - |
|
102 |
if cashbackStatus == Store.CB_INIT:
|
| - |
|
103 |
cashbackStatus = Store.CB_APPROVED
|
| - |
|
104 |
closedStatus = True
|
| - |
|
105 |
else:
|
| - |
|
106 |
status = MStore.ORDER_SHIPPED
|
| - |
|
107 |
courierTrackAnchor = orderTrackingDetDiv.find('a')
|
| - |
|
108 |
trackingUrl = courierTrackAnchor("href")
|
| - |
|
109 |
trackingText = courierTrackAnchor.text
|
| - |
|
110 |
courierArr = trackingText.split(' : ')
|
| - |
|
111 |
updateMap["subOrders.$.trackingUrl"] = trackingUrl
|
| - |
|
112 |
updateMap["subOrders.$.trackingNumber"] = courierArr[1]
|
| - |
|
113 |
updateMap["subOrders.$.courierName"] = courierArr[0]
|
| - |
|
114 |
else:
|
| - |
|
115 |
status = MStore.ORDER_PLACED
|
| - |
|
116 |
else:
|
| - |
|
117 |
status = MStore.ORDER_PLACED
|
| - |
|
118 |
elif str(tr) in ["approveDetails-ongoing"]:
|
| - |
|
119 |
status=MStore.ORDER_PLACED
|
| - |
|
120 |
if "dead" in str(tr):
|
| - |
|
121 |
status = MStore.ORDER_CANCELLED
|
| - |
|
122 |
closedStatus = True
|
| - |
|
123 |
if cashbackStatus == Store.CB_INIT:
|
| - |
|
124 |
cashbackStatus = Store.CB_CANCELLED
|
| - |
|
125 |
|
| - |
|
126 |
updateMap["subOrders.$.cashBackStatus"] = cashbackStatus
|
| - |
|
127 |
updateMap["subOrders.$.status"] = status
|
| - |
|
128 |
updateMap["subOrders.$.closed"] = closedStatus
|
| - |
|
129 |
if closed:
|
| - |
|
130 |
closed = closedStatus
|
| - |
|
131 |
bulk.find(findMap).update({'$set' : updateMap})
|
| - |
|
132 |
bulk.find({'orderId': order['orderId']}).update({'$set':{'closed': closed}})
|
| - |
|
133 |
bulk.execute()
|
| - |
|
134 |
|
| - |
|
135 |
def scrapeAffiliate(self, startDate=None, endDate=None):
|
| - |
|
136 |
#get all yesterday's affiliate in pending or cancelled state and update to system
|
| - |
|
137 |
if datetime.now().hour == 1:
|
| - |
|
138 |
yesterdate = date.today() - timedelta(1)
|
| - |
|
139 |
syesterdate = yesterdate.strftime('%Y-%m-%d')
|
| - |
|
140 |
br = getBrowserObject()
|
| - |
|
141 |
br.open(AFFILIATE_URL)
|
| - |
|
142 |
response = br.response() # copy
|
| - |
|
143 |
token = re.findall('window.__FK = "(.*?)"', ungzipResponse(response), re.IGNORECASE)[0]
|
| - |
|
144 |
data = {'__FK':token,
|
| - |
|
145 |
'email':'saholic1@gmail.com',
|
| - |
|
146 |
'password':'e8aacf6fc1e3998186a4a8e56e428f66'
|
| - |
|
147 |
}
|
| - |
|
148 |
br.open(AFFILIATE_LOGIN_URL, urllib.urlencode(data))
|
| - |
|
149 |
for status in [AFF_STATUS_PENDING, AFF_STATUS_CANCELLED, AFF_STATUS_DISAPPROVED]:
|
| - |
|
150 |
br.open(AFF_REPORT_URL % (status, syesterdate, syesterdate))
|
| - |
|
151 |
page = ungzipResponse(br.response())
|
| - |
|
152 |
soup = BeautifulSoup(page,convertEntities=BeautifulSoup.HTML_ENTITIES)
|
| 65 |
try:
|
153 |
try:
|
| 66 |
tableElement = soup.findAll('table', {'class':'report-table fixtable'})[1]
|
154 |
tableElement = soup.findAll('table', {'class':'report-table fixtable'})[1]
|
| 67 |
except:
|
155 |
except:
|
| 68 |
continue
|
156 |
continue
|
| 69 |
trElements = tableElement.findAll('tr')
|
157 |
trElements = tableElement.findAll('tr')
|
| 70 |
trElements.pop(0)
|
158 |
trElements.pop(0)
|
| 71 |
for trElement in trElements:
|
159 |
for trElement in trElements:
|
| 72 |
tdElements = trElement.findAll('td')
|
160 |
tdElements = trElement.findAll('td')
|
| 73 |
productCode = re.findall(r'pid=(.*)$', tdElements[0].find('a')['href'])[0]
|
161 |
productCode = re.findall(r'pid=(.*)$', tdElements[0].find('a')['href'])[0]
|
| 74 |
quantity =int(tdElements[3].text)
|
162 |
quantity =int(tdElements[3].text)
|
| 75 |
price = int(float(tdElements[2].text))
|
163 |
price = int(re.findall(r'\d+', tdElements[2].text)[0])
|
| 76 |
payOut = tdElements[6].text
|
164 |
payOut = int(re.findall(r'\d+', tdElements[6].text)[0])
|
| 77 |
subTagId = tdElements[7].text
|
165 |
subTagId = tdElements[7].text
|
| - |
|
166 |
affiliateInfo = AffiliateInfo(subTagId, self.store_id, status, None, syesterdate, payOut, None, None, price*quantity)
|
| 78 |
reason = tdElements[9].text
|
167 |
print todict(affiliateInfo)
|
| - |
|
168 |
updateMap = {}
|
| - |
|
169 |
updateMap['subOrders.$.unitPrice'] = price
|
| - |
|
170 |
updateMap['subOrders.$.cashBackAmount'], updateMap['subOrders.$.cashBacPercentage'] = self.getCashbackAmount(productCode, price)
|
| - |
|
171 |
self._updateOrdersPayBackStatus({'subTagId':subTagId, 'subOrders.productCode':productCode}, updateMap)
|
| - |
|
172 |
|
| 79 |
|
173 |
|
| 80 |
def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
|
174 |
def parseOrderRawHtml(self, orderId, subTagId, userId, rawHtml, orderSuccessUrl):
|
| 81 |
br = getBrowserObject()
|
175 |
br = getBrowserObject()
|
| 82 |
url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
|
176 |
url = ORDER_TRACK_URL + re.findall('.*(\?.*?)$', orderSuccessUrl,re.IGNORECASE)[0]
|
| 83 |
|
177 |
|
| Line 98... |
Line 192... |
| 98 |
i=0
|
192 |
i=0
|
| 99 |
while i< len(name):
|
193 |
while i< len(name):
|
| 100 |
if "key" in str(name[i]):
|
194 |
if "key" in str(name[i]):
|
| 101 |
if "Grand Total" in str(name[i]):
|
195 |
if "Grand Total" in str(name[i]):
|
| 102 |
#Total Amount
|
196 |
#Total Amount
|
| 103 |
merchantOrder.paidAmount = re.findall(r'\d+', name[i+1].text)[0]
|
197 |
merchantOrder.paidAmount = int(re.findall(r'\d+', name[i+1].text)[0])
|
| 104 |
elif "Order Date" in str(name[i]):
|
198 |
elif "Order Date" in str(name[i]):
|
| 105 |
merchantOrder.placedOn = name[i+1].text
|
199 |
merchantOrder.placedOn = name[i+1].text
|
| 106 |
i=i+1
|
200 |
i=i+1
|
| 107 |
|
201 |
|
| 108 |
merchantOrder.merchantOrderId = merchantOrderId
|
202 |
merchantOrder.merchantOrderId = merchantOrderId
|
| Line 156... |
Line 250... |
| 156 |
print "Delivery Date " +mname[k+1].text
|
250 |
print "Delivery Date " +mname[k+1].text
|
| 157 |
k=k+1
|
251 |
k=k+1
|
| 158 |
merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
|
252 |
merchantsubOrder = SubOrder(productTitle, productUrl, merchantOrder.placedOn, amountPaid,MStore.ORDER_PLACED, quantity)
|
| 159 |
merchantsubOrder.imgUrl = imgUrl
|
253 |
merchantsubOrder.imgUrl = imgUrl
|
| 160 |
merchantsubOrder.productCode = productCode
|
254 |
merchantsubOrder.productCode = productCode
|
| 161 |
|
255 |
merchantsubOrder.merchantSubOrderId = merchantSubOrderId
|
| 162 |
cashbackAmount = self.getCashbackAmount(subOrder.productCode, amountPaid)
|
256 |
cashbackAmount, cashbackPercent = self.getCashbackAmount(subOrder.productCode, amountPaid)
|
| 163 |
cashbackStatus = Store.CB_INIT
|
257 |
cashbackStatus = Store.CB_INIT
|
| 164 |
if cashbackAmount <= 0:
|
258 |
if cashbackAmount <= 0:
|
| 165 |
cashbackStatus = Store.CB_NA
|
259 |
cashbackStatus = Store.CB_NA
|
| 166 |
merchantsubOrder.cashBackAmount = cashbackAmount
|
260 |
merchantsubOrder.cashBackAmount = cashbackAmount
|
| 167 |
merchantsubOrder.cashBackStatus = cashbackStatus
|
261 |
merchantsubOrder.cashBackStatus = cashbackStatus
|
| - |
|
262 |
merchantsubOrder.cashBackPercentage = cashbackPercent
|
| 168 |
|
263 |
|
| 169 |
subOrders.append(merchantsubOrder)
|
264 |
subOrders.append(merchantsubOrder)
|
| 170 |
#To track shipping details
|
265 |
#To track shipping details
|
| 171 |
status=-1
|
266 |
status=-1
|
| 172 |
tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
|
267 |
tr = orderTracking.findAll("div",{"class":"tap-bullet-area c-tab-trigger"})
|
| Line 175... |
Line 270... |
| 175 |
if "shippingDetails-complete" in str(tr):
|
270 |
if "shippingDetails-complete" in str(tr):
|
| 176 |
if "delivery-complete" in str(tr):
|
271 |
if "delivery-complete" in str(tr):
|
| 177 |
status = MStore.ORDER_DELIVERED
|
272 |
status = MStore.ORDER_DELIVERED
|
| 178 |
else:
|
273 |
else:
|
| 179 |
status = MStore.ORDER_SHIPPED
|
274 |
status = MStore.ORDER_SHIPPED
|
| - |
|
275 |
orderTracking.find('div', {'class':'tracking-remark active'})
|
| 180 |
else:
|
276 |
else:
|
| 181 |
status = MStore.ORDER_PLACED
|
277 |
status = MStore.ORDER_PLACED
|
| 182 |
else:
|
278 |
else:
|
| 183 |
status = MStore.ORDER_PLACED
|
279 |
status = MStore.ORDER_PLACED
|
| 184 |
elif str(tr) in ["approveDetails-ongoing"]:
|
280 |
elif str(tr) in ["approveDetails-ongoing"]:
|
| Line 231... |
Line 327... |
| 231 |
status = 0
|
327 |
status = 0
|
| 232 |
if "dead" in str(tr):
|
328 |
if "dead" in str(tr):
|
| 233 |
status = 4
|
329 |
status = 4
|
| 234 |
print status
|
330 |
print status
|
| 235 |
|
331 |
|
| 236 |
|
- |
|
| 237 |
|
332 |
|
| 238 |
def _saveToOrderFlipkart(self, order):
|
333 |
def _saveToOrderFlipkart(self, order):
|
| 239 |
collection = self.db.merchantOrder
|
334 |
collection = self.db.merchantOrder
|
| 240 |
order = collection.insert(order)
|
335 |
order = collection.insert(order)
|
| 241 |
|
336 |
|
| Line 247... |
Line 342... |
| 247 |
|
342 |
|
| 248 |
def main():
|
343 |
def main():
|
| 249 |
|
344 |
|
| 250 |
store = getStore(2)
|
345 |
store = getStore(2)
|
| 251 |
#store.scrapeAffiliate()
|
346 |
#store.scrapeAffiliate()
|
| 252 |
store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3019717576543723&token=14abca87835b66da4ce8fa9d7594d95f&src=or&pr=1')
|
347 |
#store.parseOrderRawHtml(12346, "SHA21423034609", 122324, "html", 'https://www.flipkart.com/orderresponse?reference_id=OD0019889963104132&token=198b370dfc5a25c017b5982c369ee960&src=or&pr=1')
|
| 253 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3016502908102575&token=0db4c692bacbfbfc158b52358ac9e91e&src=or&pr=1')
|
348 |
#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')
|
349 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD3018701137253850&token=f7402ddcf2b63b37cc6bc528cc115d2f&src=or&pr=1')
|
| 255 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
|
350 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
|
| 256 |
#store.flipkartOrderTracking(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
|
351 |
#store.flipkartOrderTracking(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019279584515727&token=7d85d8c24d36b5a1efc8008634390c7e&src=or&pr=1')
|
| 257 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://m.flipkart.com/orderresponse?reference_id=OD0019365336126533&token=dbce2bd4dc4023295b436a7d3c7986c9&src=or&pr=1')
|
352 |
#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')
|
353 |
#store.parseOrderRawHtml(12346, "subtagId", 122324, "html", 'https://dl.flipkart.com/orderresponse?reference_id=OD1019453634552336&token=e8e04871ad65b532aa53fa82bb34b901&src=or&pr=1')
|
| 259 |
#hex_md5('spice@2020')
|
354 |
#hex_md5('spice@2020')
|
| - |
|
355 |
store.scrapeStoreOrders()
|
| 260 |
|
356 |
|
| 261 |
|
357 |
|
| 262 |
if __name__ == '__main__':
|
358 |
if __name__ == '__main__':
|
| 263 |
main()
|
359 |
main()
|
| 264 |
|
360 |
|