Преглед изворни кода

获取橙子建站站点列表

ZHAOXIAN пре 1 година
родитељ
комит
29704ff97e

+ 87 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/entity/AdvertiserToolsSite.java

@@ -0,0 +1,87 @@
+package cn.com.ctop.job.bytedance.data.entity;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 落地页建站站点对象 advertiser_tools_site
+ *
+ * @date 2025-03-03
+ */
+@Data
+public class AdvertiserToolsSite {
+
+    /**
+     * 建站id
+     */
+    private String siteId;
+
+    /**
+     * 广告主ID
+     */
+    private Long advertiserId;
+
+    /**
+     * 建站名称
+     */
+    private String name;
+
+    /**
+     * 站点缩略图
+     */
+    private String thumbnail;
+
+    /**
+     * 建站状态 AUDIT_ACCEPTED:通过,AUDIT_REJECTED:拒绝,
+     */
+    private String status;
+
+    /**
+     * 建站类型 :UNIVERSAL:默认
+     */
+    private String siteType;
+
+    /**
+     * 建站类别
+     */
+    private String functionType;
+
+    /**
+     * 创建类型 1-橙子建站
+     */
+    private String createType;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    public AdvertiserToolsSite() {
+    }
+
+    public AdvertiserToolsSite(Long advertiserId, String siteId, String thumbnail) {
+        this.advertiserId = advertiserId;
+        this.siteId = siteId;
+        this.thumbnail = thumbnail;
+    }
+
+    public AdvertiserToolsSite(JSONObject data, Long advertiserId, String createType) {
+        this.advertiserId = advertiserId;
+        this.siteId = data.getString("siteId");
+        this.name = data.getString("name");
+        this.thumbnail = data.getString("thumbnail");
+        this.status = data.getString("status");
+        this.siteType = data.getString("siteType");
+        this.createType = createType;
+    }
+}

+ 12 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/ToolsSiteMapper.java

@@ -0,0 +1,12 @@
+package cn.com.ctop.job.bytedance.data.mapper;
+
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserToolsSite;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ToolsSiteMapper {
+
+    void replaceAdvertiserToolsSite(@Param("siteList") List<AdvertiserToolsSite> siteList);
+
+}

+ 29 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/mapper/xml/ToolsSiteMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="cn.com.ctop.job.bytedance.data.mapper.ToolsSiteMapper">
+
+    <insert id="replaceAdvertiserToolsSite">
+        replace into deepthink.advertiser_tools_site(
+        site_id,
+        advertiser_id,
+        name,
+        thumbnail,
+        status,
+        site_type,
+        function_type,
+        create_type
+        )
+        values
+        <foreach collection="siteList" item="item" separator=",">
+            (
+            #{item.siteId},
+            #{item.advertiserId},
+            #{item.name},
+            #{item.thumbnail},
+            #{item.status},
+            #{item.siteType},
+            #{item.functionType},
+            #{item.createType} )
+        </foreach>
+    </insert>
+</mapper>

+ 6 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/IToolsSiteService.java

@@ -0,0 +1,6 @@
+package cn.com.ctop.job.bytedance.data.service;
+
+public interface IToolsSiteService {
+
+    void getToolsSiteStatusList(String accessToken, Long advertiserId, int page);
+}

+ 66 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/service/impl/ToolsSiteServiceImpl.java

@@ -0,0 +1,66 @@
+package cn.com.ctop.job.bytedance.data.service.impl;
+
+import cn.com.ctop.job.bytedance.data.entity.AdvertiserToolsSite;
+import cn.com.ctop.job.bytedance.data.mapper.ToolsSiteMapper;
+import cn.com.ctop.job.bytedance.data.service.IToolsSiteService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.Okhttp3Utils;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class ToolsSiteServiceImpl implements IToolsSiteService {
+    @Autowired
+    private ToolsSiteMapper toolsSiteMapper;
+
+    @Override
+    public void getToolsSiteStatusList(String accessToken, Long advertiserId, int page) {
+        boolean nextPage = false;
+        Map<String, Object> params = new HashMap<>();
+        params.put("advertiser_id", advertiserId);
+        /*
+        SITE_ALL:查询所有
+        SITE_ONLINE:已上线(包括建站状态中:enable,auditAccepted,auditDoing)
+        SITE_OFFLINE:已下线(包括建站状态中:disable,edit)
+        SITE_REJECTED:审核不通过(包括建站状态中:auditRejected)
+        SITE_TRASH:删除或者禁止(包括建站状态中:deleted,auditBanned)
+         */
+        //查询所有
+        params.put("status", "SITE_ALL");
+        params.put("page", page);
+        params.put("page_size", 300);//默认值为10,范围:20~300
+        String url = "https://ad.oceanengine.com/open_api/2/tools/site/get/";
+        JSONObject obj = Okhttp3Utils.bytedanceGetRequest(accessToken, url, params);
+        Integer code = obj.getInteger("code");
+        if (code == 0) {
+            JSONObject data = obj.getJSONObject("data");
+            Integer totalPage = data.getJSONObject("page_info").getInteger("total_page");
+            if (totalPage != 0 && totalPage != data.getJSONObject("page_info").getInteger("page")) {
+                nextPage = true;
+            }
+            List<AdvertiserToolsSite> siteList = new ArrayList<>();
+            JSONArray jsList = data.getJSONArray("list");
+            for (int i = 0; i < jsList.size(); i++) {
+                AdvertiserToolsSite advertiserToolsSite = new AdvertiserToolsSite(jsList.getJSONObject(i), advertiserId, "1");
+                siteList.add(advertiserToolsSite);
+            }
+            if (!Check.isNull(siteList)) {
+                toolsSiteMapper.replaceAdvertiserToolsSite(siteList);
+            }
+        } else {
+            log.error("获取字节小程序列表失败,{}", obj.getString("message"));
+        }
+        if (nextPage) {
+            getToolsSiteStatusList(accessToken, advertiserId, page + 1);
+        }
+    }
+}

+ 159 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/Okhttp3Utils.java

@@ -0,0 +1,159 @@
+package cn.com.ctop.job.bytedance.data.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.MediaType;
+import okhttp3.MultipartBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URLConnection;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件上传
+ */
+@Slf4j
+public class Okhttp3Utils {
+    @Autowired
+    private static Gson gson = new Gson();
+
+    public static JSONObject bytedanceGetRequest(String token, String url, Map<String, Object> paramsMap) {
+        try {
+            StringBuilder postBody = null;
+            if (!Check.isNull(paramsMap)) {
+                postBody = new StringBuilder();
+                for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
+                    if (entry.getValue() == null) {
+                        continue;
+                    }
+                    postBody.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue().toString(),
+                            "utf-8")).append("&");
+                }
+                if (!paramsMap.isEmpty()) {
+                    postBody.deleteCharAt(postBody.length() - 1);
+                }
+            }
+            String urlStr;
+            if (!Check.isNull(postBody)) {
+                urlStr = url + "?" + postBody;
+            } else {
+                urlStr = url;
+            }
+            OkHttpClient client = TrustAllManager.filterSSL();
+            if (Check.isNull(client)) {
+                log.error("过滤SSL失败");
+                return null;
+            }
+            Request request = new Request.Builder()
+                    .url(urlStr)
+                    .method("GET", null)
+                    .addHeader("Access-Token", token)
+                    .build();
+            Response response = client.newCall(request).execute();
+            if (response != null && response.code() == 200) {
+                ResponseBody body = response.body();
+                return JSONObject.parseObject(body.string());
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return null;
+    }
+
+
+    /**
+     * @Description: 实现服务间调用---文件上传
+     */
+    public static JSONObject postUploadFile(String url, JSONObject params, String token) {
+        try {
+            // 创建一个OkHttpClient,并设置sslSocketFactory
+            OkHttpClient client = TrustAllManager.filterSSL();
+            if (Check.isNull(client)) {
+                log.error("过滤SSL失败");
+                return null;
+            }
+            RequestBody requestBody = buildRequestBodyMultipart(params);
+
+            Request request = new Request.Builder()
+                    .url(url)
+                    .method("POST", requestBody)
+                    .addHeader("Access-Token", token)
+                    .build();
+
+            Response response = client.newCall(request).execute();
+
+            // 响应内容数据解析
+            String responseBodyJson = "";
+            if (null != response && response.code() == 200) {
+                responseBodyJson = response.body().string();
+                return JSONObject.parseObject(responseBodyJson, JSONObject.class);
+            } else {
+                log.warn("文件上传失败!!!FailMsg:{}" + responseBodyJson);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public static RequestBody buildRequestBodyMultipart(JSONObject params) throws Exception {
+        MultipartBody.Builder mpBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
+        for (Map.Entry<String, Object> param : params.entrySet()) {
+            if (param.getValue() instanceof File) {
+                File file = (File) param.getValue();
+                addPartToMultiPartBuilder(mpBuilder, param.getKey(), file);
+            } else if (param.getValue() instanceof List) {
+                List list = (List) param.getValue();
+                for (Object item : list) {
+                    if (item instanceof File) {
+                        addPartToMultiPartBuilder(mpBuilder, param.getKey(), (File) item);
+                    } else {
+                        addPartToMultiPartBuilder(mpBuilder, param.getKey(), param.getValue());
+                    }
+                }
+            } else {
+                addPartToMultiPartBuilder(mpBuilder, param.getKey(), param.getValue());
+            }
+        }
+        return mpBuilder.build();
+    }
+
+    private static void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, File file) throws Exception {
+        String fileName = file.getName();
+        FileInputStream fileInputStream = new FileInputStream(file);
+        byte[] byteFileContent = new byte[fileInputStream.available()];
+        fileInputStream.read(byteFileContent);
+        MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file));
+        mpBuilder.addFormDataPart(key, fileName, RequestBody.create(MediaType.parse("application/octet-stream"), byteFileContent));
+    }
+
+    private static void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, Object obj) {
+        RequestBody requestBody;
+        if (obj instanceof String) {
+            mpBuilder.addFormDataPart(key, (String) obj);
+        } else {
+            mpBuilder.addFormDataPart(key, gson.toJson(obj));
+        }
+    }
+
+
+    public static String guessContentTypeFromFile(File file) {
+        String contentType = URLConnection.guessContentTypeFromName(file.getName());
+        if (contentType == null) {
+            return "application/octet-stream";
+        } else {
+            return contentType;
+        }
+    }
+}

+ 49 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/data/utils/TrustAllManager.java

@@ -0,0 +1,49 @@
+package cn.com.ctop.job.bytedance.data.utils;
+
+import okhttp3.OkHttpClient;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+public class TrustAllManager implements X509TrustManager {
+
+    @Override
+    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        // Do nothing, trust all certificates
+    }
+
+    @Override
+    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+        // Do nothing, trust all certificates
+    }
+
+    @Override
+    public X509Certificate[] getAcceptedIssuers() {
+        return new X509Certificate[0];
+    }
+
+    public static OkHttpClient filterSSL() {
+        try {
+            // 创建一个自定义的TrustManager,用于信任所有SSL证书
+            TrustManager[] trustAllCerts = new TrustManager[]{new TrustAllManager()};
+            // 创建一个SSLContext,并设置TrustManager
+            SSLContext sslContext = SSLContext.getInstance("TLS");
+            sslContext.init(null, trustAllCerts, new SecureRandom());
+            // 创建一个OkHttpClient,并设置sslSocketFactory
+            return new OkHttpClient.Builder()
+                    .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]).build();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (KeyManagementException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+}

+ 49 - 0
job-bytedance/src/main/java/cn/com/ctop/job/bytedance/handler/ToolsSiteJob.java

@@ -0,0 +1,49 @@
+package cn.com.ctop.job.bytedance.handler;
+
+
+import cn.com.ctop.job.bytedance.data.service.IToolsSiteService;
+import cn.com.ctop.job.bytedance.data.utils.Check;
+import cn.com.ctop.job.bytedance.data.utils.DateUtils;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+
+/**
+ * 橙子建站定时任务
+ */
+@Slf4j
+@Component
+public class ToolsSiteJob {
+    @Autowired
+    private IToolsSiteService toolsSiteService;
+
+    private static ExecutorService executorService = Executors.newFixedThreadPool(3);
+
+    @XxlJob("getToolsSiteList")
+    public void getToolsSiteList() throws Exception {
+        String param = XxlJobHelper.getJobParam(); // 执行参数
+        if (Check.isNull(param)) {
+            log.error("入参为空");
+            return;
+        }
+        String nowDate = DateUtils.getNowDate("yyyy-MM-dd");
+        String data = DateUtils.getAnotherDay("yyyy-MM-dd", nowDate, -1);
+        String[] s = param.split("_");
+        Long advertiserId = Long.valueOf(s[0]);
+        String accessToken = s[1];
+
+        executorService.submit(new Runnable() {
+            @Override
+            public void run() {
+                toolsSiteService.getToolsSiteStatusList(accessToken, advertiserId, 1);
+            }
+        });
+    }
+
+}