实现随机文章功能的插件:
博客链接:https://cndrew.cn/2019/10/19/plugin/
Github链接: https://github.com/Drew233/hexo-generator-random
欢迎大家使用

在wordpress里面随机文章的实现好像是专门有一个php函数可以获得所有的文章链接然后随机一下。但是html里面似乎是没有类似的,所以我产生了一个神奇的想法。

把我的所有文章链接放进去,然后随机跳转。难点就是所有文章链接怎么搞,如果你的文章少还好说,直接cv就行。但是就像我一样,150+的文章,甚至比我的还多,就会很难受,所以看下去吧,

先总体说一下步骤

  1. 使用python爬取博客所有链接,然后筛选出来文章的链接
  2. 使用html实现随机链接的跳转。

首先我们需要爬取所有链接,直接用python实现就很方便

import requests
from bs4 import BeautifulSoup

def getHTMLText(url):
    '''
    此函数用于获取网页的html文档
    '''
    try:
        #获取服务器的响应内容,并设置最大请求时间为6秒
        res = requests.get(url, timeout = 6)
        #判断返回状态码是否为200
        res.raise_for_status()
        #设置该html文档可能的编码
        res.encoding = res.apparent_encoding
        #返回网页HTML代码
        return res.text
    except:
        return '产生异常'

def main():
    '''
    主函数
    '''
    b=[]
    r=[]
    #目标网页,这个可以换成一个你喜欢的网站
    for i in range (1,16):# 因为直接爬取域名下的不知道为什么会只能爬第一页的,所以这里专门处理一下页数,按照你的页数更改这个16的值
        if i==1:
            url = 'https://cndrew.cn'
        else:
            url = 'https://cndrew.cn/page/'+str(i)
        # print(url)

        demo = getHTMLText(url)

        #解析HTML代码
        soup = BeautifulSoup(demo, 'html.parser')

        #模糊搜索HTML代码的所有包含href属性的<a>标签
        a_labels = soup.find_all('a', attrs={'href': True})


        #获取所有<a>标签中的href对应的值,即超链接
        for a in a_labels:
            # print(a.get('href'))
            b.append(a.get('href'))

    print('Over')
    # for i in b:
    #     print(i)
    print('over')
    for x in b:
        if x not in a:
            a.append(x)
    for i in a:
        print(i)
    # f=open('../out.txt','w')
    # for i in a:
    #     f.write(str(i))
    #     f.write('\n')
    # f.close()

main()

把上面代码中所有的cndrew.cn修改成你的域名,并修改你的page数
然后运行一遍,因为这里输出到文件一直出现中文编码(我这有些中文的链接)的错误,所以写进文件一直出错,如果你的没有的话,可以直接把最下面那几行的注释取消。如果你不知道该取消那些注释或者跟我一样有中文链接,那就跟我一样,直接把运行框里的所有链接复制粘贴出来。

然后你会发现,这里面除了文章的链接还有各种各样的,比如说标签啊,分类啊,甚至是友链啊什么的。手动删就完事了。其实这一步也可以用python甚至是c语言实现,但是太麻烦了,还是手动。你把你想随机链接到的页面留下就行。

所有链接处理好之后,为了在随机的那个html里面的格式,我们可以使用python进行格式的修改

f = open('../out.txt')
flag = 0
res=[]
for line in f.readlines():
    line = line.strip('\n')#取消readline的换行
    s="urls["+str(flag)+"]= \"https://cndrew.cn"
    s+=line+"\";"
    flag=flag+1
    res.append(s)
f=open('../out2.txt','w')#写进文件
for i in res:
    f.write(str(i))
    f.write('\n')
f.close()

这一步其实就是把所有的链接补全,并且直接套用html中需要用到的格式。注意用你的域名替换掉cndrew.cn。

等你上面执行完之后,你的out2.txt里面就是你所需要的所有的连接了,并且是已经套好了html中所需要用到的格式。下一步

<body onload="javascript:dogo();">
<script>
function dogo(){
    var urls = new Array();
    urls[0] = "1.HTML";//
    urls[1] = "2.HTML";//
    urls[2] = "3.HTML";//
    urls[3] = "4.HTML";//
    urls[4] = "5.HTML";//把这里的内容替换掉
    n = Math.floor(Math.random()*5);
    location.href= urls[n];
}
</script>

把你的out2.txt文件中的所有urls[i]=""复制,替换到上面的我带有注释的地方

然后剩下的就是在hexo菜单或者随便你想要的地方添加一个页面。
例如你想在hexo的菜单添加一个页面
首先在../blog/source/中新建一个random文件夹,文件夹的名字是可以自定义的。
然后再这个文件夹中新建一个'index.html'文件,把上面那一步的html代码复制粘贴过来,在最前面加上layout:false.

---
layout: false
---
<body onload="javascript:dogo();">
<script>
function dogo(){
    var urls = new Array();
    urls[0] = "1.HTML";//
    urls[1] = "2.HTML";//
    urls[2] = "3.HTML";//
    urls[3] = "4.HTML";//
    urls[4] = "5.HTML";//把这里的内容替换掉
    n = Math.floor(Math.random()*5);
    location.href= urls[n];
}
</script>

然后每次你新建一个文章,在你的random目录下的index.html中就新加一个链接就行了。

至此,这个功能就添加完成了,其实这只是个无脑暴力的做法,还是期待大佬们做出来直接封装好的插件之类的东东。

点我尝试随机文章