当前位置: 首页 > news >正文

Python 自动化脚本系列:第1集

昨天写了一篇介绍如何使用Python实现自动化任务的,文章末尾介绍了一个简单的自动化脚本,因此今天编号从2开始。顺便附上昨天的文章链接:

Python 自动化脚本系列:介绍

欢迎关注博主,持续输出更多Python相关内容,一起学习进步。

2. 用 PyAutoGUI 自动化任务

PyAutoGUI 是一个 Python 库,允许你通过控制鼠标和键盘来自动化 GUI(图形用户界面)任务。它提供了一个简单直观的 API,用于模拟用户与图形用户界面的交互。利用 PyAutoGUI,你可以自动执行重复性任务,比如填写表单、点击按钮、输入文本和截屏。它支持跨平台自动化,兼容于 Windows、macOS 和 Linux。下面是一个使用 PyAutoGUI 自动执行简单任务的示例:


import pyautogui  
import time  # 等待 2 秒钟,让用户切换到所需窗口  
time.sleep(2)  
# 打开文本编辑器(假设它在 macOS 的应用程序文件夹中)  
pyautogui.press('command')  
pyautogui.typewrite('space')  
pyautogui.typewrite('textedit')  
pyautogui.press('enter')  
# 等待文本编辑器打开  
time.sleep(2)  
# 输入消息  
pyautogui.typewrite('Hello, World!')  
# 保存文件  
pyautogui.hotkey('command', 's')  
pyautogui.typewrite('message.txt')  
pyautogui.press('enter')  
# 关闭文本编辑器  
pyautogui.hotkey('command', 'q')

PyAutoGUI 提供了许多鼠标和键盘控制的函数,包括移动鼠标、点击、拖拽、输入文本和按键。它还提供图像识别功能,允许你定位并与屏幕上的特定图形元素进行交互。PyAutoGUI 特别适用于自动化涉及与桌面应用程序交互或在多个软件工具之间执行重复操作的任务。

3. 使用 Pandas 自动化数据分析

Pandas 是一个功能强大的 Python 库,用于数据处理和分析。它提供了数据结构和函数,使得处理结构化数据(如电子表格或 SQL 数据库中的表格数据)变得简单。通过 Pandas,你可以自动执行各种数据分析任务,包括数据清洗、转换、筛选、聚合和可视化。它与其他 Python 库(如 NumPy 用于数值计算和 Matplotlib 用于数据可视化)结合良好。下面是一个使用 Pandas 自动分析包含销售数据的 CSV 文件的示例:


import pandas as pd  # 读取 CSV 文件到 DataFrame  
df = pd.read_csv('sales_data.csv')  
# 显示 DataFrame 的前几行  
print(df.head())  
# 按产品类别计算总销售额  
sales_by_category = df.groupby('Category')['Sales'].sum()  
print(sales_by_category)  
# 过滤 DataFrame,只包括销售额高于一定阈值的行  
high_sales = df[df['Sales'] > 1000]  
print(high_sales)  
# 基于条件创建新列  
df['Discount'] = df['Price'].apply(lambda x: 0.1 if x > 50 else 0)  
print(df.head())  
# 将修改后的 DataFrame 保存到新的 CSV 文件  
df.to_csv('updated_sales_data.csv', index=False)

在这个示例中,使用 Pandas 将 CSV 文件读取到 DataFrame 中,DataFrame 是一个二维带标签的数据结构。然后我们可以对 DataFrame 执行各种操作,比如显示前几行、按产品类别计算总销售额、基于条件过滤行、创建新列,并将修改后的数据保存到新的 CSV 文件中。Pandas 提供了许多用于数据操作的函数,包括合并、重塑和聚合数据。它还支持处理缺失数据、处理时间序列数据和执行统计分析。通过利用 Pandas,你可以自动执行重复性的数据分析任务,节省时间和精力,从大型数据集中提取见解。

4. 使用 PyTest 进行测试自动化

测试自动化对于确保软件应用程序的质量和可靠性至关重要。Python 提供了几个测试框架,其中最流行和功能丰富的框架之一是 PyTest。PyTest 是一个测试框架,它简化了编写和运行 Python 代码的测试。它为定义测试用例、断言和测试固件提供了简单和表达性的语法。PyTest 支持各种类型的测试,包括单元测试、集成测试和功能测试。下面是一个使用 PyTest 自动化测试简单 Python 函数的示例:


# calculator.py  
def add(a, b):  return a + b  def subtract(a, b):  return a - b  
# test_calculator.py  
import pytest  
from calculator import add, subtract  
def test_add():  assert add(2, 3) == 5  assert add(-1, 1) == 0  assert add(0, 0) == 0  
def test_subtract():  assert subtract(5, 3) == 2  assert subtract(-1, 1) == -2  assert subtract(0, 0) == 0  
def test_add_invalid_input():  with pytest.raises(TypeError):  add('2', 3)  
def test_subtract_invalid_input():  with

5. 演示:用于文件组织的 Python 脚本

为了展示 Python 自动化的强大功能,让我们通过一个实际的例子来演示如何自动组织文件。假设你有一个文件夹,其中包含各种文件 — 文档、图片、视频等。手动将这些文件分类到适当的子文件夹中可能是一个繁琐的任务。然而,通过一个 Python 脚本,我们可以轻松地自动完成这个任务。下面

是一个样本 Python 脚本,根据文件扩展名来组织文件:


import os  
import shutil  # 定义主文件夹路径  
main_folder = "/path/to/your/folder"  
# 为不同类型的文件创建子文件夹  
subfolders = {  "Documents": [".pdf", ".doc", ".docx", ".txt"],  "Images": [".jpg", ".jpeg", ".png", ".gif"],  "Videos": [".mp4", ".avi", ".mov"],  "Audio": [".mp3", ".wav", ".aac"],  "Others": []  
}  
# 遍历主文件夹中的文件  
for filename in os.listdir(main_folder):  file_path = os.path.join(main_folder, filename)  # 检查是否为文件(而不是文件夹)  if os.path.isfile(file_path):  # 获取文件扩展名  _, extension = os.path.splitext(filename)  # 确定适当的子文件夹  subfolder = "Others"  for folder, extensions in subfolders.items():  if extension.lower() in extensions:  subfolder = folder  break  # 如果子文件夹不存在,则创建它  subfolder_path = os.path.join(main_folder, subfolder)  os.makedirs(subfolder_path, exist_ok=True)  # 将文件移动到适当的子文件夹中  destination_path = os.path.join(subfolder_path, filename)  shutil.move(file_path, destination_path)  print(f"Moved {filename} to {subfolder} folder.")

让我们逐步解释这个脚本:

  1. 我们导入所需的模块:os 用于文件和目录操作,shutil 用于文件移动。
  2. 我们使用 main_folder 变量定义包含要组织的文件的文件夹路径。
  3. 我们创建一个名为 subfolders 的字典,将子文件夹名称映射到相应文件扩展名列表。“Others” 子文件夹用于未指定扩展名的文件。
  4. 我们使用 os.listdir() 遍历主文件夹中的每个文件。
  5. 对于每个文件,我们使用 os.path.isfile() 检查它是否为文件(而不是文件夹)。
  6. 我们使用 os.path.splitext() 提取文件扩展名。
  7. 我们根据扩展名检查文件应该归属的子文件夹,并将其移动到该子文件夹中。
  8. 最后,我们打印一条消息,指示文件的移动操作。

这个脚本演示了 Python 如何自动根据文件扩展名组织文件。通过运行这个脚本,指定文件夹中的所有文件将自动排序到适当的子文件夹中,节省你的时间和精力。

6. 自动发送电子邮件

Python 提供了 smtplib 模块用于通过 SMTP(简单邮件传输协议)发送电子邮件。你可以自动化发送电子邮件的任务,比如发送通知、报告或个性化消息。

示例:发送个性化电子邮件

假设你有一个收件人列表,并想向每个人发送个性化电子邮件。下面是如何使用 Python 自动化这个任务的示例:


import smtplib  
from email.mime.text import MIMEText  
from email.mime.multipart import MIMEMultipart  sender_email = 'your_email@example.com'  
sender_password = 'your_email_password'  recipients = [  {'name': 'John Doe', 'email': 'john@example.com'},  {'name': 'Jane Smith', 'email': 'jane@example.com'},  {'name': 'Mike Johnson', 'email': 'mike@example.com'}  
]  for recipient in recipients:  message = MIMEMultipart()  message['From'] = sender_email  message['To'] = recipient['email']  message['Subject'] = 'Personalized Email'  body = f"Dear {recipient['name']},\n\nThis is a personalized email just for you!"  message.attach(MIMEText(body, 'plain'))  server = smtplib.SMTP('smtp.example.com', 587)  server.starttls()  server.login(sender_email, sender_password)  server.send_message(message)  server.quit()

这段代码创建了一个包含收件人姓名和电子邮件地址的收件人列表。然后,它遍历收件人并使用 email 模块中的 MIMEMultipartMIMEText 类构建了每个收件人的个性化电子邮件。电子邮件包含了一个个性化的问候语。最后,它建立与 SMTP 服务器的连接,使用发件人的凭据登录,发送电子邮件,然后关闭连接。

7. 使用 Selenium 自动化 Web 浏览器交互

Selenium 是一个强大的工具,用于自动化 Web 浏览器交互。它允许你模拟用户操作,比如点击按钮、填写表单和在页面之间导航。Selenium 的 Python 绑定提供了一种方便的方式来自动化基于 Web 的任务。

示例:自动化 Web 表单提交

假设你想自动填写并提交一个 Web 表单的过程。下面是如何使用 Selenium 实现这一目标的示例:


from selenium import webdriver  
from selenium.webdriver.common.by import By  
from selenium.webdriver.support.ui import Select  # 创建一个 Chrome 驱动器的新实例  
driver = webdriver.Chrome()  # 导航到 Web 表单页面  
driver.get('https://example.com/form')  # 填写表单字段  
name_field = driver.find_element(By.NAME, 'name')  
name_field.send_keys('John Doe')  email_field = driver.find_element(By.NAME, 'email')  
email_field.send_keys('john@example.com')  country_select = Select(driver.find_element(By.NAME, 'country'))  
country_select.select_by_visible_text('United States')  # 提交表单  
submit_button = driver.find_element(By.XPATH, '//button[@type="submit"]')  
submit_button.click()  # 关闭浏览器  
driver.quit()

这段代码使用 Selenium 自动化填写和提交 Web 表单的过程。它创建一个 Chrome 驱动器的新实例,导航到表单页面,使用各种定位策略(如 By.NAMEBy.XPATH)定位表单字段,并填写所需的值,最后点击提交按钮。最后,它关闭了浏览器。

8. 使用 Python 进行任务调度和自动化

Python 提供了几个用于调度和自动化任务的库和工具,如 schedule 库和 cron 实用程序。这些工具允许你在特定时间间隔或指定时间运行 Python 脚本。

示例:调度每日任务

假设你想在每天特定的时间运行一个 Python 脚本。下面是如何使用 schedule 库实现这一目标的示例:


import schedule  
import time  def daily_task():  # 每日任务的代码放在这里  print("Running daily task...")  schedule.every().day.at("09:00").do(daily_task)  while True:  schedule.run_pending()  time.sleep(1)

这段代码定义了一个名为 daily_task() 的函数,其中包含你想要每天运行的任务代码。然后,它使用 schedule 库将任务调度为每天上午 9 点运行。while 循环不断检查待定的调度任务,并在其指定的时间运行它们。time.sleep(1) 语句介绍了每次检查之间的一秒延迟,以防止过多的 CPU 使用。

9. 使用 openpyxl 自动化 Excel 操作

Python 提供了 openpyxl 库,用于自动化 Microsoft Excel 操作,如读写数据、格式化单元格和执行计算。它允许你以编程方式与 Excel 文件交互。

示例:更新 Excel 电子表格数据

假设你有一个包含数据的 Excel 电子表格,并且想根据某些条件更新特定的单元格。下面是如何使用 openpyxl 自动化这个任务的示例:


from openpyxl import load_workbook  # 加载 Excel 工作簿  
workbook = load_workbook('data.xlsx')  
sheet = workbook.active  # 根据条件更新单元格值  
for row in sheet.iter_rows(min_row=2, values_only=True):  if row[1] > 100:  sheet.cell(row=row[0], column=3).value = 'High'  else:  sheet.cell(row=row[0], column=3).value = 'Low'  # 保存更新后的工作簿  
workbook.save('updated_data.xlsx')

这段代码使用 load_workbook() 方法从现有的 Excel 工作簿中加载工作簿。然后,它使用 iter_rows() 方法迭代从第二行开始的每一行,并根据条件更新第三列的单元格值。最后,它将更新后的工作簿保存到一个新文件中。

10. 使用 PyPDF2 自动化 PDF 操作

Python 提供了 PyPDF2 库,用于自动化 PDF 文件的操作,比如合并、拆分和提取文本。它允许你以编程方式操作 PDF 文档。

示例:合并 PDF 文件

假设你有多个 PDF 文件,想将它们合并成一个 PDF 文档。下面是如何使用 PyPDF2 实现这一目标的示例:


from PyPDF2 import PdfMerger  # 创建一个 PdfMerger 对象  
merger = PdfMerger()  # 要合并的 PDF 文件列表  
pdf_files = ['file1.pdf', 'file2.pdf', 'file3.pdf']  # 将每个 PDF 文件附加到合并器对象  
for pdf_file in pdf_files:  merger.append(pdf_file)  # 将合并后的 PDF 写入到一个新文件中  
merger.write("merged.pdf")  
merger.close()

这段代码从 PyPDF2 库中创建了一个 PdfMerger 对象。然后,它指定了一个要合并的 PDF 文件列表。它遍历每个 PDF 文件,并使用 append() 方法将其附加到合并器对象中。最后,

它使用 write() 方法将合并后的 PDF 写入到一个新文件中。

这些 Python 库和工具提供了强大的功能,可以帮助你自动化各种任务,从文件操作和数据分析到 Web 浏览器交互和电子邮件发送。通过利用这些工具,你可以提高工作效率,减少重复性任务的时间和精力消耗。

总结

今天我们学习了10个Python自动化脚本,其中包括对excel、pdf等文件的操作,熟悉了如何使用python实现邮件自动化,如何自动化操作界面以及实现浏览器操作等,希望能对你的日常有所帮助。

欢迎关注博主带来更多python自动化脚本。

相关文章:

Python 自动化脚本系列:第1集

昨天写了一篇介绍如何使用Python实现自动化任务的,文章末尾介绍了一个简单的自动化脚本,因此今天编号从2开始。顺便附上昨天的文章链接: Python 自动化脚本系列:介绍 欢迎关注博主,持续输出更多Python相关内容&#…...

基于PHP开发的图片高清无损在线压缩源码系统 带完整源代码以及搭建教程

系统概述 高清无损在线压缩源码系统基于PHP语言开发,结合GD库和ImageMagick等图像处理工具,实现了对JPEG、PNG、GIF等多种图片格式的高清无损压缩。系统采用B/S架构,用户只需通过浏览器访问系统界面,即可实现图片的上传、压缩、预…...

Linux提权--SUDO(CVE-2021-3156)Polkit(CVE-2021-4034)

免责声明:本文仅做技术学习与交流... 目录 SUDO(CVE-2021-3156) 影响版本 -判断: -利用: Polkit(CVE-2021-4034) ​ -判断: -利用: 添加用户 SUDO(CVE-2021-3156) another: SUDO权限配置不当. 影响版本 由系统的内核和发…...

nodejs里面的 http 模块介绍和使用

Node.js的HTTP模块是一个核心模块,它提供了很多功能来创建HTTP服务器和发送HTTP请求。 http.Server是一个基于事件的http服务器,内部是由c实现的,接口是由JavaScript封装。 http.request是一个http客户端工具。 用户向服务器发送数据。 创…...

MVC框架简易实现【精细】

目录 mvc 的架构 MVC 框架 传统web开发的弊端 1.创建一个maven项目 2.添加maven依赖 3.创建TomCatService类 3.1 创建TomcatService类 3.2 TomcatService类讲解 3.3 安装项目到本地仓库,给其他项目使用 4.测试启动Tomcat 4.1 创建一个新的maven项目 4.2 引用…...

Java入门基础学习笔记18——赋值运算符

赋值运算符: 就是“”,就是给变量赋值的,从右边往左边看。 int a 10; // 把数据赋值给左边的变量a存储。 扩展赋值运算符: 注意:扩展的赋值运算符隐含了强制类型转换。 package cn.ensource.operator;public class…...

csv 可视化 python代码

excel查看csv后,csv就被锁定了,不能修改,用pyqt写一个csv查看工具,拖拽查看,非常方便 目录 第2版,提升加载速度 选中单元格统计个数,求和,平均值...

HashMap 和 Hashtable区别的底层原理

一、容器键值对: 1.HashMap 的 key 和 value 都允许为 null , HashMap 在 key 为 null 的时候,值必须为null。 2.Hashtable 的 key 和 value 都不允许为 null 。 Hashtable 遇到key或value为 null时 ,将抛出 NullPointerException…...

代码随想录35期Day32-Java

Day32题目 LeetCode122.买股票的最佳时机 核心思想:很简单,只要第二天比第一天贵,就第一天买入,第二天卖出 class Solution {public int maxProfit(int[] prices) {// 只要后一天比这一天价钱高就买,然后第二天卖出…...

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节(joint)和连杆(link)组成),此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中,关节一般有无限旋转(continuous),有限旋转…...

【第66例】IPD体系进阶:华为IPD发展历程

目录 简介 样例 作者简介 简介 想要引入 IPD,首先就要思考一些问题: 跟我的企业适配吗? 流程会不会太重了? 一定要引入吗,有没有其他方式? 从目前大的环境来说。 中国制造业正在由“中国制造”向“中国创造”转变。 这也是企业价值转移的趋势。 宏碁集团创始人施振…...

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库,所以我们应…...

C语言笔记10

1.用指针打印一维数组 //1.用指针打印一维数组 #include <stdio.h> int main() {//int arr[] { 1,2,3,4,5 };int arr[5] { 0 };int* p &arr[0];int sz sizeof(arr) / sizeof(arr[0]);for (int i 0; i < sz; i){scanf("%d", &arr[i]);}//int* …...

BMS-HiL主要功能

BMS HIL 系统中 PC 机中安装实验管理软件用于测试过程管理和测试序列编辑&#xff0c;通过以太网与 PXI 机箱中的处理器进行连接&#xff0c;处理器中运行实时系统&#xff08;Real Time&#xff09;并安装 Veristand 终端引擎&#xff0c;通过与 PC 中的数据传输&#xff0c;对…...

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件&#xff0c;直接打开pom.xml文件&#xff0c;然后添加到maven就行...

C语言笔记12

1.使用qsort函数进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h>//void qsort(void* base, //指向待排序数组的第一个元素的指针 // size_t num, //base指向数组中的元素个数 // size_t size,//base指向的数组中一…...

说一下 hibernate 的缓存机制?

Hibernate 的缓存机制是为了提高应用程序的性能&#xff0c;通过减少对数据库物理数据源的访问频次而设计的。Hibernate 的缓存主要可以分为两个级别&#xff1a;一级缓存&#xff08;也称为 Session 级别的缓存&#xff09;和二级缓存&#xff08;也称为 SessionFactory 级别的…...

Mac安装jadx

1、使用命令brew安装 : brew install jadx 输入完命令,等待安装完毕 备注&#xff08;关于Homebrew &#xff09;&#xff1a; Homebrew 是 MacOS 下的包管理工具&#xff0c;类似 apt-get/apt 之于 Linux&#xff0c;yum 之于 CentOS。如果一款软件发布时支持了 homebrew 安…...

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…...

调用函数实现数组的输入排序插入与输出

输入一串数字&#xff0c;输出排序插入后输出最后的数字序列&#xff1b; 把主要步骤交给主函数&#xff0c;通过调用函数来实现整体的功能&#xff1a; 写出主函数&#xff08;这里使用冒泡排序&#xff09;&#xff1a; int main(){int n;int a[10];cin>>n;inputa(a…...

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树 文章目录 代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树343. 整数拆分一、动态规划二、贪心&#xff08;不需要掌握&#xff09; 96.不同的二叉搜索树一…...

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中&#xff0c;合合信息智能…...

上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字

题目描述 给定两个正整数 &#x1d45b;n 与 &#x1d451;d &#xff0c;请找到所有最接近 &#x1d45b;n 且是 &#x1d451;d 的倍数的整数。 输入格式 第一行&#xff1a;单个整数表示 &#x1d45b;n第二行&#xff1a;单个整数表示 &#x1d451;d 输出格式 若干行…...

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进&#xff0c;企业对于智能化、自动化的需求日益增长&#xff0c;RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中&#xff0c;RFID技术可以帮助企业获得竞争优势&#xff0c;简化日益复杂的生产流程&#xff0c;推动企业…...

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…...

pc端的鼠标箭头变换

<div style"cursor:pointer"></div>...

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2

ICode国际青少年编程竞赛- Python-2级训练场-for循环练习2 1、 for i in range(5):Dev.step(9 - i * 2)Dev.turnLeft()2、 for i in range(3):Spaceship.step(i 1)Spaceship.turnRight()Spaceship.step(i 1)Spaceship.turnLeft()3、 for i in range(4):Dev.step(10 - i…...

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置

RiPro主题美化【支付弹窗底部提示语根据入口不同有不同的提示】ritheme主题美化RiProV2 增加支付提示语,按支付类型不同,入口不同提示语不同的设置 背景: 接上文:https://www.uu2id.com/827.html 付费组件在以下几个地方会弹出:1)文章隐藏内容付费;2)付费资源下载;3…...

MSMQ消息队列

MQ是一种企业服务的消息中间节技术&#xff0c;这种技术常常伴随着企业服务总线相互使用&#xff0c;构成了企业分布式开发的一部分&#xff0c;如果考虑到消息的发送和传送之间是可以相互不联系的并且需要分布式架构&#xff0c;则可以考虑使用MQ做消息的中间价技术&#xff0…...

树莓派nmap扫描

debian系统安装nmap&#xff1a; sudo apt install nmap安装nmap完成后&#xff0c;输入 ip route 来查看当前Wi-Fi路由器的ip地址。 第一行的default via后显示的便是网关地址&#xff0c;也就是路由器地址。 获取到路由器ip地址后&#xff0c;在终端中输入&#xff1a; …...