Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
29451 manish 1
package com.smartdukaan.cron.scheduled;
2
 
3
import java.io.File;
4
import java.io.IOException;
5
import java.nio.file.Files;
6
import java.nio.file.Path;
7
import java.nio.file.Paths;
8
import java.time.LocalDate;
9
import java.time.LocalDateTime;
10
import java.time.format.DateTimeFormatter;
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.Formattable;
14
import java.util.HashMap;
15
import java.util.List;
16
import java.util.Map;
17
 
18
import org.apache.logging.log4j.LogManager;
19
import org.apache.logging.log4j.Logger;
20
import org.json.JSONObject;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.stereotype.Component;
23
import org.springframework.util.StringUtils;
24
 
25
import com.ctc.wstx.util.StringUtil;
26
import com.smartdukaan.cron.migrations.RunOnceTasks;
27
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
28
import com.spice.profitmandi.common.util.FormattingUtils;
29
import com.spice.profitmandi.dao.entity.fofo.ActivatedImei;
30
import com.spice.profitmandi.dao.model.VivoImeiAndActivationTimeStampModel;
31
import com.spice.profitmandi.dao.model.VivoImeiStatusModel;
32
import com.spice.profitmandi.dao.repository.fofo.ActivatedImeiRepository;
33
import com.spice.profitmandi.service.inventory.InventoryService;
34
 
35
import okhttp3.Cookie;
36
import okhttp3.CookieJar;
37
import okhttp3.FormBody;
38
import okhttp3.HttpUrl;
39
import okhttp3.OkHttpClient;
40
import okhttp3.Request;
41
import okhttp3.RequestBody;
42
import okhttp3.Response;
43
 
44
@Component
45
class VivoImeiActivationService {
46
 
47
	@Autowired
48
	InventoryService inventoryService;
49
 
50
	@Autowired
51
	CaptchaService captchaService;
52
 
53
	@Autowired
54
	ActivatedImeiRepository activatedImeiRepository;
55
 
56
	private static final Logger LOGGER = LogManager.getLogger(RunOnceTasks.class);
57
 
58
	private final Map<String, List<Cookie>> cookieStore = new HashMap<>();
59
 
60
	public void checkImeiActivation() throws ProfitMandiBusinessException, IOException, Exception {
61
 
62
		OkHttpClient okHttpClient = new OkHttpClient.Builder().cookieJar(new CookieJar() {
63
			@Override
64
			public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
65
				LOGGER.info("SAVE fROM - {}", httpUrl.host());
66
				cookieStore.put(httpUrl.host(), list);
67
			}
68
 
69
			@Override
70
			public List<Cookie> loadForRequest(HttpUrl httpUrl) {
71
				List<Cookie> cookies = cookieStore.get(httpUrl.host());
72
				LOGGER.info("load from - {}", httpUrl.host());
73
				return cookies != null ? cookies : new ArrayList<Cookie>();
74
			}
75
		}).build();
76
 
77
		String captchaBreak = this.getNewCaptcha(okHttpClient);
78
 
79
		Object status = null;
80
		LOGGER.info("Captcha code {}", captchaBreak);
81
 
82
		 List<VivoImeiAndActivationTimeStampModel>   imeisActivationList =activatedImeiRepository.selectVivoImeiAndActivationTimeStamp();
83
 
84
		 LOGGER.info("imeisActivationList {}", imeisActivationList);
85
			int count= 0;
86
 
87
			Map<String, LocalDateTime> imeisActivationMap = new HashMap<>();
88
 
89
			for(VivoImeiAndActivationTimeStampModel imeisActivation :imeisActivationList) 
90
			{
91
				count++;
92
				imeisActivationMap.put(imeisActivation.getSerialNumber(), imeisActivation.getActivationTimestamp());
93
 
29455 manish 94
				if(count == 5000  )
29451 manish 95
				{
96
				 status = this.getImeiActivation(captchaBreak, okHttpClient,imeisActivationMap);
97
 
98
 
99
				 if (status.equals(0)) {
100
						this.generate(captchaBreak, okHttpClient,imeisActivationMap);
101
						}
29455 manish 102
					count= 5005;
29451 manish 103
 
104
				}
105
 
29455 manish 106
				if(count==5005)
107
				{
108
					break;
109
 
110
				}
29451 manish 111
			}
112
 
113
 
114
 
115
 
116
 
117
 
118
 
119
 
120
	}
121
 
122
	// assign uppercase of ch1, ch2 to ch3, ch4
123
 
124
 
125
 
126
	// Get Captcha file
127
 
128
	// Call Api to break captcha
129
	// Iterate and fetch activation information using captcha code.
130
 
131
	// inventoryService.addActivatedImeis(imeisActivationMap );
132
 
133
	public void generate(String input, OkHttpClient okHttpClient,Map<String, LocalDateTime> imeisActivationMap) {
134
		int n = input.length();
135
		int max = 1 << n;
136
		input = input.toLowerCase();
137
		int statusCount = 0;
138
 
139
		Object statusUpper = null;
140
		char combination[] = null;
141
		for (int i = 0; i < max; i++) {
142
			combination = input.toCharArray();
143
			for (int j = 0; j < n; j++) {
144
				if (((i >> j) & 1) == 1)
145
					combination[j] = (char) (combination[j] - 32);
146
			}
147
			LOGGER.info("combination" + String.valueOf(combination));	
148
			try {
149
				statusUpper = this.getImeiActivation(String.valueOf(combination), okHttpClient,imeisActivationMap);
150
			} catch (IOException e) {
151
				// TODO Auto-generated catch block
152
				e.printStackTrace();
153
			}
154
 
155
			if (!statusUpper.equals(0)) {
156
				statusCount = 1;
157
				break;
158
			}
159
 
160
		}
161
 
162
 
163
		if(statusCount == 0 )
164
		{
165
 
166
			try {
167
			String freshCaptcha =	this.getNewCaptcha(okHttpClient);
168
 
169
			this.generate(freshCaptcha, okHttpClient, imeisActivationMap);		
170
			} catch (Exception e) {
171
				// TODO Auto-generated catch block
172
				e.printStackTrace();
173
			}
174
		}
175
 
176
		LOGGER.info("statusUpper" + statusUpper);
177
	}
178
 
179
 
180
	public String getNewCaptcha(OkHttpClient okHttpClient) throws Exception 
181
 
182
	{
183
 
184
 
185
		LOGGER.info("okHttpClient" + okHttpClient);
186
 
187
		HttpUrl vivoSupportUrl = HttpUrl.parse("https://www.vivo.com/in/support/generatingCodes");
188
		Request request = new Request.Builder().url(vivoSupportUrl).build();
189
 
190
		Response response = okHttpClient.newCall(request).execute();
191
		LOGGER.info("cookie {}", this.cookieStore.values());
192
 
193
		LOGGER.info("vivoSupportUrl" + vivoSupportUrl);
194
		LOGGER.info("request" + request);
195
		LOGGER.info("request" + request);
196
 
197
		String filePath = "/tmp/captcha.avif";
198
		Files.write(Paths.get(filePath), response.body().bytes());
199
 
200
		// Get all relevent imes from activatedImei and inventoryItem for vivo
201
 
202
 
203
		String captchaBreak = captchaService.getCaptchaCode(filePath);
204
 
205
 
206
		return captchaBreak;
207
	}
208
 
209
 
210
	public Object getImeiActivation(String captchaBreak, OkHttpClient okHttpClient ,Map<String, LocalDateTime> imeisActivationMap ) throws IOException {
211
 
212
 
213
		Object status = 0;
214
 
215
		for (Map.Entry<String,LocalDateTime> imei :  imeisActivationMap.entrySet()) {
216
 
217
			LOGGER.info("imei" + imei);
218
			RequestBody formBody = new FormBody.Builder()
219
					.add("imei", imei.getKey())
220
					.add("code", captchaBreak)
221
					.build();
222
 
223
			Request request1 = new Request.Builder().url("https://www.vivo.com/in/support/checkCode").post(formBody)
224
					.build();
225
 
226
			Response response2 = okHttpClient.newCall(request1).execute();
227
			JSONObject imeiActivationJson = new JSONObject(response2.body().string());
228
			LOGGER.info("imeiActivationJson" + imeiActivationJson);
229
			JSONObject data = imeiActivationJson.getJSONObject("data");
230
 
231
			JSONObject imeiQueryDto =data.getJSONObject("imeiQueryDto");
232
 
233
			Object dueTimeObject = imeiQueryDto.get("dueTime");
234
			String dueTimeString =  dueTimeObject.toString();
235
 
236
			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
237
	        String dueTimeSplit = dueTimeString.split(" ")[0];
238
 
239
	        status = data.get("status");
240
 
241
	        if(!StringUtils.isEmpty(dueTimeSplit))
242
	        {
243
 
244
			LocalDate dateTime = LocalDate.parse(dueTimeSplit, formatter);
245
 
246
			LOGGER.info("data" + data);
247
 
248
			LOGGER.info("status" + status);
249
 
250
 
251
			ActivatedImei activatedImei=	activatedImeiRepository.selectBySerialNumber(imei.getKey());
252
 
253
			if(activatedImei == null)
254
 
255
			{
256
				activatedImei	 = new  ActivatedImei();
257
				activatedImei.setActivationTimestamp(dateTime.atStartOfDay().minusYears(1));
258
				activatedImei.setSerialNumber(imei.getKey());
259
				activatedImei.setCreateTimestamp(LocalDateTime.now());
260
				 activatedImeiRepository.persist(activatedImei);
261
 
262
			}
263
			else {
264
				activatedImei.setActivationTimestamp(dateTime.atStartOfDay().minusYears(1));
265
 
266
			}
267
 
268
			LOGGER.info("activatedImei" + activatedImei);
269
 
270
			LOGGER.info("vivoImeiStatusModel" + dateTime.atStartOfDay());
271
 
272
 
273
	        }
274
 
275
 
276
 
277
			if (status.equals(0)) {
278
 
279
				return status;
280
			}
281
		}
282
 
283
		return status;
284
	}
285
}