多线程练习——phpwind

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}")


发布了44 篇原创文章 · 获赞 1 · 访问量 1463

猜你喜欢

转载自blog.csdn.net/cc_park/article/details/103796287