package com.walker.wxtools.spider;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.walker.infrastructure.utils.JsonUtils;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.wxtools.AccountArticle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
/**
* 公众号文章列表获取。
*
该方法需要获得登录信息,需要外部传入cookie等参数,从浏览器network中复制,header,parameter即可。
*
* 1) 需要登录一个公众号,谁的都可以;
* 2) 在图文列表中,找到一个,点击编辑
* 3) 进入编辑界面,点击编辑器上面的'超链接'按钮,会弹出选择链接界面
* 4) 此时可以选择'其他公众号',搜索"河南邮政微邮局",这时就能查询出来公众号的文章列表
* 5) 浏览器调试模式,能看到请求的参数,此时复制:header/ parameter部分到文本编辑器中。(前缀带:号的不要)
* 6) 把复制的内容设置到对象中,调用方法:setCookieAndParameter('内容', '\n'),分隔符可以根据实际情况定。
*
* @author 时克英
* @date 2023-04-26
*/
public class AccountArticleSpider {
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
public List request() throws RequestException {
HttpHeaders headers = new HttpHeaders();
headers.add("accept", "*/*");
headers.add("accept-language", "zh-CN,zh;q=0.9,en;q=0.8");
headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36");
headers.add("x-requested-with", "XMLHttpRequest");
headers.add("cookie", this.cookie);
headers.add("referer", this.referer);
HttpEntity request = new HttpEntity<>(null, headers);
// URL
StringBuilder urlObj = new StringBuilder(URL);
urlObj.append(StringUtils.CHAR_AND).append("fakeid=").append(fakeId);
urlObj.append(StringUtils.CHAR_AND).append("token=").append(token);
urlObj.append(StringUtils.CHAR_AND).append("begin=").append(begin);
urlObj.append(StringUtils.CHAR_AND).append("count=").append(count);
try{
// this.restTemplate.g
ResponseEntity response = this.restTemplate.exchange(urlObj.toString(), HttpMethod.GET, request, String.class);
if(response.getStatusCodeValue() == 200){
logger.info("成功抓取一次: " + response.getBody());
ObjectNode data = JsonUtils.jsonStringToObjectNode(response.getBody());
// 判断返回是否错误响应
JsonNode baseResp = data.get("base_resp");
int ret = baseResp.get("ret").intValue();
logger.info("-----------> ret = " + ret);
if(ret != 0){
logger.warn("没有返回数据,说明返回的异常响应:{}", baseResp.textValue());
throw new RequestException(true, response.getBody(), null);
}
//
if(data.get("app_msg_cnt").intValue() <= 0){
logger.info("app_msg_cnt <= 0,没有返回任何数据");
return null;
}
String arrays = data.get("app_msg_list").toString();
logger.debug(arrays);
ArrayNode arrayNode = JsonUtils.toJsonArray(arrays);
List resulList = new ArrayList<>(8);
if(arrayNode != null && arrayNode.size() > 0){
JsonNode jsonNode = null;
AccountArticle article = null;
for(int i=0; i