技术人的眼睛只看可行性,剩下的看写PPT的人

昨天分享了刷赞的基本思路,今天顺便把评论、收藏的思路一并分享下,顺便提供实现下代码。代码基本体现了整合核心逻辑(一击三连),剩下的就是获取别人的登录凭证。
甚至可以做一个PR提升App客户端、web项目、小程序了。这个App、客户端的功能就是负责收集、保活用户的登录凭证,当然没有免费的午餐,这个里面就可以加入分红、运营、接入支持其他网站的PR提升、个人的投票等等了。


前言

找接口的方法这里不想再提了,见上一篇博文。这个就是锻炼大家的眼睛了,哈哈。
实践还是以我最爱的CSDN为例。
下面就分享下接口分析结果截图,以及实现代码一级三连的操作吧。
其实我内心慌的一匹,我还怕被封号呢!但是想想如果有人恶意帮别人提升,导致别人封号了,这怎么说得清楚呢?


一、接口分析

博文列表接口
在这里插入图片描述
博文评论接口
在这里插入图片描述
博文收藏接口
在这里插入图片描述

二、代码实现

1.引入库

这里用小而轻的unirest客户端实现http请求。注意这个依赖httpClient哦。

<!-- 小而而轻的unirest支持,注意它依赖httpClient -->
<dependency>
    <groupId>com.mashape.unirest</groupId>
    <artifactId>unirest-java</artifactId>
    <version>1.4.9</version>
</dependency>

2.一击三连思路

  1. 设置目标用户
  2. 设置源用户登录的凭证cookie
  3. 获取目标用户的博文
  4. 通过源用户凭证循环执行点赞
  5. 通过源用户凭证循环执行评论
  6. 通过源用户凭证循环执行收藏

实现代码:


import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.StopWatch;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;
import java.util.StringJoiner;
import lombok.extern.slf4j.Slf4j;

import org.junit.jupiter.api.Test;

/**
 * @author zhengwen
 **/
@Slf4j
public class UpgradeCsdnLevelTests {
    
    

  @Test
  void UseCookieUp() {
    
    
    log.info("--提升开始--");
    StopWatch sw = new StopWatch();
    sw.start();
    //登录凭证(这块特征需要根据后期接口实际情况分析,万一鉴权机制变化了,要做对应调整)
    String cookie = "";
    int start = cookie.indexOf("UserName=");
    int end = cookie.indexOf("; UserInfo");
    String cookieUser = cookie.substring(start, end).replace("UserName=", "");
    //csdn目标用户
    String csdnUser = "目标用户名";
    //获取博文
    JSONArray blogJsonArr = getUserBlogs(cookie, csdnUser);
    if (CollectionUtil.isNotEmpty(blogJsonArr)) {
    
    
      //点赞
      blogLike(blogJsonArr, cookie, csdnUser);
      //评论
      blogComment(blogJsonArr, cookie, csdnUser);
      //收藏
      blogAddFavorite(blogJsonArr, cookie, csdnUser, cookieUser);
    }

    sw.stop();
    log.info("--所有博文一击三连连总耗时:{}ms--", sw.getTotalTimeMillis());
  }

  /**
   * 点赞
   *
   * @param blogJsonArr 博文数组
   * @param cookie      登录凭证
   * @param csdnUser    目标用户
   */
  private void blogLike(JSONArray blogJsonArr, String cookie, String csdnUser) {
    
    
    String likeUrl = "https://blog.csdn.net//phoenix/web/v1/article/like";
    Unirest.setTimeouts(0, 0);
    if (CollectionUtil.isNotEmpty(blogJsonArr)) {
    
    
      blogJsonArr.stream().forEach(c -> {
    
    
        JSONObject blogJson = JSONObject.parseObject(c.toString());
        String blogName = blogJson.getString("title");
        Long articleId = blogJson.getLong("articleId");
        try {
    
    
          HttpResponse<String> response = Unirest.post(likeUrl)
              .header("Content-Type", "application/x-www-form-urlencoded")
              .header("Cookie", cookie)
              .field("articleId", articleId)
              .asString();
          log.info("--点赞结果:{}", response.getBody());
        } catch (UnirestException e) {
    
    
          log.error("--点赞用户[{}]的博文:{}失败,原因:{}", csdnUser, blogName, e.getMessage());
        }
      });
    }


  }

  /**
   * 添加收藏
   *
   * @param blogJsonArr 博文数组
   * @param cookie      登录cookie凭证
   * @param csdnUser
   * @param cookieUser
   */
  private void blogAddFavorite(JSONArray blogJsonArr, String cookie, String csdnUser,
      String cookieUser) {
    
    
    Unirest.setTimeouts(0, 0);
    String favoriteUrl = "https://mp-action.csdn.net/interact/wrapper/pc/favorite/v1/api/addFavorite";
    if (CollectionUtil.isNotEmpty(blogJsonArr)) {
    
    
      blogJsonArr.stream().forEach(c -> {
    
    
        JSONObject blogJson = JSONObject.parseObject(c.toString());
        String blogName = blogJson.getString("title");
        JSONObject favoriteJson = initFavoriteJson(blogJson, csdnUser, cookieUser);
        try {
    
    
          HttpResponse<String> response = Unirest.post(favoriteUrl)
              .header("Content-Type", "application/json")
              .header("cookie", cookie)
              .body(JSONObject.toJSONString(favoriteJson))
              .asString();
          log.info("---cookie用户:{}收藏用户[{}]的博文:{}--结果:{}", cookieUser, csdnUser, blogName,
              response.getBody());
        } catch (UnirestException e) {
    
    
          log.error("--cookie用户:{}收藏用户[{}]的博文[{}]失败,原因:{}", cookieUser, csdnUser, blogName,
              e.getMessage());
        }
      });
    }

  }

  /**
   * 收藏传参json
   *
   * @param blogJson   博文json
   * @param csdnUser   目标用户
   * @param cookieUser cookie对应用户
   * @return 收藏传参json
   */
  private JSONObject initFavoriteJson(JSONObject blogJson, String csdnUser,
      String cookieUser) {
    
    
    JSONObject favJson = new JSONObject();
    String blogUrl = blogJson.getString("url");
    favJson.put("url", blogUrl);
    favJson.put("source", "blog");
    favJson.put("sourceId", blogJson.getString("articleId"));
    favJson.put("author", csdnUser);
    favJson.put("title", blogJson.getString("title"));
    favJson.put("fromType", "PC");
    favJson.put("username", cookieUser);
    return favJson;
  }

  /**
   * 评论博文
   *
   * @param blogJsonArr 博文数组
   * @param cookie      登录cookie凭证
   * @param csdnUser
   */
  private void blogComment(JSONArray blogJsonArr, String cookie, String csdnUser) {
    
    

    String[] randomComments = new String[]{
    
    "很不错", "帮到了我"};
    String[] tanks = new String[]{
    
    "谢谢", "thanks"};

    Unirest.setTimeouts(0, 0);
    String commnetUrl = "https://blog.csdn.net/phoenix/web/v1/comment/submit";
    if (CollectionUtil.isNotEmpty(blogJsonArr)) {
    
    

      blogJsonArr.stream().forEach(c -> {
    
    
        JSONObject blogJson = JSONObject.parseObject(c.toString());
        String blogName = blogJson.getString("title");
        Long articleId = blogJson.getLong("articleId");
        try {
    
    

          if (articleId != null) {
    
    
            int index = (int) (2 * Math.random());
            StringJoiner sj = new StringJoiner(", ");
            sj.add(blogName).add(randomComments[index]).add(tanks[index]);
            HttpResponse<String> response = Unirest.post(commnetUrl)
                .header("Content-Type", "application/x-www-form-urlencoded")
                .header("cookie", cookie)
                .field("articleId", articleId)
                .field("content", sj.toString())
                .asString();
            log.info("--博文{}评论结果:{}", blogName, response.getBody());
          }
        } catch (UnirestException e) {
    
    
          log.error("--评论用户[{}]的博文”{}“失败,原因:{}", csdnUser, blogName, e.getMessage());
        }
      });
    }


  }

  /**
   * 获取目标用户所有博文
   *
   * @param cookie   登录cookie凭证
   * @param csdnUser 用户名
   * @return 博文数组
   */
  private JSONArray getUserBlogs(String cookie, String csdnUser) {
    
    
    JSONArray jsonArray = new JSONArray();
    int page = 1;
    int pageSize = 100;
    String baseUrl =
        "https://blog.csdn.net/community/home-api/v1/get-business-list?page=[PAGE]&size=100&businessType=blog&noMore=false&username="
            + csdnUser;

    Unirest.setTimeouts(0, 0);
    while (pageSize == 100) {
    
    
      pageSize = -1;
      String blogUrl = baseUrl.replace("[PAGE]", String.valueOf(page));
      try {
    
    
        HttpResponse<String> response = Unirest.get(blogUrl)
            .header("Content-Type", "application/json")
            .header("Cookie", cookie)
            .asString();

        String blogDataStr = response.getBody();
        if (JSONUtil.isJson(blogDataStr)) {
    
    
          JSONObject repJson = JSONObject.parseObject(blogDataStr);
          if (repJson != null && repJson.getJSONObject("data") != null) {
    
    
            JSONArray tmpJsonArr = repJson.getJSONObject("data").getJSONArray("list");
            if (tmpJsonArr != null) {
    
    
              pageSize = tmpJsonArr.size();
              page += 1;
              jsonArray.addAll(tmpJsonArr);
            }
          }
        }
      } catch (UnirestException e) {
    
    
        log.error("---获取用户[{}]的博文失败,原因:{}", csdnUser, e.getMessage());
      }
    }
    return jsonArray;

  }

}

代码没啥特别不好理解的,方法上面有注释,结合上面说的思路一看就懂。
这里说2点:
1、postman现在的code功能好像去掉了HttpClient的支持
2、生成的OkHttp的代码执行结果为空,因为不是主要实现,没具体找原因,有兴趣的可以看看
在这里插入图片描述

3.代码执行效果

点赞:
在这里插入图片描述
评论:
在这里插入图片描述
收藏:
在这里插入图片描述
界面效果:
在这里插入图片描述


总结

  1. 可行性没有问题,可以考虑做个微信APP商业化
  2. 其实可以共赢,比如做成CSDN伴侣,好友可以互相实现全粉,一击三连(其他商业思路自行发散)
  3. 理论上所有的论坛、博客平台都可以通过这个思路实现
  4. 闭源的微信肯定也可以实现
    最后说下,刷提升都是有风险的,你懂的,但是目前看,这没有封住恶意提升,比如跟一个博友故意刷提升个1000000个源用户的一击3连。后果我不知道,这估计得找平台,实际上平台应该也是知道的,其实就看谁模拟的真实,比如控制周期节奏、控制范围、控制提升上限等机制。如果要做XXX伴侣,这些肯定是要考虑的,不能收钱了事情也做了,结果把客户整封号了吧。。。。。。
    技术人,加油。

猜你喜欢

转载自blog.csdn.net/zwrlj527/article/details/122605390