分类目录归档:未分类

标准ES-POS命令打印,固定IP或蓝牙打印,支持黑白图片打印

Icon

ESC-POS命令打印辅助库

源码地址:ProjectX

介绍

标准ESC-POS命令打印,固定IP或蓝牙打印,支持黑白图片打印。 其中PrintCommands类列出了基本所有的ESC-POS打印命令。 打印指令参考自Commande ESCPOS.pdf文档。

截图

Screenshotsxample

先决条件

  • minSdkVersion 5
  • <uses-permission android:name="android.permission.INTERNET" />
  • <uses-permission android:name="android.permission.BLUETOOTH" />

入门

引用:

dependencies {
    ...
    implementation 'am.util:printer:2.1.0'
    ...
}

添加权限:

添加蓝牙权限<uses-permission android:name="android.permission.BLUETOOTH" />或者网络请求权限<uses-permission android:name="android.permission.INTERNET" />

实现接口:

实现PrintDataMaker接口,完成具体打印任务:

public class TestPrintDataMaker implements PrintDataMaker {

    private Context context;
    private String qr;
    private int width;
    private int height;

    public TestPrintDataMaker(Context context, String qr, int width, int height) {
        this.context = context;
        this.qr = qr;
        this.width = width;
        this.height = height;
    }

    @Override
    public List<byte[]> getPrintData(int type) {
        ArrayList<byte[]> data = new ArrayList<>();
        try {
            PrinterWriter printer;
            printer = type == PrinterWriter58mm.TYPE_58 ? new PrinterWriter58mm(height, width) : new PrinterWriter80mm(height, width);
            printer.setAlignCenter();
            data.add(printer.getDataAndReset());

            ArrayList<byte[]> image1 = printer.getImageByte(context.getResources(), R.drawable.ic_printer_logo);
            data.addAll(image1);

            printer.setAlignLeft();
            printer.printLine();
            printer.printLineFeed();

            printer.printLineFeed();
            printer.setAlignCenter();
            printer.setEmphasizedOn();
            printer.setFontSize(1);
            printer.print("我的餐厅");
            printer.printLineFeed();
            printer.setFontSize(0);
            printer.setEmphasizedOff();
            printer.printLineFeed();

            printer.print("最时尚的明星餐厅");
            printer.printLineFeed();
            printer.print("客服电话:400-8008800");
            printer.printLineFeed();

            printer.setAlignLeft();
            printer.printLineFeed();

            printer.print("订单号:88888888888888888");
            printer.printLineFeed();

            printer.print("预计送达:" +
                    new SimpleDateFormat("yyyy/MM/dd HH:mm", Locale.getDefault())
                            .format(new Date(System.currentTimeMillis())));
            printer.printLineFeed();

            printer.setEmphasizedOn();
            printer.print("#8(已付款)");
            printer.printLineFeed();
            printer.print("××区××路×××大厦××楼×××室");
            printer.printLineFeed();
            printer.setEmphasizedOff();
            printer.print("13843211234");
            printer.print("(张某某)");
            printer.printLineFeed();
            printer.print("备注:多加点辣椒,多加点香菜,多加点酸萝卜,多送点一次性手套");
            printer.printLineFeed();

            printer.printLine();
            printer.printLineFeed();

            printer.printInOneLine("星级美食(豪华套餐)×1", "¥88.88", 0);
            printer.printLineFeed();
            printer.printInOneLine("星级美食(限量套餐)×1", "¥888.88", 0);
            printer.printLineFeed();
            printer.printInOneLine("餐具×1", "¥0.00", 0);
            printer.printLineFeed();
            printer.printInOneLine("配送费", "免费", 0);
            printer.printLineFeed();

            printer.printLine();
            printer.printLineFeed();

            printer.setAlignRight();
            printer.print("合计:977.76");
            printer.printLineFeed();
            printer.printLineFeed();

            printer.setAlignCenter();

            data.add(printer.getDataAndReset());

            String bitmapPath = FileUtils.getExternalFilesDir(context, "Temp") + "tmp_qr.jpg";
            if (QRCodeUtil.createQRImage(qr, 380, 380, null, bitmapPath)) {
                ArrayList<byte[]> image2 = printer.getImageByte(bitmapPath);
                data.addAll(image2);
            } else {
                ArrayList<byte[]> image2 = printer
                        .getImageByte(context.getResources(), R.drawable.ic_printer_qr);
                data.addAll(image2);
            }

            printer.printLineFeed();
            printer.print("扫一扫,查看详情");
            printer.printLineFeed();
            printer.printLineFeed();
            printer.printLineFeed();
            printer.printLineFeed();
            printer.printLineFeed();

            printer.feedPaperCutPartial();

            data.add(printer.getDataAndClose());
            return data;
        } catch (Exception e) {
            return new ArrayList<>();
        }
    }
}

准备打印:

创建打印执行者:

PrintExecutor executor = new PrintExecutor(String ip, int port, int type);
PrintExecutor executor = new PrintExecutor(BluetoothDevice device, int type);

设置执行者状态监听(非必须):

executor.setOnStateChangedListener(new PrintSocketHolder.OnStateChangedListener() {
    @Override
    public void onStateChanged(int state) {
        switch (state) {
            case PrintSocketHolder.STATE_0:
                //生成打印页面数据...
                break;
            case PrintSocketHolder.STATE_1:
                //生成数据成功,开始创建Socket连接...
                break;
            case PrintSocketHolder.STATE_2:
                //创建Socket成功,开始获取输出流...
                break;
            case PrintSocketHolder.STATE_3:
                //获取输出流成功,开始写入打印页面数据...
                break;
            case PrintSocketHolder.STATE_4:
                //写入打印页面数据成功,正在完成打印...
                break;
        }
    }
});

设置执行者回调监听(非必须):

executor.setOnPrintResultListener(new PrintExecutor.OnPrintResultListener() {
    @Override
    public void onResult(int errorCode) {
        switch (errorCode) {
            case PrintSocketHolder.ERROR_0:
                //打印成功完成!
                break;
            case PrintSocketHolder.ERROR_1:
                //生成打印页面数据失败!
                break;
            case PrintSocketHolder.ERROR_2:
                //创建Socket失败!
                break;
            case PrintSocketHolder.ERROR_3:
                //获取输出流失败!
                break;
            case PrintSocketHolder.ERROR_4:
                //写入打印页面数据失败!
                break;
            case PrintSocketHolder.ERROR_5:
                //必要的参数不能为空!
                break;
            case PrintSocketHolder.ERROR_6:
                //关闭Socket出错
                break;
            case PrintSocketHolder.ERROR_100:
                //打印失败
                break;
        }
    }
});

执行打印:

int result = executor.doPrinterRequest(PrintDataMaker maker);//同步
executor.doPrinterRequestAsync(PrintDataMaker maker);//异步

自定义

如果你要实现自己的打印机PrinterWriter,那么你需要继承PrinterWriter,并实现其 必须的方法。示例:

public class PrinterWriter80mm extends PrinterWriter {

    public static final int TYPE_80 = 80;// 纸宽80mm
    public int width = 500;

    public PrinterWriter80mm() throws IOException {
    }

    public PrinterWriter80mm(int parting) throws IOException {
        super(parting);
    }

    public PrinterWriter80mm(int parting, int width) throws IOException {
        super(parting);
        this.width = width;
    }

    @Override
    protected int getLineWidth() {
        //一行能够放下多少个“-”
        return 24;
    }

    @Override
    protected int getLineStringWidth(int textSize) {
        //根据字体的大小,一行可以放下多少个英文字符
        switch (textSize) {
            default:
            case 0:
                return 47;
            case 1:
                return 23;
        }
    }

    @Override
    protected int getDrawableMaxWidth() {
        //图片能够全部打印在纸上的最大宽度
        return width;
    }
}

注意

  • 打印图片出现乱码或者打印不出,大部分原因是打印机缓存较小导致,可调小PrinterWriter80mm的parting参数,设置其图片高度分割值(0~255),调小了还不行的话,缩小图片尺寸或者调整输出流的写入方式。
  • 仅提供建立蓝牙连接打印,不包括蓝牙搜索及配对功能
  • 不包含二维码生成功能
  • PrintCommands包含了大量打印指令,但是并非全部经过测试,而且并非所有打印机都支持。

支持

如果发现错误,请在此处提出: https://github.com/AlexMofer/ProjectX/issues

许可

Copyright (C) 2015 AlexMofer

Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

国外免费BT离线下载服务收集

#收集控#国外免费BT离线下载服务收集

名称 价格 介绍
OffCloud 免费 每个月只能下载三次,做测试用
Streamza 免费 单文件 1G 限制,队列 1,无法下载回本地,可在线
BytesLoader 免费 单文件无限制,队列 2
FURK 免费 需要邀请码,单文件 2G 限制,队列 2,可在线
DirectTorrents 免费 总文件 10G 限制 | 队列 3
Zbigz 免费 单文件 1G 限制,队列 2,限速 150K,7 天保存
FileStream 免费 单文件 1G 限制,队列 2,3 天保存
FilesLoop 免费 单文件 1G 限制,队列 1
BitPort 免费 单文件 1G 限制,队列 1
Seedr 免费 单文件 2G 限制,队列 1
ByteBX 免费 单文件 100M 限制,队列不限,总空间 2.5G
TorrentSafe 免费 单文件无限制,月队列 3,总空间 10G
2Giga 免费 单文件 2G 限制,队列 1
SonicSeedbox 免费 单文件无限制,天队列 2,总空间 4G
HiperDown 免费 单文件无限制,队列 2,总空间 5G
HiperDown 免费 单文件无限制,队列 2,总空间 5G

linux crontab 实现每秒执行

linux crontab 命令,最小的执行时间是一分钟。如需要在小于一分钟内重复执行,可以有两个方法实现。

1.使用延时来实现每N秒执行

创建一个php做执行动作,非常简单,就是把当前时间写入log。

  1. <?php
  2. file_put_contents(‘/home/fdipzone/php/crontab/run.log’date(‘Y-m-d H:i:s’).“\r\n”, FILE_APPEND);
  3. ?>

crontab -e 输入以下语句,然后 :wq 保存退出。

  1. * * * * * php /home/fdipzone/php/crontab/tolog.php
  2. * * * * * sleep 10; php /home/fdipzone/php/crontab/tolog.php
  3. * * * * * sleep 20; php /home/fdipzone/php/crontab/tolog.php
  4. * * * * * sleep 30; php /home/fdipzone/php/crontab/tolog.php
  5. * * * * * sleep 40; php /home/fdipzone/php/crontab/tolog.php
  6. * * * * * sleep 50; php /home/fdipzone/php/crontab/tolog.php

使用 tail -f 查看执行情况,可以见到log每10秒被写入一条记录。

  1. [email protected]:~$ tail -f /home/fdipzone/php/crontab/run.log
  2. 2014-03-31 21:47:01
  3. 2014-03-31 21:47:11
  4. 2014-03-31 21:47:21
  5. 2014-03-31 21:47:31
  6. 2014-03-31 21:47:41
  7. 2014-03-31 21:47:51
  8. 2014-03-31 21:48:01

原理:通过延时方法 sleep N  来实现每N秒执行。

注意:

60必须能整除间隔的秒数(没有余数),例如间隔的秒数是2,4,6,10,12等。

如果间隔的秒数太少,例如2秒执行一次,这样就需要在crontab 加入60/2=30条语句。不建议使用此方法,可以使用下面介绍的第二种方法。

2.编写shell脚本实现

crontab.sh

  1. #!/bin/bash
  2. step=2 #间隔的秒数,不能大于60
  3. for (( i = 0; i < 60; i=(i+step) )); do
  4.     $(php ‘/home/fdipzone/php/crontab/tolog.php’)
  5.     sleep $step
  6. done
  7. exit 0

crontab -e 输入以下语句,然后:wq 保存退出。

  1. # m h  dom mon dow   command
  2. * * * * * /home/fdipzone/php/crontab/crontab.sh

使用 tail -f 查看执行情况,可以见到log每2秒被写入一条记录。

  1. [email protected]:~/php/crontab$ tail -f run.log
  2. 2014-03-31 22:23:01
  3. 2014-03-31 22:23:03
  4. 2014-03-31 22:23:06
  5. 2014-03-31 22:23:08
  6. 2014-03-31 22:23:10
  7. 2014-03-31 22:23:12
  8. 2014-03-31 22:23:14
  9. 2014-03-31 22:23:16
  10. 2014-03-31 22:23:18
  11. 2014-03-31 22:23:20
  12. 2014-03-31 22:23:22
  13. 2014-03-31 22:23:25
  14. 2014-03-31 22:23:27
  15. 2014-03-31 22:23:29
  16. 2014-03-31 22:23:31
  17. 2014-03-31 22:23:33
  18. 2014-03-31 22:23:35
  19. 2014-03-31 22:23:37
  20. 2014-03-31 22:23:39
  21. 2014-03-31 22:23:41
  22. 2014-03-31 22:23:44
  23. 2014-03-31 22:23:46
  24. 2014-03-31 22:23:48
  25. 2014-03-31 22:23:50
  26. 2014-03-31 22:23:52
  27. 2014-03-31 22:23:54
  28. 2014-03-31 22:23:56
  29. 2014-03-31 22:23:58
  30. 2014-03-31 22:24:00

原理:在sh使用for语句实现循环指定秒数执行。

注意:如果60不能整除间隔的秒数,则需要调整执行的时间。例如需要每7秒执行一次,就需要找到7与60的最小公倍数,7与60的最小公倍数是420(即7分钟)。

则 crontab.sh step的值为7,循环结束条件i<420, crontab -e可以输入以下语句来实现

  1. # m h  dom mon dow   command
  2. */7 * * * * /home/fdipzone/php/crontab/crontab.sh

免费.blog域名 已成功撸一年免费.blog域名

Exabytes是来自马来西亚的域名注册商,老牌商家,成立于2001年。前期的活动有新注册.com域名3.99美元/首年优惠活动,兑换后人民币大概是在25元左右,比较划算。今天发布了一个免费域名活动,提供免费一年的.blog域名,适合做博客使用,每个新老账号都可以参与,但只能注册一个免费域名,站长已撸成功了,详细申请免费教程如下。

一、Exabytes官网撸.blog链接:立即前往 ,在首页输入要注册的域名,搜索一下;

二、进入付款页面后,输入优惠码“FREEBLOG-ADD18”价格就变成0了,然后选择PayPal付款即可。一年的免费.blog域名就撸到手了。每个账号优惠码只可以使用一次。

CPUTool – 限制和控制Linux中任何进程的CPU利用率

Linux性能监控的关键领域之一是CPU使用率和系统负载。有几种Linux性能监视工具可以监视系统上的事情。

许多这些工具只需输出系统状态/统计信息,而另外几个工具则为您提供管理系统性能的方法。 一个这样的工具叫做CPUTool 。

CPUTool是一个简单而强大的命令行工具,用于将任何进程的CPU利用率限制和控制到给定的限制,并允许在系统负载超过定义的阈值时中断进程执行。

CPUTool如何工作?

为了限制CPU使用率,cputool将SIGSTOPSIGCONT信号发送到进程,这由系统负载决定。 它依赖于/ proc伪文件系统来读取PID及其CPU使用度量。

如果系统负载超过阈值,则可将其用于将由单个进程或一组进程影响的CPU使用率或系统负载限制为给定的限制和/或暂停进程。

建议阅读: 了解Linux负载平均和监视Linux的性能

安装CPUTool以限制CPU使用和负载平均

CPUTool只能使用软件包管理工具从默认系统存储库安装到Debian / Ubuntu及其衍生产品。

$ sudo apt install cputool

使用CUPTool限制CPU使用

现在看看cputool如何真正的工作。 为了演示这一切,我们将运行一个dd命令 ,这将在后台产生高CPU百分比,并显示其PID。

# dd if=/dev/zero of=/dev/null &

为了监控CPU使用率,我们可以使用顶部或扫视工具,使我们能够查看正在运行的Linux系统进程的实时定期更新状态:

# top
监视dd命令CPU使用情况

监视dd命令CPU使用情况

从上面的输出可以看出, dd命令的CPU时间99.7%)最高为99.7%)现在我们可以使用cputool来限制它,如下所示。

--cpu-limit-c标志用于设置进程或进程组的使用百分比, -p指定PID。 以下命令会将dd命令(PID 8275)限制为使用一个CPU内核的50% :

# cputool --cpu-limit 50 -p 8275 

运行cputool后,我们可以再次检查进程的新CPU使用情况(PID 8275)。 现在, dd进程的CPU使用率应该在( 49.0%-52.0% )之间。

# top
限制处理CPU到50%的使用

限制处理CPU到50%的使用

为了进一步限制dd的CPU使用率达到20% ,我们可以再次运行cputool:

# cputool --cpu-limit 20 -p 8275 

然后立即检查使用顶部的工具或这样的扫视 ( dd的CPU使用率现在应在19.0%-22.0%之间或稍微超过此值):

# top
将CPU使用限制为20%

将CPU使用限制为20%

请注意,在cputool运行时,shell不会指望任何用户输入; 因此没有反应。 要杀死它(这将终止CPU使用限制操作),请按Ctrl + C

重要的是,要指定一个进程组(一个具有多个运行实例的程序,每个具有不同的PID),例如HTTP Web服务器:

# pidof apache2
9592 3643 3642 3641 3640 3638 3637 1780

使用-P标志,如下所示:

# cputool --cpu-limit 20 -P 1780

使用CUPTool限制系统负载

-l选项用于指定系统可能进入的最大负载,以便进程或进程组继续运行。 我们可以使用分数值(例如2.5 )。

下面的示例意味着仅当系统负载不超过3.5时为本地备份运行rsync :

# cputool --load-limit 3.5 --rsync -av /home/howtoing /backup/`date +%Y-%m-%d`/

有关更多信息和用法,请查看CPUTool手册页:

# man cputool

请查看以下有用的指导,以查找CPU信息和CPU性能监视:

  1. 9在Linux上获取CPU信息的有用命令
  2. Cpustat – 通过在Linux中运行进程监视CPU利用率
  3. CoreFreq – 用于Linux系统的强大的CPU监控工具
  4. 通过Linux中最高内存和CPU使用情况查找最高运行进程

总之, CPUTool非常适合Linux性能管理。 请通过下面的反馈表单分享您对这篇文章的想法。

使用CPULimit工具在Linux中限制CPU使用情况

在之前的一篇文章中,我们已经解释了CPUTool,用于限制和控制 Linux中任何进程的CPU利用率 。 如果CPU /系统负载超出定义的阈值,它允许系统管理员中断进程(或进程组)的执行。 在这里,我们将学习如何使用类似的工具cpulimit 。

Cpulimit用于以与CPUTool相同的方式限制进程的CPU使用率,但与其对应方案相比,它提供了更多的使用选项。 一个重要的区别是,cpulimit不像cputool那样管理系统负载。

建议阅读: 9在Linux上获取CPU信息的有用命令

安装CPULimit以限制CPU在Linux中的使用过程

CPULimit可以使用软件包管理工具从Debian / Ubuntu及其衍生软件的默认软件库进行安装。

$ sudo apt install cpulimit

RHEL / CentOSFedora中 ,您需要首先启用EPEL存储库 ,然后安装cpulimit,如图所示。

#yum install epel-release
#yum install cpulimit

使用CUPLimit限制CPU使用率

在本小节中,我们将介绍cpulimit的工作原理。 首先,让我们在后台运行一个命令(我们在覆盖cputool时看到的同样的dd命令 ),这个命令应该导致CPU占用率很高(注意在运行命令后打印出进程PID)。

$ dd if=/dev/zero of=/dev/null &
[1] 17918

接下来,我们可以使用输出正在运行的Linux系统的实际频繁更新状态的顶部扫视工具来观察上述命令的CPU使用情况。

$ top
监控Linux中的CPU使用情况

监控Linux中的CPU使用情况

看看上面的输出,我们可以看到dd进程正在利用最高百分比的CPU时间100.0% 。

但是我们可以使用cputlimit来限制这一点,如下所示。 --pid-p选项用于指定PID,– --limit-l用于设置进程的使用百分比。

以下命令将dd命令 ( PID 17918 )限制为使用一个CPU内核的50% 。

$ sudo cpulimit --pid 17918 --limit 50  
Process 17918 detected

一旦我们运行cpulimit,我们可以使用top或glance来查看dd命令的当前CPU使用情况。 从输出值的范围为( 51.5%-55.0%或略高于)。

在Linux中限制CPU使用过程

在Linux中限制CPU使用过程

我们可以第二次调整其CPU使用率,如下所示,此次进一步降低百分比如下:

$ sudo cpulimit --pid 17918 --limit 20 
Process 17918 detected

像我们以前一样,我们可以运行顶部或扫视来查看进程的新CPU使用率,范围为20%-25.0%或略高于此值。

$ top
Linux中的CPU CPU使用情况

Linux中的CPU CPU使用情况

注意 :shell变得非交互式 – 当cpulimit运行时,不会指望任何用户输入。 要杀死它(应该停止CPU使用限制操作),请按[Ctrl + C] 。

要运行cpulimit作为后台进程,请使用--background-b开关,释放终端。

$ sudo cpulimit --pid 17918 --limit 20 --background

要指定系统中存在的CPU核心数量,请使用--cpu-c标志(通常会自动检测)。

$ sudo cpulimit --pid 17918 --limit 20 --cpu 4

而不是限制进程的CPU使用率,我们可以用--kill-k选项来杀死它。 信号发送到进程的信号是SIGCONT ,但要发送不同的信号,请使用--signal-s标志。

$ sudo cpulimit --pid 17918 --limit 20 --kill 

如果没有合适的目标进程,或者如果它死机,则退出,包括这样的-z--lazy 。

$ sudo cpulimit --pid 17918 --limit 20 --kill --lazy

有关其他信息和使用选项,请查看cpulimit手册页。

$ man cpulimit

请查看以下有用的指南,以查找CPU信息和CPU /系统性能监视。

  1. 通过Linux中最高内存和CPU使用情况查找最佳运行进程
  2. Cpustat – 通过在Linux中运行进程监视CPU利用率
  3. CoreFreq – 用于Linux系统的强大的CPU监控工具
  4. 通过Linux中最高内存和CPU使用情况查找最佳运行进程
  5. 20个用于监视Linux性能的命令行工具
  6. 13 Linux性能监控工具 – 第2部分

相比之下,在测试CPUToolCPULimit之后 ,我们注意到前者提供了更有效和可靠的“CPU使用限制”功能。

这是根据给定进程运行这两种工具后观察到的CPU使用率的百分比范围。 尝试这两种工具,并使用下面的反馈表将您的想法添加到本文中。

cpulimit安装与使用(CentOS)

cpulimit 简介

cpulimit 命令的工作原理
为进程预设一个 cpu 占用率门限,并实时监控进程是否超出此门限,若超出则让该进程暂停运行一段时间。cpulimit 使用 SIGSTOP 和 SIGCONT 这两个信号来控制进程。它不会修改进程的 nice 值,而是通过监控进程的 cpu 占用率来做出动态调整。

cpulimit 的优势是可以控制进程的cpu使用率的上限值。但与 nice 相比也有缺点,那就是即使 cpu 是空闲的,进程也不能完全使用整个 cpu 资源。

在 CentOS 上,可以用下面的方法来安装它:

wget -O cpulimit.zip https://github.com/opsengine/cpulimit/archive/master.zip
unzip cpulimit.zip
cd cpulimit-master
make
sudo cp src/cpulimit /usr/bin

上面的命令行,会先从从 GitHub 上将源码下载到本地,然后再解压、编译、并安装到 /usr/bin 目录下。
现在就可以使用cpulimit命令了!
举例:

cpulimit –e httpd –l 40 #限制httpd(进程名)的cpu使用率为40%
cpulimit -l 50 -e httpd
cpulimit –e /usr/local/bin/httpd –l 40
cpulimit –p 2960 –l 55 #限制pid为2960的进程的CPU占用为55%

-e httpd, –exe=httpd,两者等同。
-l 40, –limit=40, 两者等同。
具体可以参考cpulimit -h帮助文档。

来看一个实例:

限制mysqld进程的CPU使用率在200%以内:

使用前:

这里写图片描述

使用后:
使用之后,cpu使用率被限制,因为是cpu使用率在动态变动,cpulimit不能非常及时准确的调整,偶尔会有超过200%,但是不会超过太多。
这里写图片描述

End!

非会员批量清理百度网盘重复文件方法

由于网速不稳定,在某天添加一个很大的分享时多点了几次,导致重复添加一百多个不同文件夹路径的文件。今天打开时提示我可以一键清理,本觉得百度还是挺人性化,虽然没做重复添加的校验,还是给了我清理办法。燃鹅,当我点击删除时,弹出了”不充钱,玩不了“的温馨提示,真是社会我百度。
气愤之余,打了个座,于是有了下面破解之法。

环境:

1.火狐浏览器charles抓包已配置好

步骤

1. 打开web百度网盘点击更多》垃圾清理》扫描重复文件(注意:这个功能有使用次数限制)

 

 

2.获取扫描完成页面的接口数据

页面如下:
(因为我的重复数据已经清理掉了,这里随便复制了个做示例)

接口是这个:

https://pan.baidu.com/api/garbagelist

保存数据到文件baidu.json,如下:

#baidu.json
{
  "errno": 0,
  "info": {
    "group_crashed": false,
    "next_index": 2,
    "count": 2,
    "has_more": false
  },
  "list": [
    {
      "fs_id": 0,
      "data": [
        {
          "size": "36218244",
          "category": "6",
          "fs_id": "413693152779790",
          "path": "\/BugReport(1).zip",
          "isdir": 0,
          "s3_handle": "a50c2bf7017fb91bc5044e881e8a87d1",
          "isdelete": 0,
          "server_filename": "BugReport(1).zip",
          "server_mtime": "1519452813",
          "smart_choose": 1,
          "index": 0
        },
        ......
  ],
  "request_id": 2151336299004000452
}

ps:当我满心赞扬的点击这个删除键时,百度就是我下面的回应。

3.进入正题处理数据,获取需要删除的文件路径

我们需要上面从保存的json数据中,剔除掉一个作为保留,并把重复的路径放到新的数组中,这里我直接是打印出来的。

# -*-coding:utf-8-*-
import json

def get_need_delete_paths():
    with open('baidu.json', 'r') as f:
        data = json.loads(f.read())
    a = 1
    lists = data["list"]
    need_delete_paths = []
    for list in lists:
        list_data = list["data"]
        for i in range(1, len(list_data)):
            need_delete_paths.append(list_data[i]["path"])

    for path in need_delete_paths:
        if a == 1:
            print "\n ======================= \n ["
        if a - 40 == 0:
            a = 1
            print "]\n ======================= \n ["
        a = a + 1
        print '"'+path+'",'
    print "]\n ======================= \n"

get_need_delete_paths()

我的打印内容如下:(注意,因为后面的删除接口字段不能太长,所以我这边是每40条做了个分隔。)

4.获取删除文件接口

因为百度有登陆状态的校验,这里我们可以先随意找个没用的文件删除,再直接从charles里克隆这条接口。

#删除文件接口
https://pan.baidu.com/api/filemanager

4.1获取删除文件接口

4.2克隆接口,并把需要删除的文件路径贴到字段里,(注意是个数组格式)。

结果

这是我的删除记录,几百条重复数据,几下就清理干净了。

备注

有钱的、重复数据量少的请忽略。

3D MAX 尺寸大小的運用

Ch2.尺寸大小的運用

————————————————————————————

<圖片說明>

———————————————————–

以下是 開啟 [ 3D MAX ] 系統後的畫面

———————————————————————————————————–

在 3D Max 系統中 , 起初都沒有設定 物件的大小範圍

所以, 我們必須自己設定 [大小尺寸]

以下是 設定的方法 :

—————–

<圖片說明>

先點選 工具列中的 [ Customize ] 後

選取[ Units Setup  ]

會開啟以下的[ Units Setup  面板

—————–

<圖片說明>

在[ Units Setup  面板 選取 需要的大小尺寸

例如: [ Centimeters ] 就是設定成 [ 公分(cm) ]

設定完後 ,還要再繼續設定 下圖中的部分

才算是正式的完成 單位的設定

—————–

<圖片說明>

例如 : 上圖中的箭頭指向的方式

 [ Centimeters ] 就是設定成 [ 公分(cm) ]

—————–

<圖片說明>

設定完後

就會看到 [ 命令面板 ] 中的框區中會出現 [單位]

表示設定單位已經完成了

========================================================

 THE END.