package com.yeshi.fanli.service.impl.user; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.hibernate.HibernateException; import org.hibernate.Session; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.yeshi.fanli.dao.mybatis.TBPidMapper; import com.yeshi.fanli.dao.mybatis.share.PidUserMapper; import com.yeshi.fanli.dao.taobao.TBPidDao; import com.yeshi.fanli.entity.taobao.ClientTBPid; import com.yeshi.fanli.entity.taobao.PidUser; import com.yeshi.fanli.entity.taobao.TBPid; import com.yeshi.fanli.entity.taobao.TaoBaoUnionConfig; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.taobao.TaoBaoUnionConfigService; import com.yeshi.fanli.service.inter.user.TBPidService; import org.yeshi.utils.HttpUtil; import net.sf.json.JSONObject; @Service public class TBPidServiceImpl implements TBPidService { @Resource private TBPidDao tbPidDao; @Resource private TBPidMapper tbPidMapper; @Resource private PidUserMapper pidUserMapper; @Resource private TaoBaoUnionConfigService taoBaoUnionConfigService; private String getCookie() { String result = HttpUtil.get("http://193.112.35.168:8091/tb/cookie/getcookie?account=17784739772"); JSONObject resultJSON = JSONObject.fromObject(result); if (resultJSON.optInt("code") == 0) { return resultJSON.optString("cookie"); } else { return null; } } private String getCookieBuXin() { String result = HttpUtil.get("http://193.112.35.168:8091/tb/cookie/getcookie?account=17347953252"); JSONObject resultJSON = JSONObject.fromObject(result); if (resultJSON.optInt("code") == 0) { return resultJSON.optString("cookie"); } else { return null; } } private void reportCookieInvalid() { String result = HttpUtil.get("http://193.112.35.168:8091/tb/cookie/getcookie?account=17784739772"); } private boolean createPid() { try { Thread.sleep(1000 * 3 + (int) (Math.random() * 5000)); } catch (InterruptedException e) { e.printStackTrace(); } Long count = (Long) tbPidDao.excute(new HibernateCallback() { @Override public Long doInHibernate(Session session) throws HibernateException { return Long.parseLong(session.createQuery("select count(*) from TBPid").uniqueResult().toString()); } }); String name = "quanqudao_" + count; String cookies = getCookie(); if (cookies == null) { try { Thread.sleep(1000 * 10); } catch (InterruptedException e) { e.printStackTrace(); } createPid(); } String url = "https://pub.alimama.com/common/adzone/selfAdzoneCreate.json"; Map headrers = new HashMap<>(); headrers.put("Cookie", cookies); headrers.put("Origin", "http://pub.alimama.com"); headrers.put("Referer", "ttp://pub.alimama.com/promo/search/index.htm"); headrers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); String[] sts = cookies.split(";"); String token = ""; for (String st : sts) { if (st.contains("_tb_token_")) { token = st.split("=")[1].trim(); } } List configList = taoBaoUnionConfigService.getConfigByTypeCache(PidUser.TYPE_FANLI_ANDROID); Map params = new HashMap<>(); params.put("tag", "29"); params.put("gcid", "7"); params.put("siteid", "56750082"); params.put("selectact", "add"); params.put("t", System.currentTimeMillis() + ""); params.put("_tb_token_", token); params.put("newadzonename", name); String result = (post(url, params, headrers)); JSONObject data = JSONObject.fromObject(result); if (data.optBoolean("ok")) { if (com.yeshi.fanli.util.StringUtil.isNullOrEmpty(data.optJSONObject("data").optString("adzoneId"))) return false; String pid = String.format("mm_%s_%s_%s", configList.get(0).getAccountId(), data.optJSONObject("data").optString("siteId"), data.optJSONObject("data").optString("adzoneId")); TBPid tbPid = new TBPid(); tbPid.setCreatetime(System.currentTimeMillis()); tbPid.setName(name); tbPid.setPid(pid); tbPidMapper.insertSelective(tbPid); return true; } else { System.out.println(result); } return false; } private boolean createPidBuXin() { try { Thread.sleep(1000 * 3 + (int) (Math.random() * 5000)); } catch (InterruptedException e) { e.printStackTrace(); } Long count = (Long) tbPidDao.excute(new HibernateCallback() { @Override public Long doInHibernate(Session session) throws HibernateException { return Long.parseLong(session.createQuery("select count(*) from TBPid").uniqueResult().toString()); } }); String name = "tuiguang_" + count; String cookies = getCookieBuXin(); if (cookies == null) { try { Thread.sleep(1000 * 10); } catch (InterruptedException e) { e.printStackTrace(); } createPidBuXin(); } String url = "http://pub.alimama.com/common/adzone/selfAdzoneCreate.json"; Map headrers = new HashMap<>(); headrers.put("Cookie", cookies); headrers.put("Origin", "http://pub.alimama.com"); headrers.put("Referer", "ttp://pub.alimama.com/promo/search/index.htm"); headrers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36"); String[] sts = cookies.split(";"); String token = ""; for (String st : sts) { if (st.contains("_tb_token_")) { token = st.split("=")[1].trim(); } } Map params = new HashMap<>(); double random = Math.random(); if (random > 0.6) {// android params.put("tag", "29"); params.put("gcid", "7"); params.put("siteid", "45750814"); } else if (random > 0.3) // IOS { params.put("tag", "29"); params.put("gcid", "7"); params.put("siteid", "45820106"); } else// 导购 { params.put("tag", "29"); params.put("gcid", "8"); params.put("siteid", "45882200"); } params.put("selectact", "add"); params.put("t", System.currentTimeMillis() + ""); params.put("_tb_token_", token); params.put("newadzonename", name); String result = (post(url, params, headrers)); JSONObject data = JSONObject.fromObject(result); if (data.optBoolean("ok")) { if (com.yeshi.fanli.util.StringUtil.isNullOrEmpty(data.optJSONObject("data").optString("adzoneId"))) return false; String pid = String.format("mm_133239778_%s_%s", data.optJSONObject("data").optString("siteId"), data.optJSONObject("data").optString("adzoneId")); TBPid tbPid = new TBPid(); tbPid.setCreatetime(System.currentTimeMillis()); tbPid.setName(name); tbPid.setPid(pid); tbPidDao.create(tbPid); return true; } else { System.out.println(result); } return false; } @Override public void startCreatePid() { for (int i = 1; i < 50000; i++) { try { createPid(); } catch (Exception e) { e.printStackTrace(); try { // 沉睡1分钟再试 Thread.sleep(1000 * 60L); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } private String post(String url, Map map, Map headers) { Iterator its = map.keySet().iterator(); NameValuePair[] params = new NameValuePair[map.keySet().size()]; int p = 0; while (its.hasNext()) { String key = its.next(); NameValuePair np = new NameValuePair(key, map.get(key)); params[p] = np; p++; } HttpClient client = new HttpClient(); PostMethod method = new PostMethod(url); if (headers != null) { its = headers.keySet().iterator(); while (its.hasNext()) { String key = its.next(); method.addRequestHeader(key, headers.get(key)); } } method.setRequestBody(params); try { client.executeMethod(method); return method.getResponseBodyAsString(); } catch (HttpException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } @Override @Transactional public TBPid getTBPid(Long uid, int type) { // 已经分配同类型的PID PidUser pidUser = pidUserMapper.selectLatestByUidAndType(uid, type); if (type == PidUser.TYPE_SHARE_GOODS && pidUser != null) {// 分享赚特殊处理 List configList = taoBaoUnionConfigService.getConfigByTypeCache(type); String pid = pidUser.getPid(); String appId = pid.split("_")[2]; if (configList.get(0).getAppId().equalsIgnoreCase(appId)) { TBPid tbPid = new TBPid(); tbPid.setPid(pidUser.getPid()); return tbPid; } } else { if (pidUser != null) { TBPid tbPid = new TBPid(); tbPid.setPid(pidUser.getPid()); return tbPid; } } TBPid tbPid = null; List configList = taoBaoUnionConfigService.getConfigByTypeCache(type); // 以查询到的第一个为主PID,当主PID缺失的时候采用其他PID for (TaoBaoUnionConfig config : configList) { String prefix = String.format("mm_%s_%s_", config.getAccountId(), config.getAppId()); tbPid = tbPidMapper.selectAvailablePid(prefix.replace("_", "\\_") + "%"); if (tbPid != null) { break; } } if (tbPid != null) { // 将先前的PID设置为已用 TBPid updateTBPid = new TBPid(); updateTBPid.setId(tbPid.getId()); updateTBPid.setUsed(true); tbPidMapper.updateByPrimaryKeySelective(updateTBPid); // 插入对应的用户PID映射 pidUser = new PidUser(); pidUser.setPid(tbPid.getPid()); pidUser.setUid(uid); pidUser.setType(type); pidUserMapper.insertSelective(pidUser); return tbPid; } else { LogHelper.error("无PID可用:" + type); } return null; } @Override public ClientTBPid getAndroidDefault() { List configList = taoBaoUnionConfigService.getConfigByTypeCache(PidUser.TYPE_FANLI_ANDROID); String pid = configList.get(0).getDefaultPid(); String siteId = pid.split("_")[2]; String adzoneId = pid.split("_")[3]; return new ClientTBPid(configList.get(0).getAppKey(), pid, siteId, adzoneId); } @Override public ClientTBPid getIOSDefault() { List configList = taoBaoUnionConfigService.getConfigByTypeCache(PidUser.TYPE_FANLI_IOS); String pid = configList.get(0).getDefaultPid(); String siteId = pid.split("_")[2]; String adzoneId = pid.split("_")[3]; return new ClientTBPid(configList.get(0).getAppKey(), pid, siteId, adzoneId); } @Override public void startCreatePidBuXinJie() { for (int i = 1; i < 50000; i++) { try { createPidBuXin(); } catch (Exception e) { e.printStackTrace(); try { // 沉睡1分钟再试 Thread.sleep(1000 * 60L); } catch (InterruptedException e1) { e1.printStackTrace(); } } } } }