package com.fpcms.scheduled.job;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import com.github.rapid.common.util.DateRange;
import com.github.rapid.common.util.page.Page;
import com.github.rapid.common.util.page.PageQuery;
import com.fpcms.common.blog_post.Blog;
import com.fpcms.common.util.BlogPingUtil;
import com.fpcms.common.util.BlogUtil;
import com.fpcms.common.util.Constants;
import com.fpcms.common.util.RandomUtil;
import com.fpcms.common.util.ThreadUtil;
import com.fpcms.common.webcrawler.htmlparser.HtmlPage.Anchor;
import com.fpcms.model.BlogExternal;
import com.fpcms.model.CmsContent;
import com.fpcms.model.CmsDomain;
import com.fpcms.service.BlogExternalService;
import com.fpcms.service.CmsContentService;
import com.fpcms.service.CmsDomainService;
//@Service
public class ReproducedBlog2ExternalJob extends BaseCronJob{
private static Logger logger = LoggerFactory.getLogger(ReproducedBlog2ExternalJob.class);
private CmsDomainService cmsDomainService;
private CmsContentService cmsContentService;
private BlogExternalService blogExternalService;
public ReproducedBlog2ExternalJob() {
super("0 1 * * * *");
}
public void setCmsDomainService(CmsDomainService cmsDomainService) {
this.cmsDomainService = cmsDomainService;
}
public void setCmsContentService(CmsContentService cmsContentService) {
this.cmsContentService = cmsContentService;
}
public void setBlogExternalService(BlogExternalService blogExternalService) {
this.blogExternalService = blogExternalService;
}
@Override
public void executeInternal() {
List<BlogExternal> blogExternalList = blogExternalService.findAll();
for(int i = 0; i < Math.floor(blogExternalList.size() * 4 / 24); i++) {
BlogExternal be = RandomUtil.randomSelect(blogExternalList);
postBlog(blogExternalList, be);
}
}
private void postBlog(List<BlogExternal> blogExternalList, BlogExternal be) {
if(!be.isEnabled()) {
return;
}
String blogUrl = be.getBlogUrl();
try {
for(int retry = 0; retry < 10; retry++) {
CmsContent cc = findCmsContent();
if(cc == null) continue;
String blogContent = buildBlogContent(blogExternalList, cc);
blogExternalService.postNewBlog(be,new Blog(cc.getTitle(),blogContent));
pingLastNewBlog(blogUrl);
break;
}
ThreadUtil.sleep(1000 * 3);
}catch(Exception e) {
logger.error("error_postNewBlog_on:"+blogUrl+" by_username:"+be.getUsername(),e);
}
}
private static void pingLastNewBlog(String blogUrl) {
List<Anchor> blogLinkList = BlogUtil.getValidBlogLinks(blogUrl, 8);
for(int i = 0; i < blogLinkList.size() && i < 2; i++) {
Anchor a = RandomUtil.randomRemove(blogLinkList);
logger.info("pingLastNewBlog,anchor:"+a);
BlogPingUtil.baiduPing(blogUrl, blogUrl, a.getHref(), "");
}
}
private String buildBlogContent(List<BlogExternal> blogExternalList,
CmsContent cc) {
String blogContent = "原文请查看:" + new Anchor(cc.getUrl()).toString() + "\n<br /> "+cmsDomainService.insertRandomLinks(cc.getContent(),1) +" <br/>\n" ;
// String blogContent = "\n<br /> "+cmsDomainService.insertRandomLinks(cc.getContent(),1) +" <br/>\n" ;
if(RandomUtil.randomTrue(50)) {
try {
BlogExternal randomBe = RandomUtil.randomSelect(getByHasTag(blogExternalList,"needAd"));
List<Anchor> validBlogLinks = BlogUtil.getValidBlogLinks(randomBe.getBlogUrl(),8);
Anchor randomBlogLink = RandomUtil.randomSelect(validBlogLinks);
blogContent += "<br/> "+String.valueOf(randomBlogLink)+" ; ";
}catch(Exception e) {
logger.error("error_on_insert_randomBlogLink into blog:"+cc.getId()+" title:"+cc.getTitle(),e);
}
}
return blogContent;
}
private static List<BlogExternal> getByHasTag(List<BlogExternal> blogExternalList,
String tag) {
List<BlogExternal> result = new ArrayList<BlogExternal>();
for(BlogExternal be : blogExternalList) {
if(be.getTagSet().contains(tag)) {
result.add(be);
}
}
return result;
}
private CmsContent findCmsContent() {
DateRange createdRange = new DateRange(DateUtils.addDays(new Date(),-40),DateUtils.addDays(new Date(),-30));
CmsDomain domain = cmsDomainService.randomSelectDomain();
Page<CmsContent> page = cmsContentService.findPage(new PageQuery(100), "www."+domain.getDomain(), Constants.CHANNED_CODE_NEWS, createdRange);
return RandomUtil.randomSelect(page.getItemList());
}
}