首页 > 解决方案 > 如何使用线程在文本文件中每行发布请求

问题描述

我针对anilist api创建了一个用户名检查器。它基本上检查用户名的可用性以获取“稀有”用户名。我试图通过使用线程来加快进程,但不是检查不同的用户名,而是检查一个用户名五十次。我怎样才能使它检查线程池中每个请求的不同用户名。

我的代码:

def req_split(r):
    global checked
    global available

    username = [line.strip() for line in open(f"external/{usernameFile}")]
    for name in username:
        data = {
            "query": "mutation($name:String){CreateUser(userName:$name){id name about avatar{large}bannerImage unreadNotificationCount donatorTier donatorBadge moderatorRoles options{titleLanguage airingNotifications displayAdultContent profileColor notificationOptions{type enabled}}mediaListOptions{scoreFormat rowOrder animeList{customLists sectionOrder splitCompletedSectionByFormat advancedScoring advancedScoringEnabled}mangaList{customLists sectionOrder splitCompletedSectionByFormat advancedScoring advancedScoringEnabled}}}}",
            "variables": {"name":name}}

        headers = {
            "Host": "anilist.co",
            "schema": "internal",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
            "Content-Type": "application/json"}

        url = 'https://anilist.co/graphql'

        req = requests.post(url+str(r), headers=headers, json=data) 

        if "userName" in req.text:
            checked += 1
            print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Taken:       {name}")

        else: 
            checked += 1
            available += 1
            print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Available:   {name}")
            with open('external/available.txt', "a") as av:
                av.write(f'{username}\n')

data = range(0,5000)

with Pool(50) as p:
    pm = p.imap_unordered(req_split,data)
    pm = [i for i in pm if i]

标签: pythonmultithreadingpython-requests

解决方案


再把它打破一点。准备好用户名列表,然后让该req_split方法一次处理一个用户。您也可以在方法之外进行后处理req_split并避免使用全局变量。

def req_split(username):
    data = {
        "query": "mutation($name:String){CreateUser(userName:$name){id name about avatar{large}bannerImage unreadNotificationCount donatorTier donatorBadge moderatorRoles options{titleLanguage airingNotifications displayAdultContent profileColor notificationOptions{type enabled}}mediaListOptions{scoreFormat rowOrder animeList{customLists sectionOrder splitCompletedSectionByFormat advancedScoring advancedScoringEnabled}mangaList{customLists sectionOrder splitCompletedSectionByFormat advancedScoring advancedScoringEnabled}}}}",
        "variables": {"name": username}
    }
    headers = {
        "Host": "anilist.co",
        "schema": "internal",
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
        "Content-Type": "application/json"
    }
    url = 'https://anilist.co/graphql'
    req = requests.post(url, headers=headers, json=data)

    return username, "userName" in req.text


if __name__ == "__main__":
    with open(f"external/{usernameFile}", "r") as username_file:
        usernames = [line.strip() for line in username_file]

    checked_count = 0
    available_count = 0
    with Pool(50) as pool:
        for username, available in pool.imap_unordered(req_split, usernames):
            checked_count += 1
            if available:
                available_count += 1
                print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Available:   {username}")
                with open('external/available.txt', "a") as av:
                    av.write(f'{username}\n')
            else:
                print(f"{Fore.LIGHTBLACK_EX}[+]{Fore.RESET} Taken:       {username}")

推荐阅读