简道云fastapi
This commit is contained in:
@@ -0,0 +1,226 @@
|
||||
import requests
|
||||
import hashlib
|
||||
from urllib.parse import quote
|
||||
from datetime import datetime
|
||||
from app.api import API
|
||||
from typing import Optional, Dict, AnyStr
|
||||
from PIL import Image, ImageEnhance
|
||||
import pytesseract
|
||||
import logging
|
||||
from datetime import datetime
|
||||
|
||||
api_instance = API()
|
||||
logger = logging.getLogger('app')
|
||||
|
||||
|
||||
class F6Module:
|
||||
@staticmethod
|
||||
def get_captcha() -> AnyStr:
|
||||
captcha_url = 'https://yunxiu.f6car.cn/kzf6/login/captcha-image'
|
||||
response = requests.get(captcha_url)
|
||||
with open('captcha.png', 'wb') as f:
|
||||
f.write(response.content)
|
||||
|
||||
image = Image.open('captcha.png')
|
||||
enhancer = ImageEnhance.Contrast(image)
|
||||
image = enhancer.enhance(2.0)
|
||||
enhancer = ImageEnhance.Brightness(image)
|
||||
image = enhancer.enhance(1.5)
|
||||
image = image.convert('L')
|
||||
image = image.point(lambda x: 0 if x < 128 else 255, '1')
|
||||
image.save('preprocessed_captcha.png')
|
||||
|
||||
captcha_text = pytesseract.image_to_string(image)
|
||||
print(f"识别的验证码为: {captcha_text}")
|
||||
|
||||
return captcha_text
|
||||
|
||||
@staticmethod
|
||||
def login_in(username: str, password: str, company_name: str = '默认门店',) -> Optional[requests.Response]:
|
||||
url = "https://yunxiu.f6car.com/kzf6/login/confirm"
|
||||
session = requests.Session()
|
||||
header = {
|
||||
'Referer': url,
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
|
||||
'Chrome/130.0.0.0 Safari/537.36 Edg/129.0.0.0'
|
||||
}
|
||||
data = {
|
||||
'username': username,
|
||||
'password': hashlib.md5(password.encode('utf-8')).hexdigest(),
|
||||
}
|
||||
try:
|
||||
res = session.post(url=url, headers=header, data=data)
|
||||
res_json = res.json()
|
||||
|
||||
if res_json.get('message') == '请输入图形验证码':
|
||||
logger.warning("触发图形验证码")
|
||||
captcha_text = F6Module.get_captcha()
|
||||
data.update({'imageCode': captcha_text})
|
||||
res = session.post(url=url, headers=header, data=data)
|
||||
res_json = res.json()
|
||||
|
||||
if res_json.get("data") is None:
|
||||
return res
|
||||
else:
|
||||
group_id = ''
|
||||
for group in res_json.get('data', []):
|
||||
if group.get("groupName") == company_name:
|
||||
group_id = group.get("groupId")
|
||||
break
|
||||
|
||||
if not group_id:
|
||||
logger.error(f"未找到公司名称: {company_name}")
|
||||
return None
|
||||
|
||||
token = quote(res_json['token']) # URL 编码
|
||||
url = (f'https://yunxiu.f6car.cn/kzf6/user/loginAfterChooseGroup?'
|
||||
f'token={token}&groupId={group_id}&macAddress=')
|
||||
res1 = session.get(url, cookies=res.cookies)
|
||||
return res1
|
||||
except Exception as e:
|
||||
print(f"Error during login: {e}")
|
||||
return None
|
||||
|
||||
def accept_login_message(self, data: Dict[str, str]) -> Dict[str, str]:
|
||||
username = data['username']
|
||||
password = data['password']
|
||||
company_name = data['company_name']
|
||||
|
||||
res = self.login_in(username, password, company_name)
|
||||
|
||||
if res is not None:
|
||||
cookies = requests.utils.dict_from_cookiejar(res.cookies)
|
||||
json = res.json()
|
||||
url = 'https://yunxiu.f6car.cn/hive/company/getGroupName'
|
||||
res1 = requests.get(url=url, cookies=cookies)
|
||||
data1 = res1.json()
|
||||
|
||||
if data1['code'] == 200:
|
||||
if data1['data'] == company_name:
|
||||
if json['status'] == 'success':
|
||||
json['status'] = '登录成功'
|
||||
elif json['status'] == 'Error':
|
||||
json['status'] = '登录失败,请检查账号密码'
|
||||
else:
|
||||
json['status'] = '公司名称不正确或未选择公司名称,请重试'
|
||||
else:
|
||||
json['status'] = '请输入正确的账号密码并选择公司名称'
|
||||
return json
|
||||
else:
|
||||
return {"status": "登录失败,请检查公司名称"}
|
||||
|
||||
def get_company_information(self, data: Dict[str, str]) -> Dict[str, str]:
|
||||
username = data['username']
|
||||
password = data['password']
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d %H-%M-%S")
|
||||
print(username)
|
||||
|
||||
url = "https://yunxiu.f6car.com/kzf6/login/confirm"
|
||||
session = requests.Session()
|
||||
header = {
|
||||
'Referer': url,
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
|
||||
'Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0'
|
||||
}
|
||||
data = {
|
||||
'username': username,
|
||||
'password': hashlib.md5(password.encode('utf-8')).hexdigest(),
|
||||
}
|
||||
|
||||
try:
|
||||
res = session.post(url=url, headers=header, data=data)
|
||||
res_json = res.json()
|
||||
|
||||
if res_json.get('message') == '请输入图形验证码':
|
||||
pass
|
||||
|
||||
jiandaoyun_data = {'api_key': '6694d3c4fcb69ca9a111a6c4', 'entry_id': '6736e2112ad50045f041a827'}
|
||||
|
||||
if res_json.get("data") is None:
|
||||
print('单店')
|
||||
res = self.login_in(username, password)
|
||||
if res is not None:
|
||||
cookies = requests.utils.dict_from_cookiejar(res.cookies)
|
||||
url = 'https://yunxiu.f6car.cn/hive/company/getGroupName'
|
||||
res = requests.get(url=url, cookies=cookies)
|
||||
data = res.json()
|
||||
store_name = data['data']
|
||||
|
||||
jiandaoyun_data['data_list'] = [
|
||||
{"_widget_1731650067055": {"value": f'{username}{password}{timestamp}'},
|
||||
"_widget_1731650067056": {"value": f"{store_name}"}}]
|
||||
api_instance.entry_data_batch_create(jiandaoyun_data)
|
||||
res = {'msg': f'{username}{password}{timestamp}'}
|
||||
else:
|
||||
jiandaoyun_data_list = []
|
||||
for group in res_json.get('data', []):
|
||||
append_data = {"_widget_1731650067055": {"value": f'{username}{password}{timestamp}'},
|
||||
"_widget_1731650067056": {"value": f"{group['groupName']}"}}
|
||||
jiandaoyun_data_list.append(append_data)
|
||||
|
||||
jiandaoyun_data['data_list'] = jiandaoyun_data_list
|
||||
|
||||
res = api_instance.entry_data_batch_create(jiandaoyun_data)
|
||||
|
||||
print(res)
|
||||
|
||||
res = {'msg': f'{username}{password}{timestamp}'}
|
||||
return res
|
||||
|
||||
except Exception as e:
|
||||
print(f"获取公司名称失败: {e}")
|
||||
res = {'msg': '获取公司名称失败,请重新获取'}
|
||||
return res
|
||||
|
||||
def get_store_information(self, data: Dict[str, str]) -> Dict[str, dict[str, str]]:
|
||||
username = data['username']
|
||||
password = data['password']
|
||||
company_name = data['company_name']
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d %H-%M-%S")
|
||||
|
||||
login_response = self.login_in(username, password, company_name)
|
||||
if login_response is None:
|
||||
return {"msg": {'msg': '未执行', 'msg_details': '登录失败'}}
|
||||
|
||||
cookies = requests.utils.dict_from_cookiejar(login_response.cookies)
|
||||
|
||||
url = 'https://yunxiu.f6car.cn/hive/org/getPageOrgGroupMembers?currentPage=1&pageSize=100&name='
|
||||
res = requests.get(url=url, cookies=cookies)
|
||||
data = res.json()
|
||||
org_lists = data['data']['list']
|
||||
|
||||
url = 'https://yunxiu.f6car.cn/member/car/carListForPermission'
|
||||
json = {"pageSize": 10, "pageNo": 1}
|
||||
car_res = requests.post(url=url, json=json, cookies=cookies)
|
||||
total_cars_data = car_res.json()
|
||||
total_cars = total_cars_data['data']['total']
|
||||
|
||||
url = 'https://yunxiu.f6car.cn/member/customer/listForPermission?pageSize=10&pageNo=1'
|
||||
customer_res = requests.get(url=url, cookies=cookies)
|
||||
total_customer_data = customer_res.json()
|
||||
total_customer = total_customer_data['data']['total']
|
||||
|
||||
jiandaoyun_data = {'api_key': '6694d3c4fcb69ca9a111a6c4',
|
||||
'entry_id': '673c38ccca57a5cf266eb18c'}
|
||||
|
||||
jiandaoyun_data_list = []
|
||||
for org in org_lists:
|
||||
append_data = {"_widget_1731999948708": {"value": f'{username}{password}{company_name}{timestamp}'},
|
||||
"_widget_1731999948709": {"value": f"{org['orgName']}"}}
|
||||
jiandaoyun_data_list.append(append_data)
|
||||
|
||||
jiandaoyun_data['data_list'] = jiandaoyun_data_list
|
||||
|
||||
api_instance.entry_data_batch_create(jiandaoyun_data)
|
||||
|
||||
res = {'msg': {"msg": f'{username}{password}{company_name}{timestamp}',
|
||||
"total_cars": f"{total_cars}条客户车辆",
|
||||
"total_customer": f"{total_customer}条客户"}}
|
||||
|
||||
return res
|
||||
|
||||
@staticmethod
|
||||
def get_keep_heart(data: Dict[str, str]) -> Dict[str, str]:
|
||||
return data
|
||||
|
||||
|
||||
Reference in New Issue
Block a user