|
@@ -1,6 +1,6 @@
|
|
|
package org.jeecg.modules.ctop.service.impl;
|
|
|
|
|
|
-import cn.com.ctop.common.utils.HttpUtils;
|
|
|
+import cn.com.ctop.common.utils.HttpUtils2;
|
|
|
import cn.com.ctop.crawler.modules.core.util.FateadmHttpUtil;
|
|
|
import cn.com.ctop.crawler.modules.core.util.FateadmUtil;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
@@ -8,6 +8,10 @@ import com.fasterxml.jackson.databind.DeserializationFeature;
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import org.apache.http.impl.cookie.BasicClientCookie;
|
|
|
+import org.jeecg.common.util.ResultMapUtils;
|
|
|
+import org.jeecg.common.util.StatusCode;
|
|
|
+import org.jeecg.modules.ctop.entity.BytedanceUrlInfo;
|
|
|
+import org.jeecg.modules.ctop.mapper.BytedanceUrlInfoMapper;
|
|
|
import org.jeecg.modules.ctop.service.ICreateInternalService;
|
|
|
import org.openqa.selenium.Cookie;
|
|
|
import org.openqa.selenium.WebDriver;
|
|
@@ -15,6 +19,7 @@ import org.openqa.selenium.chrome.ChromeDriver;
|
|
|
import org.openqa.selenium.chrome.ChromeOptions;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import sun.misc.BASE64Decoder;
|
|
@@ -27,29 +32,30 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
|
|
|
@Value("${jeecg.path.chrome-driver}")
|
|
|
private String chromeDriver;
|
|
|
-
|
|
|
+ @Autowired
|
|
|
+ private BytedanceUrlInfoMapper urlInfoMapper;
|
|
|
@Override
|
|
|
public Map<String, Object> createInternal(JSONObject requestJson) {
|
|
|
+ Map<String, Object> resultMap = new HashMap<>();
|
|
|
String url = "https://ad.oceanengine.com/pages/login/index.html";
|
|
|
System.getProperties().setProperty("webdriver.chrome.driver", chromeDriver);
|
|
|
ChromeOptions chromeOptions = new ChromeOptions();
|
|
|
-// chromeOptions.addArguments("--headless");
|
|
|
+ chromeOptions.addArguments("--headless");
|
|
|
// chromeOptions.addArguments("--incognito");
|
|
|
chromeOptions.addArguments("--no-sandbox");
|
|
|
// chromeOptions.addArguments("--disable-gpu");
|
|
|
chromeOptions.addArguments("--window-size=1920,1080");
|
|
|
- chromeOptions.addArguments("--user-agent=" + HttpUtils.USER_AGENT);
|
|
|
+ chromeOptions.addArguments("--user-agent=" + HttpUtils2.USER_AGENT);
|
|
|
chromeOptions.setAcceptInsecureCerts(true);
|
|
|
WebDriver webDriver = new ChromeDriver(chromeOptions);
|
|
|
try {
|
|
|
-
|
|
|
webDriver.get(url); //获取登录页面
|
|
|
for (Cookie cookie : webDriver.manage().getCookies()) {
|
|
|
BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
|
|
|
ck.setDomain("ad.oceanengine.com");
|
|
|
ck.setExpiryDate(cookie.getExpiry());
|
|
|
ck.setPath(cookie.getPath());
|
|
|
- HttpUtils.cookieStore.addCookie(ck);
|
|
|
+ HttpUtils2.cookieStore.addCookie(ck);
|
|
|
}
|
|
|
String html = webDriver.getPageSource();
|
|
|
Map<String, String> header = new HashMap<String, String>();
|
|
@@ -67,8 +73,7 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
param.put("captcha", "hqde");
|
|
|
param.put("is_30_days_no_login", "true");
|
|
|
param.put("service", "https://ad.oceanengine.com");
|
|
|
- String res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
|
|
|
- System.out.println("res:" + new String(res.getBytes("GBK"), "UTF8"));
|
|
|
+ String res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
|
|
|
|
|
|
ObjectMapper mapper = new ObjectMapper();
|
|
|
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
|
@@ -90,14 +95,14 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
FateadmHttpUtil.HttpResp resp = fateadmUtil.Predict("30400", decoder.decodeBuffer(captcha));
|
|
|
param.put("captcha", resp.pred_resl);
|
|
|
orderId = resp.req_id;
|
|
|
- res = HttpUtils.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
|
|
|
+ res = HttpUtils2.httpPostParamRequest("https://sso.toutiao.com/account_login/", param, header);
|
|
|
System.out.println("res:" + res);
|
|
|
jsonNode = mapper.readTree(res);
|
|
|
errorCode = jsonNode.get("error_code").asInt();
|
|
|
}
|
|
|
if (errorCode == 0) {
|
|
|
String csrftoken = "";
|
|
|
- List<org.apache.http.cookie.Cookie> cookies = HttpUtils.cookieStore.getCookies();
|
|
|
+ List<org.apache.http.cookie.Cookie> cookies = HttpUtils2.cookieStore.getCookies();
|
|
|
for (org.apache.http.cookie.Cookie ck : cookies) {
|
|
|
Cookie cookie = new Cookie(ck.getName(), ck.getValue(), "." + ck.getDomain(), ck.getPath(), ck.getExpiryDate());
|
|
|
webDriver.manage().addCookie(cookie);
|
|
@@ -106,16 +111,16 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
webDriver.get("https://ad.oceanengine.com/pages/promotion.html#/ad");//登录成功 进入推广页面
|
|
|
Thread.sleep(3000);
|
|
|
webDriver.get("https://ad.oceanengine.com/pages/campaign/create.html");//创建广告组页面
|
|
|
- Map<String, Object> param2 = new HashMap<String, Object>();
|
|
|
- Map<String, Object> param3 = new HashMap<String, Object>();
|
|
|
+ Map<String, Object> campaignParam = new HashMap<>();
|
|
|
String uuid = UUID.randomUUID().toString();
|
|
|
- param3.put("budget", 0);
|
|
|
- param3.put("budget_mode", -1);
|
|
|
- param2.put("campaign_id", "");
|
|
|
- param2.put("campaign_name", uuid.substring(1, 7));
|
|
|
- param2.put("landing_type", 3);
|
|
|
- param2.put("campaign_type", 1);
|
|
|
- param2.put("budget", param3);
|
|
|
+ campaignParam.put("campaign_id", "");
|
|
|
+ campaignParam.put("campaign_name", uuid.substring(1, 7));
|
|
|
+ campaignParam.put("landing_type", 3);
|
|
|
+ campaignParam.put("campaign_type", 1);
|
|
|
+ Map<String, Object> budgetMap = new HashMap<>();
|
|
|
+ budgetMap.put("budget", 0);
|
|
|
+ budgetMap.put("budget_mode", -1);
|
|
|
+ campaignParam.put("budget", budgetMap);
|
|
|
for (Cookie cookie : webDriver.manage().getCookies()) {
|
|
|
if ("csrftoken".equals(cookie.getName())) {
|
|
|
csrftoken = cookie.getValue();
|
|
@@ -124,8 +129,9 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
ck.setDomain("ad.oceanengine.com");
|
|
|
ck.setExpiryDate(cookie.getExpiry());
|
|
|
ck.setPath(cookie.getPath());
|
|
|
- HttpUtils.cookieStore.addCookie(ck);
|
|
|
+ HttpUtils2.cookieStore.addCookie(ck);
|
|
|
}
|
|
|
+
|
|
|
header.put("Accept", "application/json, text/javascript, */*; q=0.01");
|
|
|
header.put("Connection", "keep-alive");
|
|
|
header.put("Host", "ad.oceanengine.com");
|
|
@@ -134,96 +140,114 @@ public class CreateInternalServiceImpl implements ICreateInternalService {
|
|
|
header.put("X-CSRFToken", csrftoken);
|
|
|
header.put("X-Requested-With", "XMLHttpRequest");
|
|
|
header.put("Referer", "https://ad.oceanengine.com/pages/campaign/create.html");
|
|
|
- res = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/campaign/create/", param2, header);// 创建广告组返回信息
|
|
|
+ res = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/overture/campaign/create/", campaignParam, header);// 创建广告组返回信息
|
|
|
System.out.println(res);
|
|
|
- JsonNode node = mapper.readTree(res);
|
|
|
- String campaignId = node.get("data").get("campaign_id").asText(); //广告组id
|
|
|
- String url2 = "https://ad.oceanengine.com/pages/ad/create.html?campaign_id=" + campaignId + "&landing_type=3&temp_id=ADvQb";
|
|
|
- webDriver.get(url2);
|
|
|
- header.put("Referer", url2);
|
|
|
- for (Cookie cookie : webDriver.manage().getCookies()) {
|
|
|
- BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
|
|
|
- ck.setDomain("ad.oceanengine.com");
|
|
|
- ck.setExpiryDate(cookie.getExpiry());
|
|
|
- ck.setPath(cookie.getPath());
|
|
|
- HttpUtils.cookieStore.addCookie(ck);
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, Object> param4 = new HashMap<String, Object>();
|
|
|
- param4.put("location_type", 4);
|
|
|
- param4.put("aweme_account_fans", 0);
|
|
|
- String tokenStr = HttpUtils.httpPostRequest("https://ad.oceanengine.com/api/v1/hl/ad/audience/estimate/", param4, header);
|
|
|
- JsonNode tokenNode = mapper.readTree(tokenStr);
|
|
|
- Map<String, Object> param5 = new HashMap<String, Object>();
|
|
|
- param5.put("name", requestJson.getString("templateName"));//模板名称
|
|
|
- Integer deliveryRange = requestJson.getInteger("deliveryRange");
|
|
|
- param5.put("delivery_range", deliveryRange); //投放形式
|
|
|
- if (deliveryRange == 2) {
|
|
|
- param5.put("union_video_type", requestJson.getInteger("deliveryForm")); //投放形式 1:激励视频 2:原生
|
|
|
- }
|
|
|
- param5.put("classify", requestJson.getString("adCategory")); //广告类别
|
|
|
- param5.put("projectid", ""); //
|
|
|
- Integer downloadType = requestJson.getInteger("downloadType");
|
|
|
- param5.put("download_type", downloadType); //下载方式 1:下载包 2:h5
|
|
|
- if (downloadType == 1) {
|
|
|
- param5.put("download_url", requestJson.getString("downloadUrl"));
|
|
|
- }
|
|
|
- if (downloadType == 2) {
|
|
|
- param5.put("external_url", requestJson.getString("externalUrl")); // 落地页链接
|
|
|
- }
|
|
|
- param5.put("delivery_range", 1); // 投放范围
|
|
|
- param5.put("classify", 5); //广告类别 5 内广
|
|
|
- param5.put("projectid", "");
|
|
|
- param5.put("localGeolocation", new ArrayList<String>());
|
|
|
- param5.put("external_action", 4);
|
|
|
- param5.put("open_url", ""); // 应用直达链接
|
|
|
- param5.put("style_type", 0);
|
|
|
- param5.put("location_type", 4); //受众位置类型
|
|
|
- param5.put("hide_if_exists", 0); // 过滤已安装,当推广目标为安卓应用下载时可填,0表示不过滤,1表示过滤,默认为不过滤
|
|
|
- param5.put("interest_tag_mode", 0); //兴趣分类
|
|
|
- param5.put("token", tokenNode.get("data").get("token").asText());
|
|
|
- param5.put("toutiao", 100000005); //头条预估数据
|
|
|
- param5.put("aweme", 150000005); //抖音预估数据
|
|
|
- param5.put("video_app", 40000005);//西瓜预估数据
|
|
|
- param5.put("hotsoon", 40000005); //火山预估数据
|
|
|
- param5.put("aweme_account_fans", 0); //账号粉丝相似人群
|
|
|
- param5.put("auto_extend_enabled", 0);// 智能放量????
|
|
|
- param5.put("budget_mode", requestJson.getIntValue("budgetPriceMode")); // 广告预算类型 0 日预算 1 总预算
|
|
|
- param5.put("budget", requestJson.getIntValue("budgetPrice")); //广告预算
|
|
|
- int scheduleType = requestJson.getIntValue("dateQuantum");
|
|
|
- param5.put("schedule_type", scheduleType); //广告投放时间类型 默认1 1:不限 2:按时间???
|
|
|
- if (scheduleType == 2) {
|
|
|
- param5.put("start_time", requestJson.getString("startDate")); //广告投放起始时间
|
|
|
- param5.put("end_time", requestJson.getString("endDate"));//广告投放结束时间
|
|
|
- }
|
|
|
- param5.put("week_schedule", new ArrayList<String>()); //投放时段
|
|
|
- param5.put("week_time", new ArrayList<ArrayList<Integer>>());//投放时段
|
|
|
- int pricing = requestJson.getIntValue("pricing");
|
|
|
- param5.put("pricing", pricing); //计划出价类型 9 按展示付费 7 按点击付费 8 按转化付费
|
|
|
- param5.put("cpa_phrase", 2); //出价为OCPC时,计划处于哪个阶段??
|
|
|
- param5.put("is_union_slot", "");
|
|
|
- param5.put("hide_if_converted", 1); //过滤已转化用户类型字段,只有转化为目标时可填 优化目标为转化才展示
|
|
|
- param5.put("flow_control_mode", requestJson.getIntValue("flowControlMode")); //投放速度/投放方式使用字段
|
|
|
- if (pricing == 9) {
|
|
|
- param5.put("cpa_bid", requestJson.getIntValue("convertPrice"));
|
|
|
- } else {
|
|
|
- param5.put("bid", requestJson.getIntValue("convertPrice"));
|
|
|
+ Integer itratorNum = requestJson.getInteger("itratorNum");
|
|
|
+ if (null != itratorNum && itratorNum > 0) {
|
|
|
+ //循环创建广告计划
|
|
|
+ for (int i = 0; i < itratorNum; i++) {
|
|
|
+ JsonNode node = mapper.readTree(res);
|
|
|
+ String campaignId = node.get("data").get("campaign_id").asText(); //广告组id
|
|
|
+ String url2 = "https://ad.oceanengine.com/pages/ad/create.html?campaign_id=" + campaignId + "&landing_type=3&temp_id=ADvQb";
|
|
|
+ webDriver.get(url2);
|
|
|
+ header.put("Referer", url2);
|
|
|
+ for (Cookie cookie : webDriver.manage().getCookies()) {
|
|
|
+ BasicClientCookie ck = new BasicClientCookie(cookie.getName(), cookie.getValue());
|
|
|
+ ck.setDomain("ad.oceanengine.com");
|
|
|
+ ck.setExpiryDate(cookie.getExpiry());
|
|
|
+ ck.setPath(cookie.getPath());
|
|
|
+ HttpUtils2.cookieStore.addCookie(ck);
|
|
|
+ }
|
|
|
+ Map<String, Object> audienceParam = new HashMap<>();
|
|
|
+ audienceParam.put("location_type", 4);
|
|
|
+ audienceParam.put("aweme_account_fans", 0);
|
|
|
+ String tokenStr = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/api/v1/hl/ad/audience/estimate/", audienceParam, header);
|
|
|
+ JsonNode tokenNode = mapper.readTree(tokenStr);
|
|
|
+ Map<String, Object> planParam = new HashMap<>();
|
|
|
+ planParam.put("name", requestJson.getString("templateName"));//模板名称
|
|
|
+ Integer deliveryRange = requestJson.getInteger("deliveryRange");
|
|
|
+ planParam.put("delivery_range", deliveryRange); //投放形式
|
|
|
+ if (deliveryRange == 2) {
|
|
|
+ planParam.put("union_video_type", requestJson.getInteger("deliveryForm")); //投放形式 1:激励视频 2:原生
|
|
|
+ }
|
|
|
+ planParam.put("classify", requestJson.getString("adCategory")); //广告类别
|
|
|
+ planParam.put("projectid", ""); //
|
|
|
+ Integer downloadType = requestJson.getInteger("downloadType");
|
|
|
+ planParam.put("download_type", downloadType); //下载方式 1:下载包 2:h5
|
|
|
+ Long urlId = requestJson.getLong("urlId");
|
|
|
+ BytedanceUrlInfo urlInfo = urlInfoMapper.selectById(urlId);
|
|
|
+ if (downloadType == 1) {
|
|
|
+ planParam.put("download_url", urlInfo.getUrl());
|
|
|
+ planParam.put("package", urlInfo.getPackageName());
|
|
|
+ }
|
|
|
+ if (downloadType == 2) {
|
|
|
+ planParam.put("external_url", urlInfo.getUrl()); // 落地页链接
|
|
|
+ }
|
|
|
+ planParam.put("delivery_range", 1); // 投放范围
|
|
|
+ planParam.put("classify", 5); //广告类别 5 内广
|
|
|
+ planParam.put("projectid", "");
|
|
|
+ planParam.put("localGeolocation", new ArrayList<String>());
|
|
|
+ planParam.put("external_action", 4);
|
|
|
+ planParam.put("open_url", ""); // 应用直达链接
|
|
|
+ planParam.put("style_type", 0);
|
|
|
+ planParam.put("location_type", 4); //受众位置类型
|
|
|
+ planParam.put("hide_if_exists", 0); // 过滤已安装,当推广目标为安卓应用下载时可填,0表示不过滤,1表示过滤,默认为不过滤
|
|
|
+ planParam.put("interest_tag_mode", 0); //兴趣分类
|
|
|
+ planParam.put("token", tokenNode.get("data").get("token").asText());
|
|
|
+ planParam.put("toutiao", 100000005); //头条预估数据
|
|
|
+ planParam.put("aweme", 150000005); //抖音预估数据
|
|
|
+ planParam.put("video_app", 40000005);//西瓜预估数据
|
|
|
+ planParam.put("hotsoon", 40000005); //火山预估数据
|
|
|
+ planParam.put("aweme_account_fans", 0); //账号粉丝相似人群
|
|
|
+ planParam.put("auto_extend_enabled", 0);// 智能放量????
|
|
|
+ planParam.put("budget_mode", requestJson.getIntValue("budgetPriceMode")); // 广告预算类型 0 日预算 1 总预算
|
|
|
+ planParam.put("budget", requestJson.getIntValue("budgetPrice")); //广告预算
|
|
|
+ int scheduleType = requestJson.getIntValue("dateQuantum");
|
|
|
+ planParam.put("schedule_type", scheduleType); //广告投放时间类型 默认1 1:不限 2:按时间???
|
|
|
+ if (scheduleType == 2) {
|
|
|
+ planParam.put("start_time", requestJson.getString("startDate")); //广告投放起始时间
|
|
|
+ planParam.put("end_time", requestJson.getString("endDate"));//广告投放结束时间
|
|
|
+ }
|
|
|
+ planParam.put("week_schedule", new ArrayList<String>()); //投放时段
|
|
|
+ planParam.put("week_time", new ArrayList<ArrayList<Integer>>());//投放时段
|
|
|
+ int pricing = requestJson.getIntValue("pricing");
|
|
|
+ planParam.put("pricing", pricing); //计划出价类型 9 按展示付费 7 按点击付费 8 按转化付费
|
|
|
+ planParam.put("cpa_phrase", 2); //出价为OCPC时,计划处于哪个阶段??
|
|
|
+ planParam.put("is_union_slot", "");
|
|
|
+ planParam.put("hide_if_converted", 1); //过滤已转化用户类型字段,只有转化为目标时可填 优化目标为转化才展示
|
|
|
+ planParam.put("flow_control_mode", requestJson.getIntValue("flowControlMode")); //投放速度/投放方式使用字段
|
|
|
+ if (pricing == 9) {
|
|
|
+ planParam.put("cpa_bid", requestJson.getIntValue("convertPrice"));
|
|
|
+ } else {
|
|
|
+ planParam.put("bid", requestJson.getIntValue("convertPrice"));
|
|
|
+ }
|
|
|
+ planParam.put("smart_bid_type", requestJson.getIntValue("bidType")); //自动出价类型,OCPM支持
|
|
|
+ planParam.put("adjust_cpa", 0); //是否调整自动出价 允许值: "0", "1" 默认值: 0
|
|
|
+ planParam.put("app_bid_ratio", new Object());
|
|
|
+ planParam.put("name", "自动创建测试b" + i); //广计划名称
|
|
|
+ planParam.put("campaign_id", campaignId);
|
|
|
+ String downLoadMode = requestJson.getString("downloadMode");
|
|
|
+ planParam.put("app_type", 201); //app 类型 201 应用推广 安卓 201 应用推广 ios
|
|
|
+ String createResult = HttpUtils2.httpPostRequest("https://ad.oceanengine.com/overture/ad/create/", planParam, header);
|
|
|
+ JSONObject result = JSONObject.parseObject(createResult);
|
|
|
+ System.out.println(result.toJSONString());
|
|
|
+ String status = result.getString("status");
|
|
|
+ String msg = result.getString("msg");
|
|
|
+ if (null != status && !status.equals("success")) {
|
|
|
+ resultMap.put("code", -1);
|
|
|
+ resultMap.put("message", msg);
|
|
|
+ resultMap.put("success", false);
|
|
|
+ return resultMap;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- param5.put("package", requestJson.getString("packageName"));
|
|
|
- param5.put("smart_bid_type", requestJson.getIntValue("bidType")); //自动出价类型,OCPM支持
|
|
|
- param5.put("adjust_cpa", 0); //是否调整自动出价 允许值: "0", "1" 默认值: 0
|
|
|
- param5.put("app_bid_ratio", new Object());
|
|
|
- param5.put("name", "自动创建测试b"); //广计划名称
|
|
|
- param5.put("campaign_id", campaignId);
|
|
|
- param5.put("app_type", 201); //app 类型 201 应用推广 安卓 201 应用推广 ios
|
|
|
- String createResult = HttpUtils.httpPostRequest("https://ad.oceanengine.com/overture/ad/create/", param5, header);
|
|
|
- System.out.println(createResult);
|
|
|
}
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
} finally {
|
|
|
webDriver.quit();
|
|
|
}
|
|
|
- return null;
|
|
|
+ ResultMapUtils.setResultMap(resultMap, StatusCode.COMMON_SUCCESS.getCode());
|
|
|
+ return resultMap;
|
|
|
}
|
|
|
}
|