python - 如何使用线程在文本文件中每行发布请求
问题描述
我针对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]
解决方案
再把它打破一点。准备好用户名列表,然后让该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}")
推荐阅读
- flutter - 如何获取谷歌地图颤振插件中标记的点的位置?
- mysql - 如何在 SQL 中禁用 reapte concat?
- java - 如何为 TypeConverters 使用 camel-package-maven-plugin 3.7.0
- javascript - 用scalajs中的方法实现JS函数
- c++ - 只返回构造函数的函数
- spring-boot - 将 Spring Boot 从 2.2.2.Release 升级到 2.4.2 Rlease 的问题
- node.js - NPM package.json 中的自定义脚本被忽略,作为独立运行
- python - 命令只做一个功能
- vue.js - 将 pdfjslib 导入 vuejs 组件
- php - 在 WooCommerce 中创建订单时获取订单商品的库存状态