前段时间发表了一篇文章:https://bbs.zkaq.cn/t/31645.html
文章里有抽奖活动,于是写了一个抽奖脚本:
下面有脚本的运行过程演示。
目前该脚本共支持 5 个参数。
文章的编号,如图所示:
抽奖的人数,例如你要抽 5 份奖品,那就指定参数-n 5
或者是--num 5
。
HTTP 请求超时,默认为 10 秒。
可以指定 BurpSuite 的监听地址,方便调试,例如:--http-proxy 127.0.0.1:8080
默认情况下,脚本运行时不会打印所有评论的内容,如果你想查看所有评论的内容,则需要添加--verbose
选项。
以下是脚本演示。(本次是抽奖测试,获奖结果仅供参考)
只需要指定文章编号 以及 抽奖数量即可。
python3 lucky.py -i 编号 -n 数量
对于某些文章,例如未通过审核 或 不存在该主题等情况,则无法进行抽奖。
如图所示,添加--verbose
选项后可以打印所有评论的详细信息。
如图所示,指定--http-proxy
选项为 BurpSuite 的监听地址,可以代理所有 HTTP 请求。
我在附件上传了该脚本,可直接下载。
该脚本写的比较简陋,大佬们可以改进改进。
#!/usr/bin/env python3
import requests
import argparse
import random
import os
from bs4 import BeautifulSoup
requests.packages.urllib3.disable_warnings()
proxy = {}
headers = {
'User-Agent': 'ZKAQ-Lucky'
}
def getPageId(id, timeout):
'''
获取每篇文章的最大页数
:param id: (int) 文章编号
:param timeout: (int) 请求超时
:return pageid: (int) 返回总页数 (如果没有评论的话则返回 0 并退出运行)
'''
print('[INFO] 获取文章最大页数...')
try:
# ---------- 1. 请求 ----------
url = 'https://bbs.zkaq.cn/t/{0}.html'.format(id)
res = requests.get(
url,
headers=headers,
timeout=timeout,
proxies=proxy,
verify=False
)
# ---------- 2. 解析 ----------
soup = BeautifulSoup(res.text, 'html.parser')
try:
titles = soup.select('.t-info .head h1')
title = titles[0].text.strip()
except:
print('\t[-] 帖子尚未通过审核, 或不存在该主题, 或无法访问')
os._exit(-1)
items = soup.select('#pageid')
pageid = items[0].get('value', 0)
# ---------- 3. 结果 ----------
print('\t[+] 文章链接: ' + url)
print('\t[+] 文章标题: ' + title)
print('\t[+] 评论总页数: ' + str(pageid))
if pageid == 0:
os._exit(-1)
return int(pageid)
except IndexError:
# 单页评论没有 pageid, 会触发索引错误, 所以直接返回 1 页
print('\t[+] 文章链接: ' + url)
print('\t[+] 文章标题: ' + title)
print('\t[+] 评论总页数: 1')
return 1
except Exception as e:
print('\t[-] 请求错误')
print(e)
os._exit(-1)
def getAllComments(id, timeout, pageid, verbose=False):
'''
获取所有评论的用户名 和 评论内容
:param id: (int) 文章编号
:param timeout: (int) 请求超时
:param pageid: (int) 文章总页数
:param verbose: (bool) 是否显示评论详细信息
:return usernames, times, comments: (list)返回去重后的用户名列表 + (list)评论时间列表 + (list)评论内容列表
'''
print('[INFO] 获取所有评论...')
usernames = []
times = []
comments = []
try:
# ---------- 1. 请求每页评论 ----------
for i in range(1, pageid+1):
url = 'https://bbs.zkaq.cn/t/{0}/{1}.html'.format(id, i)
res = requests.get(
url,
headers=headers,
timeout=timeout,
proxies=proxy,
verify=False
)
# ---------- 2. 解析每页评论 ----------
soup = BeautifulSoup(res.text, 'html.parser')
user_items = soup.select('.comment-list .author')
for user in user_items:
usernames.append(user.text.strip())
time_items = soup.select('.comment-list .time')
for time in time_items:
times.append(time.text.strip())
comment_items = soup.select('.comment-list .markdown-body')
for comment in comment_items:
comments.append(comment.text.strip())
# ---------- 3. 展示所有评论 ----------
if verbose:
for i in range(len(usernames)):
print('{0:25}\t{1:25}\t{2}'.format(usernames[i], times[i], comments[i]))
# ---------- 4. 结果 & 去重 ----------
print('\t[+] 用户名总数: ' + str(len(usernames)))
print('\t[+] 评论总数: ' + str(len(comments)))
usernames = list(set(usernames))
print('\t[+] 去重后的用户名总数: ' + str(len(usernames)))
if verbose:
for i in range(len(usernames)):
print('{0}\t{1}'.format(i+1, usernames[i]))
return usernames, times, comments
except Exception as e:
print('\t[-] 请求错误')
print(e)
os._exit(-1)
def lucky(usernames, num):
'''
抽奖
:param usernames: (list) 经过去重的用户名列表
:param verbose: (bool) 抽奖数量
'''
print('[INFO] 开始抽奖...')
for i in range(num):
luck = random.randint(0, len(usernames)-1)
print('\t[+] 幸运儿 {0:3}: {1}'.format(i+1, usernames.pop(luck))) # .pop() 会删除并返回元素, 防止重复中奖
def main():
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--id', type=int, help='文章编号, 例如 (-i 31645)', required=True)
parser.add_argument('-n', '--num', type=int, help='抽奖数量, 例如抽取五个人 (-n 5)', required=True)
parser.add_argument('-t', '--timeout', type=int, help='请求超时, default: 10', default=10)
parser.add_argument('--http-proxy', type=str, help='HTTP 代理, 例如 (--http-proxy 127.0.0.1:8080)')
parser.add_argument('--verbose', action='store_true', help='显示详细信息')
args = parser.parse_args()
if args.http_proxy:
proxy['http'] = args.http_proxy
proxy['https'] = args.http_proxy
pageid = getPageId(args.id, args.timeout)
usernames, times, comments = getAllComments(args.id, args.timeout, pageid, args.verbose)
lucky(usernames, args.num)
if __name__ == '__main__':
main()
文章抽奖截止至2024-06-17 00:00:00
,帅哥靓女们不来试试吗?
打赏我,让我更有动力~
lucky.zip 文件大小:0.002M (下载次数:0)
© 2016 - 2024 掌控者 All Rights Reserved.
嘉名
发表于 6个月前
第十个才是我【泪】
评论列表
加载数据中...
小瑟斯
发表于 6个月前
想要奖品
评论列表
加载数据中...
我是大白
发表于 6个月前
看到没,介个,就叫专业!
评论列表
加载数据中...