WordPress.java 10.1 KB
// 修改 WordPress.java 文件,实现 deleteArticle 方法
package com.aigeo.util.article;

import com.aigeo.entity.CreateArticleDTO;
import com.aigeo.entity.UpdateArticleDTO;
import com.alibaba.fastjson2.JSONObject;
import okhttp3.*;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Component
public class WordPress implements ArticlePlatformService {

    private static final OkHttpClient okHttpClient = new OkHttpClient();

    private static final String BASE_URL = "https://web1.szcxybz.com/wp-json/wp/v2/posts";
    private static final String TOKEN_URL = "https://web1.szcxybz.com/wp-json/jwt-auth/v1/token";

    private static String cachedToken = null;
    private static long tokenExpiryTime = 0;
    private static final long TOKEN_REFRESH_BUFFER = TimeUnit.MINUTES.toMillis(5);// 5分钟缓冲

    private static final OkHttpClient httpClient = new OkHttpClient();
    private static final String MEDIA_TYPE = "application/json; charset=utf-8";

    private static final String USERNAME = "admin";

    private static final String PASSWORD = "123456";

    @Override
    public void publishArticle(Object articleData, Integer companyId) {
        // 获取有效的 token
        String token = null;
        try {
            token = getValidToken();
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
//        if (token == null) {
//            System.out.println("无法获取有效的认证 token");
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
//        }
        CreateArticleDTO createArticleDTO = (CreateArticleDTO) articleData;
        String styledContent = createArticleDTO.getBody().replace("<style>", "<!-- Style block will be removed by WordPress -->")
                .replace("</style>", "");
        JSONObject contentObject = new JSONObject();
        contentObject.put("raw", styledContent);
        JSONObject jsonBody = new JSONObject();
        jsonBody.put("title", createArticleDTO.getTitle());
        jsonBody.put("content", contentObject);
        jsonBody.put("status", "publish");
        //jsonBody.put("author", author);

        RequestBody body = RequestBody.create(
                jsonBody.toString(),
                MediaType.get(MEDIA_TYPE)
        );

        Request request = new Request.Builder()
                .url(BASE_URL)
                .post(body)
                .addHeader("Authorization", "Bearer " + token)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
//                System.out.println("响应内容: " + response.body().string());
                String res = response.body().string();
//                return BaseResponse.success(res);
            } else {
                System.out.println("发布失败: " + response.code());
                System.out.println("错误信息: " + response.body().string());
//                return BaseResponse.error(ReturnCodeEnum.ERROR,"发布失败");
            }
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
    }

    @Override
    public void updateArticle(Object articleData, Integer companyId) {
        // 检查参数类型
//        if (!(articleData instanceof UpdateArticleDTO)) {
//            return BaseResponse.error(ReturnCodeEnum.ERROR, "参数类型错误");
//        }
        UpdateArticleDTO updateArticleDTO = (UpdateArticleDTO) articleData;
        // 参数校验
//        if (updateArticleDTO.getId() == null || updateArticleDTO.getId().isEmpty()) {
//            return BaseResponse.error(ReturnCodeEnum.ERROR, "文章ID不能为空");
//        }
        // 获取有效的 token
        String token = null;
        try {
            token = getValidToken();
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
//        if (token == null) {
//            System.out.println("无法获取有效的认证 token");
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
//        }
        // 构建更新文章的URL
        String updateUrl = BASE_URL + "/" + updateArticleDTO.getId();

        // 构建请求体
        JSONObject jsonBody = new JSONObject();

        // 只添加非空字段进行更新
        if (updateArticleDTO.getTitle() != null && !updateArticleDTO.getTitle().isEmpty()) {
            jsonBody.put("title", updateArticleDTO.getTitle());
        }

        if (updateArticleDTO.getBody() != null && !updateArticleDTO.getBody().isEmpty()) {
            String styledContent = updateArticleDTO.getBody().replace("<style>", "<!-- Style block will be removed by WordPress -->")
                    .replace("</style>", "");
            JSONObject contentObject = new JSONObject();
            contentObject.put("raw", styledContent);
            jsonBody.put("content", contentObject);
        }

        // 可选字段
        if (updateArticleDTO.getSummary() != null) {
            jsonBody.put("excerpt", updateArticleDTO.getSummary());
        }

        // 添加状态字段(如果需要)
        jsonBody.put("status", "publish");

        RequestBody body = RequestBody.create(
                jsonBody.toString(),
                MediaType.get(MEDIA_TYPE)
        );

        // 构建PUT请求
        Request request = new Request.Builder()
                .url(updateUrl)
                .put(body)  // 使用PUT方法更新文章
                .addHeader("Authorization", "Bearer " + token)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String res = response.body().string();
//                return BaseResponse.success(res);
            } else {
                System.out.println("更新文章失败: " + response.code());
                System.out.println("错误信息: " + response.body().string());
//                return BaseResponse.error(ReturnCodeEnum.ERROR, "更新文章失败,状态码: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
    }

    @Override
    public void deleteArticle(String articleId, Integer companyId) {
        // 获取有效的 token
        String token = null;
        try {
            token = getValidToken();
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
        if (token == null) {
            System.out.println("无法获取有效的认证 token");
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }

        // 构建删除文章的URL,将文章ID附加到基础URL后面
        String deleteUrl = BASE_URL + "/" + articleId;

        // 构建DELETE请求
        Request request = new Request.Builder()
                .url(deleteUrl)
                .delete()
                .addHeader("Authorization", "Bearer " + token)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String res = response.body().string();
//                return BaseResponse.success(res);
            } else {
                System.out.println("删除文章失败: " + response.code());
                System.out.println("错误信息: " + response.body().string());
//                return BaseResponse.error(ReturnCodeEnum.ERROR, "删除文章失败,状态码: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
//            return BaseResponse.error(ReturnCodeEnum.SYSTEM_ERROR);
        }
    }

    @Override
    public String getPlatform() {
        return "wordpress";
    }

    private static String getValidToken() throws IOException {
        // 检查是否有缓存的 token 且未过期
        if (cachedToken != null && System.currentTimeMillis() < (tokenExpiryTime - TOKEN_REFRESH_BUFFER)) {
            return cachedToken;
        }
        System.out.println("token过期,重新获取token");
        // 获取新 token
        String newToken = fetchNewToken();
        if (newToken != null) {
            cachedToken = newToken;
            // 假设 token 有效期为 24 小时,实际应根据返回的过期时间设置
            tokenExpiryTime = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(2);
        }

        return newToken;
    }

    // 获取新的 JWT token
    private static String fetchNewToken() throws IOException {
        JSONObject loginData = new JSONObject();
        loginData.put("username", USERNAME);
        loginData.put("password", PASSWORD);

        RequestBody body = RequestBody.create(
                loginData.toString(),
                MediaType.get(MEDIA_TYPE)
        );

        Request request = new Request.Builder()
                .url(TOKEN_URL)
                .post(body)
                .addHeader("Content-Type", "application/json")
                .build();

        try (Response response = httpClient.newCall(request).execute()) {
            if (response.isSuccessful()) {
                String responseBody = response.body().string();
                JSONObject tokenResponse = JSONObject.parseObject(responseBody);

                // 实际项目中应该从响应中获取真正的过期时间
                // tokenResponse.getLong("expires_in") 或类似字段

                return tokenResponse.getString("token");
            } else {
                System.out.println("获取 token 失败: " + response.code());
                System.out.println("错误信息: " + response.body().string());
                return null;
            }
        }
    }
}