桌面壁纸实时展示粉丝数(CSDN)

news2024/11/14 10:23:58

最近csdn偶尔就又有几个同学关注我,觉得很有动力!于是我想能在任何时候的桌面壁纸,都能看到csdn粉丝数以及显示他们的昵称,我觉得会很有意义!

下面展示效果,(「・ω・)「嘿

桌面壁纸实时展示粉丝数(CSDN)

分为如下几步

文章目录

      • 一,爬取csdn粉丝数和粉丝昵称
        • 爬粉丝数
        • 爬粉丝昵称(最新前五个)
      • 二,生成自定义壁纸
        • python生成自定义图片,并保存
        • 再将图片设置成壁纸
      • 三,完成实时更新(动态展示)
      • 四,相关代码地址

一,爬取csdn粉丝数和粉丝昵称

爬粉丝数

首先和粉丝数目有关的请求,qq_45722494是csdn的用户名

https://blog.csdn.net/qq_45722494/article/list/

image-20221216205000585

发现了粉丝数目是直接镶嵌到html里面的,直接用get方式拿到

# 请求头,只需要User-Agent就行
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400'
}
# 获取粉丝数的函数
def get_fans_number():
    # 发起请求
    resp=requests.get("https://blog.csdn.net/qq_45722494/article/list/",headers=headers)
    # resp=requests.get("https://liangyuanshao.blog.csdn.net/article/list/",headers=headers)
    # 通过正则表达式匹配粉丝数,比较简洁
    fans_num=re.search('<span class="count" id="fan">(.*?)</span></dt>',resp.text).group(1)
    # 输出正确
    print("粉丝数",fans_num)
    return fans_num

输出正确

爬粉丝昵称(最新前五个)

粉丝信息通过这个接口来获取,pageSize我只弄了5个,按照自己的需求来

https://blog.csdn.net/community/home-api/v2/get-fans-list?page=1&pageSize=5&id=0&noMore=false&blogUsername=qq_45722494

需要从下面的json里面提取信息

{'code': 200, 'message': 'success', 'traceId': '24c12f9b-3075-4d68-adad-b39d8d87763b', 'data': {'list': [{'username': 'Bzmer', 'nickname': 'BBenjaminn', 'userAvatar': 'https://profile.csdnimg.cn/D/F/1/3_bzmer', 'blogUrl': 'https://blog.csdn.net/Bzmer', 'loginUserNameIsFollow': False, 'blogExpert': False, 'briefIntroduction': '个人网站:sigmod.coms.hk', 'id': 146750018}, {'username': 'm0_62902789', 'nickname': 'm0_62902789', 'userAvatar': 'https://profile.csdnimg.cn/2/F/F/3_m0_62902789', 'blogUrl': 'https://blog.csdn.net/m0_62902789', 'loginUserNameIsFollow': False, 'blogExpert': False, 'briefIntroduction': None, 'id': 146749679}, {'username': 'xujham', 'nickname': 'kkk@ynu', 'userAvatar': 'https://profile.csdnimg.cn/F/5/8/3_xujham', 'blogUrl': 'https://blog.csdn.net/xujham', 'loginUserNameIsFollow': False, 'blogExpert': False, 'briefIntroduction': None, 'id': 146711649}, {'username': 'huitaiter123', 'nickname': 'huitaiter123', 'userAvatar': 'https://profile.csdnimg.cn/4/1/3/3_huitaiter123', 'blogUrl': 'https://blog.csdn.net/huitaiter123', 'loginUserNameIsFollow': False, 'blogExpert': False, 'briefIntroduction': None, 'id': 146646263}, {'username': 'qq_56005252', 'nickname': '朝朝暮暮635', 'userAvatar': 'https://profile.csdnimg.cn/2/E/7/3_qq_56005252', 'blogUrl': 'https://blog.csdn.net/qq_56005252', 'loginUserNameIsFollow': False, 'blogExpert': False, 'briefIntroduction': None, 'id': 146625839}]}

下面是获取的函数,我采用了jsonpath来从json里面提取信息,非常的方便,或者直接for循环提取出nickname也是可以的。最后返回一个列表就行

import jsonpath
def get_fans_name():
    resp=requests.get("https://blog.csdn.net/community/home-api/v2/get-fans-list?page=1&pageSize=5&id=0&noMore=false&blogUsername=qq_45722494",headers=headers)
    checkurl = "$.data.list[*].nickname"
    # print(resp.json())
    nickname_list=jsonpath.jsonpath(resp.json(),checkurl)
    return nickname_list
    # print(nickname_list) ['BBenjaminn', 'm0_62902789', 'kkk@ynu', 'huitaiter123', '朝朝暮暮635']
get_fans_name()

二,生成自定义壁纸

python生成自定义图片,并保存

image-20221216222541154

如何生成自定义图片,参考的是何三笔记源码,我是在其基础上改了一下,生成了图片,并把其保存到了本地(同目录下)

先用python生成图片,并保存到本地,不做过多解释了,自己该参数,就能改成想要的效果。

import re
from io import BytesIO
import requests
from PIL import Image,ImageDraw,ImageFont

class H3blogDrow:
    '''自定义图片样式'''
    def __init__(self) -> None:
        self.width = 1920
        self.heigth = 1080
        self.background_img = ''
        self.background_color = (42, 41, 55)
        self.layers = []
        self.convas = None

    def parse_config(self, config: dict) -> None:
        c = config
        self.convas = None
        self.width = c.get('width', 1920)
        self.heigth = c.get('height', 1080)
        self.background_color = tuple([int(i) for i in c.get('background_color', '').split(',')])
        self.background_img = c.get('background_img', (42, 41, 55))

        layers = c.get('layers', None)
        if not layers:
            return
        self.layers.extend(layers)

    def _create_canvas(self) -> None:
        self.convas = Image.new('RGB', (self.width, self.heigth), self.background_color)


    def draw(self) -> Image:
        '''画图'''
        # 创建背景设置画布
        self._create_canvas()

        if self.background_img and len(self.background_img) > 0:
            regex = re.compile(
                r'^(?:http|ftp)s?://' # http:// or https://
                r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' #domain...
                r'localhost|' #localhost...
                r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
                r'(?::\d+)?' # optional port
                r'(?:/?|[/?]\S+)$', re.IGNORECASE)
            m = re.match(regex, self.background_img)
            bg_img = None
            if m :
                resp = requests.get(self.background_img)
                _img_bytes = BytesIO()
                _img_bytes.write(resp.content)
                bg_img = Image.open(_img_bytes)
            else:
                #创建背景图片
                bg_img = Image.open(self.background_img)
            #将背景图片写入画布
            self.convas.paste(bg_img, (0,0))

        for layer in self.layers:
            if layer.get('layer_type') == 'text':
                self._draw_text(layer)
            if layer.get('layer_type') == 'image':
                self._draw_image()

        return self.convas

    def _darw_image(self, layer: dict) -> None:
        pass

    def _draw_text(self, layer: dict) -> None:
        draw = ImageDraw.Draw(self.convas)
        _font = layer.get('font')
        font = ImageFont.truetype(_font.get('font'), _font.get('size', 36))
        align = layer.get('align')
        p = tuple()
        if align and align == 'center':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = ((self.convas.width - f_w)/2, (self.convas.height - f_h)/2)
        elif align and align == 'top-left':
            p = (0,0)
        elif align and align == 'top-right':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (self.convas.width - f_w, 0)
        elif align and align == 'bottom-left':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (0, self.convas.height - 4*f_h)
        elif align and align == 'bottom-right':
            f_w, f_h = font.getsize(layer.get('text')) #获取字体大小
            p = (self.convas.width - f_w, self.convas.height - f_h)
        else:
            p = tuple([int(i) for i in layer.get('position','0,0').split(',')])
        color = tuple([int(i) for i in layer.get('color','0,0,0').split(',')])
        draw.text(p, layer.get('text',''), fill = color, font = font)


config = {
    'width': 1920,
    'height': 1080,
    'background_img': '',
    'background_color':'42,41,55',

    'layers': [
        {
            'layer_type': 'text',
            'color': '255,0,0',
            'font': {
                'font': './上首疾风书法体.ttf',
                'size': 140,
            },
            'position': '0,0',
            'align': 'center',
            'text': 'csdn粉丝数:1220'
        },
        {
            'layer_type': 'text',
            'color': '0,255,0',
            'font': {
                'font':'./上首疾风书法体.ttf',
                'size': 40,
            },
            'position': '',
            'align': 'bottom-left',
            'text': 'kkk@ynu关注了你\nhuitaiter123关注了你\n朝朝暮暮635关注了你\nzfy2763428175关注了你\nzxy20030123关注了你'
        },
        {
            'layer_type': 'text',
            'color': '155,0,255',
            'font': {
                'font': './上首疾风书法体.ttf',
                'size': 70,
            },
            'position': '',
            'align': 'bottom-right',
            'text': '小梁说代码'
        },
    ],
}
d = H3blogDrow()
d.parse_config(config)
img = d.draw()
# 展示出来
img.show()
# 保存到本地
# img.save('./wallpaper.png')

再将图片设置成壁纸

五行代码就能把图片变成壁纸,注意imagepath必须是绝对路径!绝对路径!绝对路径需要改成自己的路径windows系统才能找到

import ctypes
import os
# imagepath是要将被设置成壁纸图片的绝对路径,自己改
#获取当前目录绝对路径
path=os.getcwd()
# print(path)   D:\Software\PyCharm\Projects\FansWallPaper
imagepath=path+r"\wallpaper.png"
# imagepath ='D:\Software\PyCharm\Projects\FansWallPaper\wallpaper.png'
ctypes.windll.user32.SystemParametersInfoW(20, 0, imagepath, 0)

三,完成实时更新(动态展示)

最后把它们连在一起来就行啦!我设置的时间是3秒进行来刷新,你们也可以设置时间短一点

import H3blogDrow
d = H3blogDrow.H3blogDrow()
config= H3blogDrow.config

last_fans_num=get_fans_number()

while True:
    fans_num=get_fans_number()
    # 如何粉丝数没有变的话,就不进行下面的命令了,直接休息跳过
    if last_fans_num==fans_num:
        time.sleep(10)
        continue
    last_fans_num=fans_num
    nickname_list=get_fans_name()
    config['layers'][0]['text']=f'csdn粉丝数:{fans_num}'
    config['layers'][1]['text']="关注了你\n".join(nickname_list)
    # print(config)
    d.parse_config(config=config)
    img = d.draw()
    img.save('./wallpaper.png')
    change_wallpaper()
    #刷新时间3秒
    time.sleep(3)

最后我把它打包成了一个exe文件,关于python如何打包可以参考我这个文档,还是比较新的:https://liangyuanshao.blog.csdn.net/article/details/123022418

最后我把这个exe文件设置为开机自动运行,每天就能实时自动展示csdn粉丝数了

image-20221217094756826

四,相关代码地址

完整代码可以参考

github仓库地址:https://github.com/liangyuanshao/FansWallPaper

或者通过我的微信公众号获取:小梁代码

参考链接

https://blog.csdn.net/Ikaros_521/article/details/121906468

http://www.h3blog.com/article/python-autobuild-image/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArcGIS:如何进行栅格数据的拼接和裁剪、坡度坡向的提取、地形透视图的建立、等高线的提取、剖面图的创建?

目录 01 说明 02 实验目的及要求 03 实验设备及软件平台 04 实验内容与步骤 4.1 DEM 数据拼接和裁剪 4.2 地形属性的提取 4.3 透视图的建立&#xff08;均在ArcScence中操作&#xff09; 4.4 建立和显示 TIN 4.5 创建等高线图层 4.6 垂直剖面图创建 4.7 坡度分级 05 实验结果与…

【MySQL】MySQL性能优化

MySQL性能优化1、SQL语句及索引优化1.1 EXPLAIN查看索引使用情况1.2 SQL语句中IN包含的值不应过多1.3 SELECT语句务必指明字段名称1.4 当只需要一条数据的时候&#xff0c;使用limit 1&#xff0c;limit 是可以停止全表扫描的1.5 排序字段加索引1.6 如果限制条件中其他字段没有…

JAVA类和对象重点笔记及理解

1.类创建对象的详细过程 创建完成&#xff0c;dog就成了一个实例&#xff08;对象&#xff09;&#xff0c;具有属性和方法 Dog类的属性&#xff1a;一般叫做成员变量 Dog类的方法&#xff1a;一般叫做成员方法 类是对象的抽象&#xff0c;对象是类的具体实例。 2.JAVA的数据…

Mycat(4):mycat名词解释

1、逻辑库 对实际应用来说&#xff0c;并不需要知道中间件的存在&#xff0c;业务开发人员只需要知道数据库的概念&#xff0c;所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。 如图一中&#xff0c;在MYCAT服务区中的TESTDB库&#xff0c;只是逻辑上存在的数…

使用GraalVM 构建 Spring Boot 3.0 原生可执行文件

GraalVM 介绍 既然是VM&#xff0c;那肯定也是一个虚拟机&#xff0c;那它跟JVM有关系吗&#xff1f;有一定关系&#xff0c;GraalVM 可以完全取代上面提到的那几种虚拟机&#xff0c;比如 HotSpot。把你之前运行在 HotSpot 上的代码直接平移到 GraalVM 上&#xff0c;不用做任…

【GRU回归预测】基于麻雀算法优化门控循环单元SSA-GRU神经网络实现多输入单输出回归预测附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

java秋招被问到的八股文

投递的岗位是Java后端开发&#xff0c;八股文背了很多&#xff0c;现在面过三十场&#xff0c;做一个总结&#xff0c;整理出一些我确实被问到的问题。 该准备什么 首先是简历里的项目&#xff0c;一定要好好整理&#xff0c;项目的架构是怎样的&#xff0c;开发过程中遇到的…

国产实时操作系统+intel x86/龙芯平台超边缘计算机方案

引言 近年来&#xff0c;物联网、云计算、机器学习和网络安全等技术不断推动工业 4.0 的发展&#xff0c;“云边端” 的架构正逐步替代 “云管端”&#xff0c;边缘计算成为新时代许多领域转型的关键要素。以智能制造为例&#xff0c;不同于为互联网服务的 CDN 边缘计算技术&a…

Spring(二):Spring的创建和使用

目录一、创建Spring项目1.1 创建一个Maven项目1.2 添加Spring框架支持1.3 创建启动类二、使用Spring存储对象2.1 创建Bean2.2 将Bean注册到容器三、获取并使用Bean对象3.1 创建Spring的上下文3.2 从Spring上下文对象中取出Bean对象3.3 使用Bean一、创建Spring项目 1.1 创建一个…

传统数据治理的常见陷阱有哪些?

一、传统的数据治理 传统的数据治理是一种数据优先的治理方法。这种传统方法缺乏响应数据用户需求的流动性——或者在新法规出现时适应新法规的灵活性。传统方法概述角色、创建数据标准、分配责任并创建公司范围的数据策略。因为它强调对数据的控制&#xff0c;这种方法威胁工…

Java程序接入ChatGPT

Java程序接入ChatGPT0 前言1 还想体验的小伙伴可以试试2 Java接入前准备3 官方支持接入语言4 调用费用5 接口调用说明6 代码实现6.1 postman调用6.2 Java调用7 小结0 前言 之前文章中我们聊过怎么注册使用最近很火的ChatGPT&#xff1f;这期我们来看看怎么在Java中调用ChatGPT…

openssl aes加密例子

openssl OpenSSL 是一个安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 首先&#xff0c;要安装 openssl: centos命令: sudo yum install openssl-devel ubuntu命令&#x…

重学webpack系列(一) -- 前端模块化的演变历史

前言 任何事物的产生都有他的必然性&#xff0c;就像是冥冥之中注定了一样&#xff0c;在JavaScript刀耕火种的时代&#xff0c;前端是被定义为切图的一项工作&#xff0c;页面逻辑与交互全部由服务端工程师完成&#xff0c;前端开发几乎不受服务端开发重视&#xff0c;那时候…

免费教你如何设计商品主图,手把手教学!

好看的电商主图都是怎么设计出来的&#xff1f;有什么办法能快速设计出爆款的同款商品主图吗&#xff1f;跟着小编的教学步骤&#xff0c;教你轻松在线设计&#xff0c;不需要任何门槛也能掌握的电商设计工具&#xff0c;轻松搞定各种类型的商品主图&#xff0c;下面跟着小编的…

Spring BOOT 手写一个starter并使用这个starter

1、stater工程的命名 starter 是一个开箱即用的组件&#xff0c;减少不必要的重复代码&#xff0c;重复配置。例如&#xff0c;在mavne项目进行配置的时候&#xff0c;我们需要引用 spring-boot-starter-parent。 Spring 官方定义的 starter 通常命名遵循的格式为 spring-bo…

Linux——日志管理

基本介绍 日志文件是重要的系统信息文件&#xff0c;其中记录了许多重要的系统事件&#xff0c;包括信息的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等&#xff1b;日志对于安全来说也很重要&#xff0c;它记录了系统每天发生的各种事情&…

ASP.NET Core —选项系统

ASP.NET Core — 选项系统1. 选项2. 选项配置方式2.1 手动绑定2.2 依赖注入配置2.2.1 配置文件节点转换选项2.2.1 硬编码配置选项2.2.3 使用DI服务配置选项2.2.4 命名选项2.2.4 后期配置3. 使用3.1 IOptions<TOptions>3.2 IOptionsMonitor<TOptions>3.3 IOptionsSn…

零基础小白:为什么要学习编程?如何入门编程?!

这篇文章回答以下几个问题&#xff1a; ★我们为什么要学习编程&#xff1f; ★非计算机学生&#xff0c;如何对编程产生兴趣&#xff1f; ★零基础&#xff0c;如何入门编程&#xff1f; 第一个问题&#xff1a;我们为什么要学习编程&#xff1f; 如果说和编程有关的最经常收…

QT mysql 数据库的使用

1.首先我是用的是 网上的免费的mysql 数据库 &#xff0c; 1.申请步骤 2.链接 &#xff1a;SQLPub - 免费的MySQL数据库 2..测试数据库是否可以使用 头文件&#xff1a; #include <QSqlDatabase>//数据库 #include <QDebug>//输出 #include <QStringList&g…

【原创】Unity结合OpenAI官方api实现类似chatGPT的AI聊天机器人

一、什么是ChatGPT 最近chatGPT爆火&#xff0c;网络铺天盖地的各种文章视频&#xff0c;各种牛逼之声。倒算不上第一时间使用&#xff0c;发布隔了一周多&#xff0c;才从同事那里听说了这么个神奇的技术。这周阳了&#xff0c;持续发烧在家&#xff0c;忙着养病也没时间去了解…