内容分享:文章采集软件,全自动文章采集,一键采集发布
优采云 发布时间: 2022-11-18 00:39文章采集软件,主要功能是帮助站长采集 网站的文章资源上网,然后发布到指定的cms,获取点击,站长可以自定义采集对象,自由设置采集规则,采集效率也很稳定。文章采集网站站长软件,可以使用它自动采集目标站点的文字,提供相似词替换功能,还支持站长自定义关键词替换,有效提升文章伪原创的知名度,让采集的内容质量更高。
文章采集软件让网站内容不断更新,主要体现站点持续发展和不断完善的基本条件,无论网站是否面向搜索引擎或用户组。需要不断地创造或容纳更多的内容,不断地扩大网站的体量,这样站点才能吸引更多的关注。其中,网站文章的更新频率较高,而收录的更新量较低。网站不是收录是什么意思,快照不更新,但是网站一直在频繁更新,但是收录速度慢,没有排名,这种现象一般来说,站长将更换三大标签,更换网站模板。
对于网站,文章采集软件保持一定的文章更新频率,主要体现在提高蜘蛛的活跃度,促进网站收录,加快网站参与排行榜的步伐。排行榜如战场,落后必败。一个更新频率稳定、文章质量高、网站布局良好、关键词设置标准的站点,将对SEO优化产生深远的影响。毕竟对于SEO来说,文章采集软件推广网站,主要表现就是思考和排名。当一个站点保持一定的更新频率时,网站或网站收录的情况会比同时启动的站点高一级以上。
文章采集 通过软件进行页面优化是确保网站上的实际代码和内容得到优化的过程。这包括确保网站管理员的站点具有正确的标题标签、描述标签和独特的内容。正确地构建数据结构也很重要,以便搜索引擎可以轻松读取数据。页外优化是建立指向您网站的外部链接的过程。最好的方法是让 文章采集 软件在网站管理员的 网站 的相关页面上找到实际链接,这是真实的内容,具有正确的行业相关 网站 并在所有主要社交媒体 网站 和目录中列出。
的
文章采集虽然软件是采集或伪原创其他网站文章,但都是经过挑选和有效推送的,不仅仅是单纯的采集。文章采集虽然采集的软件是采集,但是文章的质量还是可以让用户满意的,毕竟它擅长采集。
文章采集软件通过自然手段对网站进行排名并不难,主要是SEO需要花更多的精力充实自己和网站,post 文章当然可行,但主要还是看你怎么发,发什么内容。文章采集本站软件的优化主要克服了网站网站前期的困难,大幅提升了网站的整体和谐度,不漫长的优化之路。修整,当然不代表没有修整,只是不适合前期不断的变化。
免费获取:java微信公众号授权登录
文末附上源码,也可以先将依赖拷贝到自己的项目中。内容参考郑清博客-CSDN博客
一、微信中的几个概念
如果你要做微信相关的开发,首先要了解几个概念,明确你要做的事情:
(一)微信公众平台和微信开放平台
开放平台:;公共平台:
我们可以分别看看两者的官网,先看看开放平台
微信开放平台就是微信把自己的服务对外开放。比如你的网站要授权网页登录,你需要到开放平台,在开放平台注册你的网站;再比如实现微信分享,采集夹,使用微信支付,也需要去开放平台。这里的重点是你的应用需要使用微信的服务。
其实开放平台也包括公众平台的入口,就是公众号的开发。点击后进入公众平台。公众平台官网如下:
公众平台要做的就是让大家(普通人和开发者)更好的使用微信自己的产品,服务号、订阅号、小程序、企业微信。所谓更好的使用,就是帮助我们使用它们,使它们满足我们的需要。比如对于普通人来说,想让订阅号发布内容,设置自动回复等等。比如对于开发者来说,想要使用公众号回复更个性化的内容,给网页授权等等,网页授权是指在公众号中打开网页,在网页中可以获取到微信用户的信息,这一点与上面提到的第三方不同。与使用微信授权登录不同。公众号中的授权只能在微信客户端使用。但其实本质上几乎是一样的,都是获取微信用户的信息。
在这里我们可以知道,利用订阅号、服务号、企业微信、小程序实现个性化业务需要公共平台。这里的重点是你必须直接使用微信产品。
(二)公众号
公众号是一个总称。通常我们指的是订阅账号和服务账号。订阅月是我们微信里合起来的公众号,服务号就是聊天页面上那些单独的公众号。但是也包括微信小程序和企业微信,比如你想用企业微信管理员工,开发小程序。
(3)appID、appsecret、openID、unionID(来自微信公开文档)
ID名称说明
应用ID
- AppID是不同类型产品的账号ID,是账号的唯一标识。
- 例如公众号的AppID、小程序的AppID、开放平台的AppID、第三方平台的AppID、移动应用的AppID、网站应用的AppID、小店的AppID等。
openid
- openid为微信用户在不同类型产品中的身份标识。
- 微信用户在访问公众号、小程序、手机应用、网站应用、小店等时会有唯一的openid,但同一个微信用户在访问不同产品时会生成不同的openid。- 比如不同的公众号,同一个用户的openid是不同的;同样,对于不同的小程序,同一个用户的openid也是不同的
联合号
- unionid为微信用户产品在同一开放平台下的身份标识。
- 如果开发者有多个移动应用、网站应用和公众号(即公众号和小程序),可以使用UnionID来区分用户的唯一性,因为只要在同一个微信开放平台下account 对于移动应用、网站应用和公众账号,用户的UnionID是唯一的。即同一个用户在同一个微信开放平台下的不同应用拥有相同的UnionID。
(4)代码,access_token:
access_token是微信接口调用凭证,微信是如何为我们提供功能和服务的呢?自然是通过接口,微信的接口调用需要凭据,也就是access_token
code:在某些场景下,主要是用户的认证和授权。如何保证用户真正获得授权就是代码。用户同意授权后会得到一个code。通过这段代码可以获取到access_token来使用微信接口。
2.微信公众号模式
微信公众号有两种开发模式:(图片来自微信公众号开发(一)微信接入认证成为开发者)
这位老者的照片,已经说的很清楚了。其实公众有两种,普通人和开发者,如何更好的使用公众号。
既然是微信公众号的开发,那么自然要讨论第二种模式。
三、开发前的准备工作
(一)获取公众号
测试公众号申请地址
既然我们要开发公众号,那么我们首先要有一个公众号。当然,如果您觉得注册麻烦,或者已经有公众号却无法使用,您也可以申请一个测试公众号,如下图:
(2)映射自己电脑的80端口
也就是做内网穿透,让微信服务可以访问你电脑的服务。这里推荐使用ngrok()。使用ngrok非常简单。注册登录后,选择Tunnel Management - Open Tunnel。免费,但需要2元实名认证费。填写配置并打开。注意必须是80端口。
然后下载客户端,按照文档中的命令启动即可。启动后,我们可以看到如下界面:
从外网访问会请求本机的80端口。
3. 开发者认证
对微信公众号的开发有了一定的了解,做了一些准备之后,就开始写代码了。这里我们使用java来演示创建一个spring-boot项目。
根据上图,我们知道需要自己搭建一个服务器,然后在自己的服务中通过微信服务器给用户发送消息。同时,用户也通过微信服务器向我们的服务器请求服务,所以我们首先要让微信知道我们的服务器可以同时访问我们的服务(所以需要映射80出来)。作为开发者在认证这一步要做的就是让我们的服务和微信服务器互相认识。
(1)创建springboot项目,新建controller
添加以下代码:
@RestController
@RequestMapping("/api/weixin/index")
@Api(tags = "微信 - 接口")
public class IndexController {
// TODO 这里的token是微信公众平台上自己所配的!
private static final String token = "zhengqing";
@Autowired
private MsgService msgService;
/**
* 处理微信认证:验证服务器地址的有效性,get提交
* signature: 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
* timestamp 时间戳
* nonce: 随机数
* echostr: 随机字符串
*/
@GetMapping
public void checkSignature(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("============= 处理微信认证 ===============");
// 拿到微信的请求参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
// ① 将token、timestamp、nonce三个参数进行字典序排序 b a d c h ==>a b c d h
String[] strArr = {token, timestamp, nonce};
// 字典排序
Arrays.sort(strArr);
// ② 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuffer sb = new StringBuffer();
// 字符串拼接
for (String str : strArr) {
sb.append(str);
}
// 加密
String sha1Str = SecurityUtil.sha1(sb.toString());
// ③ 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (sha1Str.equals(signature)) {
// 如果相等,就是来自微信请求
// 若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效
response.getWriter().println(echostr);
}
}
}
SecurityUtil代码
public class SecurityUtil {
public static String sha1(String str) {
try {
StringBuilder sb = new StringBuilder();
MessageDigest digest = MessageDigest.getInstance("sha1");
// 放入加密字符串
digest.update(str.getBytes());
// 进行加密
byte[] digestMsg = digest.digest();
// byte转换16进制
for (byte b : digestMsg) {
sb.append(String.format("x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return str;
}
}
(2)配置端口号
(3) 启动项目
(4)在测试账号页面填写公众号配置信息
提交,说明配置成功。
4.通过接口自定义微信公众号中的菜单
有测试公众号,点击关注进入发现,里面没有菜单。公众号的菜单可以直接在官方平台设置,也可以在我们的服务中调用微信接口。
(1)第一步,查看微信自定义菜单的文档:微信打开文档-自定义菜单()
(2)第二步,我们可以先使用微信公众平台界面调试工具中的界面()感受一下
优先获取access_token
的
然后设置菜单:
菜单项(注意微信文档中测试菜单中有小程序的url,需要删除)
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"搜索",
"url":"http://www.soso.com/"
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
这样,把测试公众号解封,再重新关注,就可以看到菜单的变化了。
(3)自己写代码
首先获取access_token,创建WeixinService接口及其实现类,MenuService及其实现类,如图
WerixinServiceImpl 实现类代码:
@Service
public class WeixinServiceImpl implements WeixinService {
@Autowired
private RestTemplate restTemplate;
@Override
public AccessTokenVO getAccessToken(String appId, String appSecret) {
AccessTokenVO accessTokenVO = restTemplate.getForObject(Constants.GET_ACCESS_TOKEN_URL.replace("APPID", appId).replace("APPSECRET", appSecret), AccessTokenVO.class);
return accessTokenVO;
}
}
AccessTokenVO代码
@Data//lombok注解
public class AccessTokenVO {
@ApiModelProperty(value = "获取到的凭证")
private String access_token;
@ApiModelProperty(value = "凭证有效时间,单位:秒(微信目前暂7200秒,即2小时,过期后需再次获取)")
private int expires_in;
}
微信响应结果码
@Data
public class WeixinResponseResult {
@ApiModelProperty(value = "响应码")
private int errcode;
@ApiModelProperty(value = "响应消息")
private String errmsg;
}
常量代码
public class Constants {
/**
* TODO 填写自己的 `appID` 和 `appsecret`
*/
public static final String APP_ID = "xxxx";
public static final String APP_SECRET = "xxxx";
/**
* 通过 `GET请求方式` 获取 `access_token`
*/
public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
* TODO 只做临时方便测试使用
*/
public static final String ACCESS_TOKEN = "55_Nm9XUj_ZM-yHUt10mHEZ4BRMuXt-Dlm33pOWcycHy_EfAPlTB7Wd6-j01Hw0VwrqNARbm1jQzro4J1FGhpney0uu6H-7d3ajFM6Vd-85oJ7R6MgY29HlsRQ4cDB63yH1dTqbVrTBulzKnHhxGVAbAAANCH";
/**
* 查询菜单接口 - GET请求
*/
public static final String GET_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN";
/**
* 删除菜单接口 - GET请求 (注意,在个性化菜单时,调用此接口会删除默认菜单及全部个性化菜单)
*/
public static final String DELETE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN";
/**
* 创建菜单接口 - POST请求
*/
public static final String CREATE_MENU_URL = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
/**
* 用户认证
*/
public static final String AUTH_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
/**
* 用户认证重定向url
*/
public static final String AUTH_REDIRECT_URI = "http://iwat.free.idcfengye.com/api/weixin/basic/getOpenId";
/**
* 获取用户openid和token
*/
public static final String AUTH_GET_ACCESS_TOKEN_AND_OPENID = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/**
* 根据token和openid获取用户信息
*/
public static final String AUTH_GET_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
/**
* 刷新token
*/
public static final String AUTH_REFRESH_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN";
/**
* 检查token是否有效
*/
public static final String AUTH_CHECK_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID";
/**
*
*/
public static final String CONTENT_TYPE = "";
}
下面开始测试,代码如下
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloWechatDepApplication.class)
class HelloWechatDepApplicationTests {
@Autowired
private RestTemplate restTemplate;
@Autowired
private WeixinService weixinService;
@Test // 获取 `access_token`
public void getAccessToken() throws Exception {
//AccessTokenVO accessTokenVO = weixinService.getAccessToken(Constants.APP_ID, Constants.APP_SECRET);
AccessTokenVO accessTokenVO = weixinService.getAccessToken(Constants.APP_ID, Constants.APP_SECRET);
log.info("======================================== \n" + accessTokenVO.getAccess_token());
}
@Test // 获取 创建菜单
public void createMenu() throws Exception {
String menu = "{\n" +
" \"button\":[\n" +
" {\t\n" +
" \"type\":\"click\",\n" +
" \"name\":\"今日歌曲\",\n" +
" \"key\":\"V1001_TODAY_MUSIC\"\n" +
" },\n" +
" {\n" +
" \"name\":\"菜单\",\n" +
" \"sub_button\":[\n" +
" {\t\n" +
" \"type\":\"view\",\n" +
" \"name\":\"搜索\",\n" +
" \"url\":\"http://www.soso.com/\"\n" +
" },\n" +
" {\n" +
" \"type\":\"miniprogram\",\n" +
" \"name\":\"wxa\",\n" +
" \"url\":\"http://mp.weixin.qq.com\"\n" +
" },\n" +
" {\n" +
" \"type\":\"click\",\n" +
" \"name\":\"赞一下我们\",\n" +
" \"key\":\"V1001_GOOD\"\n" +
" }]\n" +
" }]\n" +
" }";
String jsonMenu = JSONUtil.toJsonStr(menu);
WeixinResponseResult result = restTemplate.postForObject(Constants.CREATE_MENU_URL.replace("ACCESS_TOKEN", "上一步中获取的token"), jsonMenu, WeixinResponseResult.class);
System.out.println(result);
}
}
5.微信模板消息
微信模板消息文档:微信公众平台|模板消息()
所谓模版消息就是消息的一种,收录预留字段,我们可以动态设置内容,主要用于业务通知,例如:我们微信收到的此类消息
(1)模板消息测试前,我们首先需要定义一个模板,在测试号网页的消息模板中添加消息模板
模板说明:
{{first.DATA}}
申请人:{{keyword1.DATA}}
申请进度:{{keyword2.DATA}}
申请时间:{{keyword3.DATA}}
提交人:{{keyword4.DATA}}
{{remark.DATA}}
{{xxx.DATA}}中的内容为保留字段,可以在接口中指定值,必须以{{first.DATA}}开头,以{{remark.DATA}}结尾,还必须中间是xxx.DATA
(2) 测试
首先以创建菜单时获取token的方法为例获取access_token
然后在postman中测试,如下图
网址:
请求正文内容:
{
"touser": "oC0So6FyAWhsDSzm80m2xrMzw98E", //用户的openID
"template_id": "sTLSPG7UgzYfhtWnGcFo5rE9QLZSuRU9FSN-xFYnKoM", //模板消息的模板id
"url": "https://www.bilibili.com/", //点击消息跳抓的url
"data": {
"first": {
"value": "您有一条新消息", //渲染到{{first.DATA}}
"color": "#173177"
},
"keyword1": {
"value": "林一", //{{keyword1.DATA}}
"color": "#1731FF"
},
"keyword2": {
"value": "待审批", //{{keyword2.DATA}}
"color": "#1731FF"
},
"keyword3": {
"value": "2038-13-01 12:12:12", //{{keyword3.DATA}}
"color": "#1731FF"
},
"keyword4": {
"value": "秦安", //{{keyword4.DATA}}
"color": "#1731FF"
},
"remark": {
"value": "希望您尽快审批", //{{remark.DATA}}
"color": "#173177"
}
}
}
总结:看完创建菜单和消息模板,有些朋友可能会有些迷茫。创建菜单和消息模板与开头提到的微信服务器认证无关。是的,确实和这两点没有关系,但是如果要实现用户在公众号发消息,动态回复消息,我就不忍对微信服务进行鉴权了,主要是根据需求,这里只是演示。但是下面会用到。
6. 公众号网页授权
网页授权文档:微信开放文档|公众号网页授权,结合微信文档
公众号网页授权是指用户点击公众号中的授权链接。用户同意后,即可获取用户的微信信息。比如微信信息可以完成一些特定的服务。比如在微信公众号的菜单中进入某个网页,在网页上显示微信用户信息等等。
(1)首先我们需要填写一个微信回调域名(可以在测试号中填写IP+端口),以便微信认证后重定向我们填写的回调地址
在考号页面修改:
填写:
用户授权是点击下面的微信链接,链接含义如下
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
解析:
1、scope
以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
2、appid
公众号的appid
3、redirect_uri
认证后微信回访问的地址,这里我们可以写接口地址,或者写一个页面地址都可以,因为用户认证之后微信就会访问它。
例如填写http://119.345.9.10:5500/sys/getopenid,认证成功后为微信就会调用http://119.345.9.10:5500/sys/getopenid?code=xxxxxx;
填写http://119.345.9.10:5500/show.html,认证成功后为微信就重定向到页面http://119.345.9.10:5500/show.html?code=xxxxxx,携带者code参数
注意:这里的回调地址必须是外网可以访问的,因为微信服务器要想访问就必须能够访问到这个地址。所以这里可以使用微信授权第一步做的内网穿透,测试号页面的回调地址可以写如下域名。
(2) 正式开始我们的认证流程
一、在微信测试账号页面填写回调地址的域名
(3)在WeixinService接口中增加一个新的方法
WeixinServiceImpl代码
@Override
public void getOpenId(HttpServletRequest request, HttpServletResponse response) {
String code = request.getParameter("code");
String state = request.getParameter("state");
log.debug("======================================= \n code值:" + code);
String responseContent = restTemplate.getForObject(Constants.AUTH_GET_ACCESS_TOKEN_AND_OPENID
.replace("APPID", Constants.APP_ID)
.replace("SECRET", Constants.APP_SECRET)
.replace("CODE", code), String.class);
JSONObject result = JSONUtil.parseObj(responseContent);
String accessToken = result.getStr("access_token");
String openid = result.getStr("openid");
String refreshToken = result.getStr("refresh_token");
log.debug("======================================= \n access_token值:" + accessToken + "\n openid值:" + openid);
//这里要修改为你自己的域名
String redirectUrl = "http://iwat.free.idcfengye.com/api/weixin/basic/getUserInfo?openid=" + openid + "&access_token=" + accessToken;
try {
// 授权之后重定向到指定URL(这里是跳转到获取用户基本信息接口)
response.sendRedirect(redirectUrl);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public WeixinUserInfoVO getUserInfo(String openId, String accessToken) {
WeixinUserInfoVO weixinUserInfoVO = null;
String responseContent = restTemplate.getForObject(Constants.AUTH_GET_USER_INFO
.replace("ACCESS_TOKEN", accessToken)
.replace("OPENID", openId), String.class);
weixinUserInfoVO = JSONUtil.toBean(responseContent, WeixinUserInfoVO.class);
return weixinUserInfoVO;
}
添加微信控制器
微信控制器代码如下
@Slf4j
@RestController
@RequestMapping("/api/weixin/basic")
@Api(tags = "微信授权 - 接口")
public class WeixinController extends BaseController {
@Autowired
private WeixinService weixinService;
@GetMapping(value = "/getOpenId"/*, produces = Constants.CONTENT_TYPE*/)
@ApiOperation(value = "回调地址获取code换取access_token和openid", httpMethod = "GET", response = ApiResult.class, notes = "回调地址获取code换取access_token和openid")
public ApiResult getOpenId(HttpServletRequest request, HttpServletResponse response) {
weixinService.getOpenId(request, response);
return ApiResult.ok("回调地址获取code换取access_token和openid成功!");
}
@GetMapping(value = "/getUserInfo"/*, produces = Constants.CONTENT_TYPE*/)
@ApiOperation(value = "获取用户基础信息", httpMethod = "GET", response = ApiResult.class, notes = "获取用户基础信息")
public ApiResult getUserInfo(@RequestParam("openid") String openid, @RequestParam(value = "access_token", required = false) String accessToken) {
WeixinUserInfoVO result = weixinService.getUserInfo(openid, accessToken);
return ApiResult.ok("获取用户基础信息成功!", result);
}
}
(4)修改用户菜单
在菜单测试中,修改菜单内容如下。
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"name":"菜单",
"sub_button":[
{
"type":"view",
"name":"测试网页授权",
"url":"https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的APPID&redirect_uri=iwat.free.idcfengye.com/api/weixin/basic/getOpenId&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect "
},
{
"type":"miniprogram",
"name":"wxa",
"url":"http://mp.weixin.qq.com"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
解开公众号,重新关注,菜单会刷新,可以测试。
源码:hello-wechat-dev:学习微信公众号相关开发()
如有不足,敬请指正!