CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】

这篇具有很好参考价值的文章主要介绍了CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

一、机缘巧合

  • 近期我开始着手于粉丝福利送书活动,需要在评论区随机抽取一些粉丝送出实体好书。为了完成这个任务,我需要手动复制粘贴粉丝的名字,并下载相应的抽奖程序,然后手动录入粉丝名单,这一系列繁琐的操作让我觉得非常麻烦
  • 无独有偶,我最近正在实习中,有机会接触和学习有关 Python 的知识。我初步学习了一些 Python 爬虫技术,能够简单地爬取一些网页数据。于是,我决定尝试着动手实现一个简易的 Python 爬虫程序,用于自动获取评论区粉丝的名字,并实现随机抽取的功能
  • 请大家见谅,因为我是 Java 选手,刚刚入门 Python,所以水平有限,程序设计的过程中难免有不足之处,欢迎大家大提出宝贵意见和批评指正

二、 设计思路

  • 首先,我计划使用 Python 爬虫技术从评论区获取粉丝的名字。通过分析评论区的网页结构,我可以编写爬虫程序来提取相关数据。使用 Python 的请求库(如 Requests )和解析库(如 BeautifulSoup ),我可以发送请求并从页面中提取所需信息,例如粉丝的用户名。

  • 一旦获取到了粉丝名字的列表,接下来我可以使用 Python 的随机化库(如random)来实现随机抽取的功能。通过调用适当的方法,我可以从粉丝名字的列表中随机选择若干位粉丝作为获奖者。

  • 为了提高用户的操作便利性,让其能够轻松运行代码,我也会将代码打包成一个可执行的Python程序,以实现点击即可运行的功能。这样一来,用户只需双击该程序,而无需打开命令行或编辑器,就能直接执行代码。

三、前置知识

1. 如何发送get请求解析url(基础)

  • 要解析 Python 中 Request 返回的 HTML DOM,你可以使用解析库,如 BeautifulSoup 或 lxml,来处理 HTML 文档。下面是使用 Beautiful Soup 的示例代码:
  • 首先,确保你已经安装了所需的库。对于 Beautiful Soup,你可以使用 pip install beautifulsoup4 进行安装。
  1. BeautifulSoup 是一个 Python 库,用于网络爬虫目的。它提供了一种方便和高效的方式来从 HTML 和 XML 文档中提取数据。使用 BeautifulSoup,你可以解析和遍历 HTML 结构,搜索特定元素,并从网页中提取相关数据。
  2. 该库支持不同的解析器,如内置的 Python 解析器、lxml 和 html5lib,允许你根据特定需求选择最适合的解析器。BeautifulSoup 的优势在于它能够处理格式混乱或损坏的 HTML 代码,使其成为处理复杂情况下的网络爬虫任务的强大工具。
import requests
from bs4 import BeautifulSoup

# 发送请求获取 HTML
response = requests.get(url)
html = response.text

# 创建 Beautiful Soup 对象
soup = BeautifulSoup(html, 'html.parser')

# 通过选择器选择 DOM 元素进行操作
element = soup.find('div',id='my-element')
  • 在上面的示例中,requests.get(url) 发送请求并获取 HTML 响应。然后,我们使用 response.text 获取响应的 HTML 内容,并将其传递给 Beautiful Soup 构造函数 BeautifulSoup(html, ‘html.parser’),创建一个 Beautiful Soup 对象 soup
  • 接下来,你可以使用 Beautiful Soup 提供的方法和选择器,如 find(),来选择 HTML DOM 中的特定元素。在上述示例中,我们通过 find() 方法选择具有 idmy-element 的元素。

2. 如何发送post请求解析url

解析一个请求主要关注以下几个方面

  • 请求类型(post、get…)
  • 请求路径(网址)
  • 请求头(如图)

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 请求参数(post 请求是隐式参数,而浏览器发送的是 get 请求,这意味着发 post 请求的接口数据无法通过发 get 请求直接获取到

以下是一个示例代码

import json

import requests
def main():
    #这是获取广州青年报响应数据的一个模拟测试类
    url = 'https://www.gzyouthnews.org.cn/index/index'
    header = {
        'X-Requested-With':'XMLHttpRequest'
    }
    data={
        'act':'list',
        'date':'2023-08-10',
        'paper_id':1
    }
    res = requests.post(url=url,headers=header,data=data)
    list = json.loads(res.text)
    for i in list:
        print(i.get('edition'))

if __name__ == '__main__':
    main()

3. 如何添加常用的请求头

  • 如果想在实际的代码中设置 HTTP 请求头,可以通过使用相应编程语言和 HTTP 库的功能来完成。下面是一个示例,显示如何使用 Python 的 requests 库添加常用的请求头:
import requests

url = "https://example.com"
headers = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
    "Referer": "https://example.com",
    # 添加其他常用请求头...
}

response = requests.get(url,stream=True, headers=headers)
  • 在上述示例中,我们创建了一个 headers 字典,并将常用的请求头键值对添加到字典中。然后,在发送请求时,通过传递 headers 参数将这些请求头添加到 GET 请求中。
    请注意,实际使用时,可以根据需要自定义请求头部。常用的请求头包括 “User-Agent”(用户代理,用于识别客户端浏览器/设备)、“Accept-Language”(接受的语言)、“Referer”(来源页面)等。

4. 字符串格式化

字符串格式化是一种将变量或数据插入到字符串中的方法,以创建具有特定格式的文本。在 Python 中,字符串格式化可以通过多种方式实现。

一种常用的字符串格式化方式是使用百分号(%)操作符。这种方法使用占位符来表示要插入的变量,并在%操作符后面提供相应的值。例如:

name = "Alice"
age = 25
message = "My name is %s and I am %d years old." % (name, age)
print(message)

输出结果将是:

My name is Alice and I am 25 years old.

在上面的例子中,%s 是字符串占位符,%d 是整数占位符。% 操作符后的括号中依次提供了要插入的变量(name 和 age)。

5. 如何解析JSON格式

  • 要获取 JSON 数据中的 title 属性的值,你可以使用 Python 的 json 模块来解析 JSON 数据。在你的示例数据中,title 属性位于 data 字典中的 pageArticleList 列表中的每个元素中。
  • 下面是一个示例代码,演示如何获取 title 属性的值:
import json

# 假设你已经获取到了 JSON 数据,将其存储在 json_data 变量中
json_data = '''
{
  "status": 200,
  "message": "success",
  "datatype": "json",
  "data": {
    "pageArticleList": [
      {
        "indexnum": 0,
        "periodid": 20200651,
        "ordinate": "",
        "pageid": 2020035375,
        "pagenum": "6 科协动态",
        "title": "聚焦“科技创新+先进制造” 构建社会化大科普工作格局"
      }
    ]
  }
}
'''

# 解析 JSON 数据
data = json.loads(json_data)

# 提取 title 属性的值
title = data["data"]["pageArticleList"][0]["title"]

# 输出 title 属性的值
print(title)
  • 在上述示例中,我们将示例数据存储在 json_data 字符串中。然后,我们使用 json.loads() 函数将字符串解析为 JSON 数据,将其存储在 data 变量中。

  • 然后,我们可以通过字典键的层级访问方式提取 title 属性的值。在这个示例中,我们使用 data[“data”][“pageArticleList”][0][“title”] 来获取 title 属性的值(类似于数组,一个层级就用一个[])。

  • 最后,我们将结果打印出来或根据需求进行其他处理。

  • 或者是用 get() 获取具体属性的值

list = json.loads(res.text)
    for i in list:
        print(i.get('edition'))

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

6. 如何获取 url 中的参数

要从给定的 URL 中获取参数 page=100,你可以使用 URL 解析库来解析 URL,并提取出所需的参数。
以下是使用 Python 的 urllib.parse 模块解析 URL 参数的示例代码:

from urllib.parse import urlparse, parse_qs

url = "https://blog.csdn.net/phoenix/web/v1/comment/list/131760390?page=100&size=10&fold=unfold&commentId="

parsed_url = urlparse(url)
query_params = parse_qs(parsed_url.query)

page_value = query_params.get("page", [None])[0]
print(page_value)

在上述示例中,我们首先使用 urlparse 函数解析 URL,然后使用 parse_qs 函数解析查询参数部分。parse_qs 函数将查询参数解析为字典,其中键是参数名称,值是参数值的列表。

然后,我们使用 query_params.get(“page”, [None])[0] 从字典中获取名为 page 的参数值。这将返回参数的值,如果该参数不存在,则返回 None

输出结果将是 100,这是从 URL https://blog.csdn.net/phoenix/web/v1/comment/list/131760390?page=100&size=10&fold=unfold&commentId= 中提取的 page 参数的值。

请注意,如果 URL 的参数值是字符串形式,你可能需要根据需要进行进一步的类型转换。

四、开始编程探索

  • 首先我们按照上面给的模板去编写代码,编写一个发送 get 请求的示例程序,这里以我个人的博客 《4个维度讲透ChatGPT技术原理,揭开ChatGPT神秘技术黑盒【文末送书】》 为例子,先找到对应的 dom 节点
    CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 进行代码调试,查找是否正常获取到了我们想要的节点

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 我们发现包含所有评论区粉丝名称的 id 为 pcCommentSideBox 的 dom 节点内容为空,并没有发现在页面上看到的其他 dom 结点。
  • 其实到这里我们可以根据经验知道,评论区的数据是通过接口渲染上去的,而不是直接渲染在页面的 dom 结构中,于是我们去网页上的控制台去找对应的数据渲染接口

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 通过一条一条查看请求,我们终于找到了对应的渲染评论区数据的返回 json 数据格式的请求

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 并且通过查看该请求的消息头,我们不难发现该请求的请求类型为 POST,并且该API接口的请求路径为

https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=2&size=10&fold=unfold

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 并且我们发现被折叠的评论路径参数中的 fold 属性值为 fold,而没被折叠的路径 fold 参数值为 unfold,被折叠的评论是无效(评论过短或者包涵敏感词汇或者是与讨论与博客无关的内容)的,此处不参与抽奖,故不做处理

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 我们直接去访问该接口,发现只有 10 条数据,并不是完整的评论区的数据

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 那我们的评论区有多少条评论呢?怎么算的呢?通过下图我们发现总评论数量是包括折叠和被折叠的

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 当你回过头仔细查看页面你会发现,随着你点击查看更多评论,类似的请求也会越来越多

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 当你去比对他们的请求路径你会发现,他们之间的区别就是路径中的 page 参数不同而已,不难推断,一个 page 就是一个页面(评论总数 - 折叠数 的差值 / 10 向上取整),当把所有的 page 都集齐了,就获取到了评论区的所有的评论,进一步也就能获取到评论区所有粉丝的名字

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 于是,我们将原来的 GET 请求改为 POST 请求,并将路径中的 page 参数通过动态拼接赋值 + for 循环遍历所有的页面,示例如下
    #假设有19页评论
    for index in range(0,20):
      # 示例博客地址
      url = "https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=%s&size=10&fold=unfold" % (index)
  • 此处不加请求头是访问不到带有 JSON 数据的接口的,故在这里添加了常用的请求头,如果还不行,考虑多加几个常用的请求头和加参数
      headers = {
          "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
      }
      response = requests.post(url,headers=headers)

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 能访问到接口后通过 for 循环处理每一页的 JSON 数据

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

      html = response.text
      json_data = json.loads(html)
      list = json_data["data"]["list"]
      for item in list:
          # 获取评论区每一条评论中粉丝的用户昵称
          user_name = item["info"]["nickName"]
  • 另外,博主本身不参与抽奖,所以博主的评论不放在最终的奖池中,博主自身评论分两种情况,如下:
    CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记
  • 因为获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段
    CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记
      for item in list:
          # 获取评论区每一条评论中粉丝的用户昵称
          user_name = item["info"]["nickName"]
          # 博主自身的评论不参与抽奖
          if user_name == editior_name:
              continue
          else:
              nums.append(user_name)
  • 在访问接口之前定义一个数组 nums,用来存储获取到的用户昵称
nums = []
...
nums.append(user_name)
  • 通过 python 的 random 函数随机从存储了评论区所有粉丝用户昵称的数组 nums 中抽取 5 位幸运粉丝
#假设是抽5名幸运粉丝
    for index in range(0,5):
        luck_fan = random.choice(nums)
        print("第" + str(index + 1) + "位幸运粉丝是" + luck_fan)
  • 为了优化用户体验,我们将抽取粉丝数量和访问带有 JSON 数据接口的数量(有多少页就有多少个接口,通过转换为多少条评论来优化用户体验)通过键盘输入的方式,由用户自定义参数,降低代码的耦合度,提升程序与用户的交互性
 #一共有多少条评论,一个页面10条评论
    comment_num = input("请输入博客中的评论数量: ")
    comment_num = int(comment_num)
    luck_fans_num = input("请在键盘输入最终中奖粉丝的数量: ")
    luck_fans_num = int(luck_fans_num)
    
    #有多少页评论循环多少次
    for index in range(0, int(comment/10)):
    ...
    
    #假设是抽5名幸运粉丝
    for index in range(0,luck_fans_num):
     ...
  • 为了提升用户体验,原本固定在程序中的 json 数据链接改为通过用户输入,并将 page 参数的值改为 %s 进行动态拼接
from urllib.parse import urlparse, parse_qs
  ...
  JSON_path = input("请在键盘中输入博客中评论的JSON数据渲染路径(page=%s): ")
    # 解析URL
    parsed_url = urlparse(JSON_path)
    # 提取查询参数
    query_params = parse_qs(parsed_url.query)
    # 获取page字段的值。替换为%s进行动态拼接
    page_value = query_params.get('page', [''])[0]
    JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
  • 另外在调试页面的过程中我们会发现当有效评论超过10条的时候 JSON 数据接口会在评论末尾页多渲染10个和第一页一模一样的脏数据(这个特点我找了差不多一天,555…),这个需要在获取时跳过第1个页面
    #评论大于10条会渲染脏数据,第1页数据不能取
    if int(comment_num) >= 10:
        dirty_data_index = 1
    else:
        dirty_data_index = 0

    for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80):
    ...
  • 同时,为了避免最终结果出现两个相同的名字,还得在抽奖的时候做一下去重工作
 final_nums = []
    #假设是抽5名幸运粉丝
    for index in range(0,luck_fans_num):
        luck_fan = random.choice(nums)
        if luck_fan not in final_nums:
            final_nums.append(luck_fan)
        else:
            index = index - 1
            continue
  • 将程序用 PyInstaller 打包成.exe文件,无需下载安装任何软件或环境,点击即可运行,由于程序运行完会立即结束,类似闪退的效果,故在main 函数执行完后添加 time.sleep(),延迟程序关闭时间

打包教程如下:http://t.csdn.cn/7I1yW

 #打包后的程序持续显示5分钟后自动关闭
    time.sleep(300)
  • 此时需要用户自己去找对应的 JSON 数据链接,并且将 page 参数的值手动改为 %s,这里我们在程序中进行自动处理将 page 参数的值自动改为 %s,提升用户体验
JSON_path = input("请在输入博客中评论的JSON数据渲染路径(任意): ")
    # 解析URL
    parsed_url = urlparse(JSON_path)
    # 提取查询参数
    query_params = parse_qs(parsed_url.query)
    # 获取page字段的值。替换为%s进行动态拼接
    page_value = query_params.get('page', [''])[0]
    JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
  • 但是考虑到一些用户基础薄弱,找 json 链接对于他们来说也很麻烦,如果能直接输入博客链接运行程序就好了,这必须安排上。 我们其实可以发现,每篇文章的 json 链接其实就一个地方不一样

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 我们知道,一个网址的前面一段都是固定不变的,随着传参的数量不同,产生了不同的 API 接口进而访问不同的页面,我们想直接通过博客链接就运行程序,于是我们去观察博客链接,会发现文章 id 和 JSON链接中数字的是一样的

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

  • 于是,我们就可以通过输入文章 id 来进行拼接 JSON 路径,从而避免了直接去找的繁琐
blog_id = input("请输入博客id: ")
    blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold"
    ...
    url = blog_url % (index)
  • 有的用户觉得要求路径找id还是太麻烦了,如果能直接输入文章的全路径就好了,更加方便,这必须给他安排上,我们让程序自动提取出路径中的文章id
 blog_id = input("请输入者博客地址或者博客id: ")
    #解析输入的博客地址,提前文章id
    parsed_url = urlparse(blog_id)
    path = parsed_url.path
    # 提取出目标字符串
    blog_id = path.split('/')[-1]
    blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold"
  • 可能有些用户觉得控制台加载输出平平无奇,于是我们给他加上一个动态的加载条,具体操作如下:

http://t.csdn.cn/k6DeM

from tqdm import *
...
for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80):
...
  • 有的用户又说了,被折叠的评论也是评论,不能让人家白评论,要把最好的福利传递给更多的粉丝,想把被折叠的评论也加进奖池里,能否实现呢.
  • 当然可以,其实被折叠的评论的 json 数据连接与 没被折叠的 json 数据连接区别仅仅是路径中的 fold 参数值为 fold 而已(前面我也提到过这一点),处理方法同理可得,具体代码见完全体

五、最后,变完全体

import json
import math
import random
import time
import requests
from urllib.parse import urlparse, parse_qs
from tqdm import *

def main():
    nums = []
    nums_fold = []
    content_fold = []
    blog_id = input("请输入者博客地址或者博客id: ")
    # 解析输入的博客地址,提前文章id
    parsed_url = urlparse(blog_id)
    path = parsed_url.path
    # 提取出目标字符串
    blog_id = path.split('/')[-1]
    blog_url = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold"
    # fold 代表折叠的评论
    blog_url_fold = "https://blog.csdn.net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=fold"
    # 一共有多少条评论,一个页面10条评论
    comment_num = input("请输入博客中的总评论数量: ")
    page_num = math.ceil(int(comment_num) / 10)
    luck_fans_num = input("请输入最终中奖粉丝的数量: ")
    luck_fans_num = int(luck_fans_num)
    editior_name = input("请输入不参与此次抽奖的用户昵称(暂时限制0-1个): ")
    fold_into_unfold = input("是否将被折叠的评论加入奖池(y/n): ")
    print()

    #评论大于10条会渲染脏数据,第1页数据不能取
    if int(comment_num) >= 10:
        dirty_data_index = 1
    else:
        dirty_data_index = 0

    for index in tqdm(range(dirty_data_index, page_num),desc='抽奖中',ncols=80):
        # 示例url : https://blog.csdn.net/phoenix/web/v1/comment/list/132666724?page=3&size=10&fold=unfold
        url = blog_url % (index)
        url_fold = blog_url_fold % (index)
        # 发送请求获取 HTML
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0",
        }
        #获取相应数据 response 并根据需求提取对应的 json 数据
        response = requests.post(url, headers=headers)
        response_fold = requests.post(url_fold, headers=headers)
        html = response.text
        html_fold = response_fold.text
        json_data = json.loads(html)
        json_data_fold = json.loads(html_fold)
        list = json_data["data"]["list"]
        list_fold = json_data_fold["data"]["list"]
        for item in list:
            # 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段
            user_name = item["info"]["nickName"]
            # 博主自身的评论不参与抽奖
            if user_name == editior_name:
                continue
            else:
                nums.append(user_name)

        for item in list_fold:
            # 获取评论区每一条评论中粉丝的用户昵称,取得是info字段,不是sub字段
            user_name = item["info"]["nickName"]
            content = item["info"]["content"]
            # 博主自身的评论不参与抽奖
            if user_name == editior_name:
                continue
            else:
                nums_fold.append(user_name)
                content_fold.append(content)
    print()

    if fold_into_unfold == 'y' or fold_into_unfold == 'Y':
        result = "参与抽奖活动的名单(包括被折叠的)如下:" + ', '.join(nums + nums_fold)
        print(str(int(comment_num) - len(nums) - len(nums_fold)) + " 条评论出现在同一楼,包括被折叠的一共 " + str(len(nums + nums_fold))+ " 条评论参与了此次抽奖" + '\n')
    else:
        result = "参与抽奖活动的名单(不包括被折叠的)如下:" + ', '.join(nums)
        print("一共有 " + comment_num + " 条评论,其中 " + str(len(nums_fold)) + " 条评论被折叠, " + str(
            int(comment_num) - len(nums) - len(nums_fold)) + " 条评论出现在同一楼,共 " + str(len(nums)) + " 条有效评论参与了此次抽奖" + '\n')
        result_content_fold = "由于评论过短,包含回访,评论内容无厘头等情况被折叠评论内容如下:" + ' | '.join(content_fold)
        print(result_content_fold + '\n')
    print(result + '\n')

    final_nums = []
    if fold_into_unfold == 'y' or fold_into_unfold == 'Y':
        nums_jiangchi = nums + nums_fold
    else:
        nums_jiangchi = nums 

    # 假设是抽5名幸运粉丝
    for index in range(luck_fans_num):
        luck_fan = random.choice(nums_jiangchi)
        if luck_fan not in final_nums:
            final_nums.append(luck_fan)
        else:
            index = index - 1
            continue
        print("第" + str(index + 1) + "位幸运粉丝是 >>>>>> " + luck_fan)


if __name__ == '__main__':
    main()
    # 打包后的程序持续显示5分钟后自动关闭
    time.sleep(300)

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】,python,python,开发语言,经验分享,笔记

六、更新日志

  • 2023-09-08 23:46 博客版本1.0问世

1. 完成了基础的抽奖功能.

  • 2023-09-10 0:26 版本1.1 代码逻辑优化

1. 新增作者不参与抽奖的功能特性
2. 修复了脏数据渲染的问题
3. 优化了输出语句,提升用户体验

  • 2023-09-10 15:36 版本1.2 代码逻辑优化

1. 获取的JSON数据链接通过键盘输入
2. 将程序打包成.exe文件,无需下载安装任何软件或环境,点击即可运行

  • 2023-09-10 18:15 版本 1.3 代码逻辑优化

1. 实现通过输入文章 id 完成整体逻辑的运行
2. 优化了输出语句

  • 2023-09-11 14:28 版本 1.4 代码逻辑优化

1. 支持直接输入文章完整路径,程序自动提取文章id
2. 新增动态加载条效果
3. 新增添加被折叠评论的功能特性,并添加了更加详细的数据显示

总结

欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。
(博客的参考源码可以在我主页的资源里找到,如果在学习的过程中有什么疑问欢迎大家在评论区向我提出)文章来源地址https://www.toymoban.com/news/detail-704881.html

到了这里,关于CSDN评论区粉丝抽奖程序 正式版1.3【内附详细教程,你上你也行】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小程序发布体验版流程、发布正式版

    【注意】 如果使用的测试 appid 则【上传】按钮不能点击,必须使用真实 appid 上传成功后在 微信小程序公众平台 进行版本管理 点击下一步 点击“继续提交”,填写信息 点击 “提交审核” ↑ 提示 “当前提审的开发版本代码与隐私协议内容不匹配,请在当前提审页面,点击

    2023年04月25日
    浏览(147)
  • 小程序新渲染引擎 Skyline 发布正式版

    为了进一步提升小程序的渲染性能和体验,我们推出了一套新渲染引擎 Skyline,现在,跟随着基础库 3.0.0 发布 Skyline 正式版。 我们知道,小程序一直用 WebView 来渲染界面,因其有不错的兼容性和丰富的特性,且各大厂商也在不断优化 Web 的渲染性能,但 Web 体系相比于原生开

    2024年02月14日
    浏览(51)
  • uniapp微信小程序区分正式版,开发版,体验版

    小程序代码区分是正式版,开发版,还是体验版 通常正式和开发环境需要调用不同域名接口,发布时需要手动更换 或者有些东西不想在正式版显示,只在开发版体验版中显示,也需要去手动隐藏 官方没有明确给出判断环境的方法,但其实是有的,也就是 __wxConfig 先看下 __

    2024年02月12日
    浏览(45)
  • 小程序 账号的体验版&正式版的账号信息及相关配置

    siteinfo.js  获取当前账号信息。线上小程序版本号仅支持在正式版小程序中获取,开发版和体验版中无法获取。 Object 账号信息 属性 类型 说明 miniProgram Object 小程序账号信息 结构属性 类型 说明 最低版本 appId string 小程序 appId envVersion string 小程序版本 合法值 说明 develop 开发

    2024年02月15日
    浏览(44)
  • 小程序正式版报错600002 url not in domain list

    开发版,体验版都没问题,线上版本报错 在小程序官方文档找到错误码 600002 : 登录小程序后台,找到开发 - 开发管理 - 开发设置 - 服务器域名 配置对应的域名即可。

    2024年02月16日
    浏览(40)
  • 【小程序“600002“】现象:小程序测试版能正常的进行页面跳转,正式版不能进行页面跳转

    记录:(in promise) MiniProgramError {“errno”:600002,“errMsg”:“request:fail url not in domain list”} Object 小程序报错 正式版报此错误测试版不报错且能正常进行页面跳转. 解决方案: 官方文档查看错误码含义:官方文档 解决方法:1.小程序访问后台地址换成域名去访问(忌:ip+端口) 2.在小程序公

    2024年02月13日
    浏览(46)
  • iOS17正式版9月18日正式发布!怎么更新即将发布的iOS17正式版?

    苹果在今天举办的“好奇心上头”发布会结束后,推送了iOS 17和iPadOS 17发布候选版本(Release Candidate Version),同时宣布将于9月18日面向iPhone和iPad 用户,推送iOS17/iPadOS 17正式版更新。苹果表示iOS 17的设计理念之一,不再让用户为了某些简单的任务打开独立的应用程序,而是贯

    2024年02月08日
    浏览(59)
  • Angular 16 正式版发布

    在之前的Angularv15中,Angular团队通过将独立API从开发者预览版升级至稳定版,在Angular的简易性和开发者体验方面达到了一个重要的里程碑。如今,Angular将继续这一改进的势头,发布了自Angular最初推出以来最大的一次版本更新;在Reactivity、服务器端渲染和工具方面取得了巨大

    2024年02月08日
    浏览(71)
  • 苹果macOS 13 Ventura beta版如何转成正式版?如何将 MacOS Beta 版更新为正式版?

    苹果 macOS 13 Ventura 正式版将于 10 月 25 日推送:台前调度、连续互通相机等,之前很多小伙伴使用macOS 13 Ventura 的beta版都尝鲜了,现在正式版要来了,苹果macOS 13 Ventura beta版如何转成正式版?如何将 MacOS Beta 版更新为正式版? 打开系统偏好设置—通用—软件更新 取消注册Ma

    2024年02月15日
    浏览(75)
  • ?Avalonia 11.0.0 正式版发布

    AvaloniaUI 发布11.0.0正式版 终于avalonia发布了正式版。 今天,我们非常高兴地宣布Avalonia 11.0版本的发布! 在经历了近一年的预览版本和无数个数以千计的工作小时后,现在是时候发布一款改变游戏规则的跨平台应用程序开发工具了。Avalonia v11代表着我们在实现目标上的巨大飞

    2024年02月12日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包