import time from PIL import Image import pytesseract import requests headers = { "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15" } image_url = 'https://passport.tuniu.com/ajax/captcha/v/1686143661230.3367' # 下载验证码图片 session = requests.Session() # 使用session是为了保证验证码的请求和登陆请求信息一致 for i in range(10): r = session.get(image_url, headers=headers) with open('images/code' + str(i) + '.jpg', 'wb') as fp: fp.write(r.content) time.sleep(1) print('下载完成第' + str(i) + '张!') # 依次识别并保存到文件中 # 进行二值处理 def erzhihua(image, threshold): ''':type image:Image.Image''' image = image.convert('L') table = [] for i in range(256): if i < threshold: table.append(0) else: table.append(1) return image.point(table, '1') # 对刚才保存的10张图片进行识别 for i in range(10): im = Image.open('images/code' + str(i) + '.jpg') im = im.convert('L') im = erzhihua(im, 127) im.show() result = pytesseract.image_to_string(im, lang='eng') print(result),这段代码报了这样的错误,Traceback (most recent call last): File "C:\Users\鲸阿丫丫\Desktop\鍥剧墖楠岃瘉淇℃伅\鐖彇鍥剧墖楠岃瘉淇℃伅.py", line 36, in <module> im = Image.open('images/code' + str(i) + '.jpg') File "D:\download\andconda\lib\site-packages\PIL\Image.py", line 3030, in open raise UnidentifiedImageError( PIL.UnidentifiedImageError: cannot identify image file 'images/code0.jpg'
时间: 2024-03-14 14:49:38 浏览: 19
这个错误是因为代码无法找到名为'images/code0.jpg'的文件。请确保该文件位于与脚本相同的目录中,并且文件名和路径名均正确。你可以使用以下代码检查文件是否存在:
```
import os.path
if not os.path.isfile('images/code0.jpg'):
print('文件不存在')
else:
print('文件存在')
```
如果文件存在,你可以尝试打印出文件的路径来检查路径是否正确。
相关问题
import requests import pyautogui from PIL import Image from pyzbar.pyzbar import decode # 登录请求的URL url = 'https://bbs.mihoyo.com/apihub/api/user/auth' # 请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Referer': 'https://bbs.mihoyo.com/', 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/json;charset=UTF-8'} # 截取屏幕并保存为图片 screenshot = pyautogui.screenshot() screenshot.save('screenshot.png') # 加载图片并解析二维码 image = Image.open('screenshot.png') decoded = decode(image) # 输出二维码内容 if decoded: print(decoded[0].data.decode('utf-8')) else: print('未找到二维码') # 账号和密码 username = '18110615228' password = 'password' # 构造请求体 data = { 'account': username, 'password': password, 'autoLogin': False} # 发送登录请求 response = requests.post(url, json=data, headers=headers) # 判断登录是否成功 if response.status_code == 200: print('登录成功') else: print('登录失败')
可以将截屏并解析二维码的代码封装成一个函数,代码如下:
```python
import requests
import pyautogui
from PIL import Image
from pyzbar.pyzbar import decode
def decode_qr_code():
# 截取屏幕并保存为图片
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')
# 加载图片并解析二维码
image = Image.open('screenshot.png')
decoded = decode(image)
# 输出二维码内容
if decoded:
return decoded[0].data.decode('utf-8')
else:
return None
```
然后,在主函数中调用该函数获取二维码信息,代码如下:
```python
# 登录请求的URL
url = 'https://bbs.mihoyo.com/apihub/api/user/auth'
# 请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer': 'https://bbs.mihoyo.com/',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json;charset=UTF-8'
}
# 账号和密码
username = '18110615228'
password = 'password'
# 构造请求体
data = {
'account': username,
'password': password,
'autoLogin': False
}
# 获取二维码信息
qr_code = decode_qr_code()
if qr_code:
# 将二维码信息添加到请求体中
data['qrCode'] = qr_code
# 发送登录请求
response = requests.post(url, json=data, headers=headers)
# 判断登录是否成功
if response.status_code == 200:
print('登录成功')
else:
print('登录失败')
else:
print('未找到二维码')
```
这样就能够大大提高代码的可读性和维护性。
优化代码:import requests import pyautogui from PIL import Image from pyzbar.pyzbar import decode while True: def decode_qr_code(): # 截取屏幕并保存为图片 screenshot = pyautogui.screenshot() screenshot.save('screenshot.png') # 加载图片并解析二维码 image = Image.open('screenshot.png') decoded = decode(image) # 输出二维码内容 if decoded: return decoded[0].data.decode('utf-8') else: return None # 登录请求的URL url = 'https://bbs.mihoyo.com/apihub/api/user/auth' # 请求头信息 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', 'Referer': 'https://bbs.mihoyo.com/', 'X-Requested-With': 'XMLHttpRequest', 'Content-Type': 'application/json;charset=UTF-8'} # 账号和密码 username = '18110615228'password = 'password' # 构造请求体 data = { 'account': username, 'password': password, 'autoLogin': False } # 获取二维码信息 qr_code = decode_qr_code() if qr_code: #将二维码信息添加到请求体中 data['qrCode'] = qr_code #发送登录请求 response = requests.post(url, json=data, headers=headers) # 判断登录是否成功 if response.status_code == 200: print('登录成功') break else: print('登录失败') else: print('未找到二维码')
可以优化的地方有:
1. 每次循环都定义一个函数 `decode_qr_code()`,可以将其定义在循环外部,避免重复定义。
2. 每次循环都截取屏幕并保存为图片,可以将其放到 `decode_qr_code()` 函数中,避免重复截屏。
3. 每次循环都加载图片并解析二维码,可以将其放到 `decode_qr_code()` 函数中,避免重复解析。
4. 账号和密码可以通过命令行参数或配置文件传入,避免硬编码。
综上,可以将代码优化为:
```python
import argparse
import requests
import pyautogui
from PIL import Image
from pyzbar.pyzbar import decode
def decode_qr_code():
# 截取屏幕并保存为图片
screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')
# 加载图片并解析二维码
image = Image.open('screenshot.png')
decoded = decode(image)
# 输出二维码内容
if decoded:
return decoded[0].data.decode('utf-8')
else:
return None
def login(username, password):
# 登录请求的URL
url = 'https://bbs.mihoyo.com/apihub/api/user/auth'
# 请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer': 'https://bbs.mihoyo.com/',
'X-Requested-With': 'XMLHttpRequest',
'Content-Type': 'application/json;charset=UTF-8'
}
# 构造请求体
data = {
'account': username,
'password': password,
'autoLogin': False
}
# 获取二维码信息
qr_code = decode_qr_code()
if qr_code:
# 将二维码信息添加到请求体中
data['qrCode'] = qr_code
# 发送登录请求
response = requests.post(url, json=data, headers=headers)
# 判断登录是否成功
if response.status_code == 200:
print('登录成功')
return True
else:
print('登录失败')
return False
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='登录米游社论坛')
parser.add_argument('username', help='账号')
parser.add_argument('password', help='密码')
args = parser.parse_args()
login(args.username, args.password)
```