1、注册
暂未实现多线程注册
代码如下:
import threading,requests,time,random
class test_registered():
def __init__(self):
self.session = requests.session()
def registered(self):
url = "http://localhost:8081/phpwind/register.php?"
for i in range(1,9):
body = {
"forward" :"",
"step" :"2",
"regname" :f"user00{i}",
"regpwd":"123456",
"regpwdrepeat":"123456",
"regemail":f"user00{i}@qq.com",
"rgpermit":"1"
}
response = self.session.post(url,data=body)
# response.encoding = "utf-8" 在需要设置的情况下使用
newtxt = response.text
if "恭喜您!亲爱的会员,您已经注册成功。" in newtxt:
print("注册成功")
else:
print( "注册失败")
# print(newtxt)
self.session = requests.session()
if __name__ == "__main__":
cs = test_registered()
cs.registered()
2、登录
代码如下:
import threading, requests, json,random
class test_login():
def __init__(self):
self.session = requests.session()
def login(self):
url = "http://localhost:8081/phpwind/login.php?"
i = random.randint(1,3)
body = {
"step": 2,
"pwuser": f"user00{i}",
"pwpwd": "123456",
"lgt": 0
}
response = self.session.post(url,data=body)
newtxt = response.text
if "您已经顺利登录" in newtxt:
print("登录成功")
else:
print("登录失败")
####创建一个多线程的方法
def main(self):
for i in range(5):
self.login()
self.session = requests.session() #因为当使用多线程的时候,等于一个线程登录十次同一个用户,
# 所以需要重新赋值session或者注销
if __name__ == "__main__":
cs = test_login()
for i in range(5):
threading.Thread(target=cs.main).start()
3、发帖
还待优化
代码如下:
import threading,requests,random,re,time
import pymysql
class test_posting():
login_pass_number = 0
login_fail_number = 0
posting_pass_number = 0
posting_fail_number = 0
def __init__(self):
self.session = requests.session()
self.conn = pymysql.connect("localhost","root","123456","mysql") #连接数据库
self.cursor = self.conn.cursor()
####登录
def login(self):
url = "http://localhost:8081/phpwind/login.php?"
self.u_number = random.randint(1,3)
body = {
"step": 2,
"pwuser": f"user00{self.u_number}",
"pwpwd": "123456",
"lgt": 0
}
response = self.session.post(url,data=body)
newtxt = response.text
# print(newtxt)
if "您已经顺利登录" in newtxt:
test_posting.login_pass_number += 1
# print("登录成功")
else:
test_posting.login_fail_number += 1
print(newtxt) #打印出失败的情况,方便调试
def posting(self):
######随机获取fid(板块编号)
#方案一:直接从数据库读取随机一条
# sql = 'SELECT fid FROM pw_forums WHERE type="forum" ORDER BY RAND() LIMIT 0,1'
# self.cursor.execute(sql)
# result = self.cursor.fetchone()
# fid = result[0]
# print(fid)
#方案二:从首页响应中获取
url = "http://localhost:8081/phpwind/"
response = self.session.get(url)
pattern = r'href="thread.php\?fid=(.+?)" target="_blank">'
result = re.findall(pattern=pattern,string=response.text) #得到的是一个列表
fid = random.choice(result)[0] #choice得到的是一个元素列表
print(fid)
#####点击发帖,获取verify
url = "http://localhost:8081//phpwind/post.php?"
params = {
"fid":fid
}
response = self.session.get(url,params=params)
newtxt = response.text
# print(newtxt)
pattern = 'name="verify" value="(.+?)" />'
result = re.findall(pattern=pattern, string=newtxt)
print(result)
verify_code = result[0]
#####发帖请求
url = "http://localhost:8081/phpwind/post.php?"
body = {
"magicname":"",
"magicid":"",
"verify":verify_code,
"atc_title":f"测试标题-user001-00{self.u_number}",
"atc_iconid":0,
"atc_content":f"测试标题-user001-00{self.u_number}",
"atc_autourl":1,
"atc_usesign":1,
"atc_convert":1,
"atc_rvrc":0,
"atc_enhidetype":"rvrc",
"atc_money":0,
"atc_credittype":"money",
"atc_desc1":"",
"att_special1":0,
"att_ctype1":"money",
"atc_needrvrc1":0,
"step":2,
"pid":"",
"action":"new",
"fid":fid,
"tid":"",
"article":0,
"special":0
}
response = self.session.post(url,data=body)
# print(response.text)
if "发帖完毕点击进入主题列表" in response.text:
# print("发帖完成")
test_posting.posting_pass_number += 1
else:
test_posting.posting_fail_number += 1
print(response.text)
# print("发帖失败")
def main(self):
for i in range(2):
# start_login_time = time.time()
self.login()
# end_login_time = time.time()
# login_time = end_login_time-start_login_time #得到登录所用时间
# print(login_time)
time.sleep(3)
self.posting()
self.session = requests.session() #因为当使用多线程的时候,等于一个线程登录十次同一个用户,
# 所以需要重新赋值session或者注销
if __name__ == "__main__":
cs = test_posting()
for i in range(2):
threading.Thread(target=cs.main).start()
time.sleep(15)
print(f"登录成功数量为:{test_posting.login_pass_number}",f"登录失败数量为:{test_posting.login_fail_number}"
f"发帖成功数量为:{test_posting.posting_pass_number}",f"发帖失败数量为:{test_posting.posting_fail_number}")