自制百度网盘下载器

每天手动下载觉得很麻烦,后来想用树梅派+BaiduPCS搞一个自动下载器,定时下载网盘内容到移动硬盘上,实现云盘到移动硬盘的自动同步。BaiduPCS-Go用Go语言编写,操作类似于Linux,如果会linux使用起来非常得心应手,操作基本相仿。下面记录一下遇到的各种坑。

树梅派无法ssh

在window 用ssh + wpa_supplicant.conf 配置方式失效,一直扫不到ip。没有显示器的树梅派真的很难用Orz,最后实在没辙,接了根网线插到交换机上,使用 Nmap - Zenmap GUI扫描,最终拿到ip这边附上Nmap软件链接软件

扫描指令

1
nmap -sn 192.168.0.0/24

如果扫描到会有类似下面的信息

Nmap scan report for 192.168.0.183Host is up (0.0080s latency).MAC Address: B8:27:EB:DB:97:E7 (Raspberry Pi Foundation)

这边把参考的博客记录一下https://blog.csdn.net/wongnoubo/article/details/79628313

另外除了Nmap扫描意外,在手机端下载Fing也可以完成扫描。后续配合Termius可以实现手机端的远程ssh!

Permission denied

SSH连接respberry以后,需要将硬盘挂在到树梅派上,下载的时候直接指定到硬盘目录。按照常规挂载好硬盘,结果在往硬盘写数据时遇到Permission denied的错误,后才发现是因为挂载方式不恰当,使用下面的方法就OK了:

1
$ sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/1GB_USB_flash

因为没有安装ntfs-3g的驱动也报错了,装上驱动解决问题:

1
$ sudo apt-get install ntfs-3g

https://blog.csdn.net/lovelovelovelovelo/article/details/53862819
https://unix.stackexchange.com/questions/195828/permission-denied-on-mounted-devices

文件分隔符

思路:使用BaiduPCS指令读取百度网盘内容,然后逐一判断内容在磁盘中是否存在,如果不存在下载。但是没有想到的是网盘中的内容可能中间带着空格, 这样我在shell脚本那里面遇到了处理空格的难题,像同济大学 线性代数第一讲.mp4本来是要下载同济大学 线性代数第一讲.mp4,结果下载成了同济大学。在网上也搜了一些资料,有一些网友提供了利用IFS处理文件名中的空格,但是没成功,在linux处理空格不是我的强项,下面贴出来我写的shell,希望各为linux大牛能帮我出个好主意!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#/bin/bash

# 设置并发的进程数
thread_num=5
a=$(date +%H%M%S)
# mkfifo
tempfifo="my_temp_fifo"
mkfifo ${tempfifo}
# 使文件描述符为非阻塞式
exec 6<>${tempfifo}
rm -f ${tempfifo}

# 为文件描述符创建占位信息
for ((i=1;i<=${thread_num};i++))
do
{
echo
}
done >&6

exclusion_column="目录总数: 10"

# 这边的sed 是对文件名中可能是空格的进行处理
for line in `BaiduPCS-Go ls| awk '{for(i=1;i<=4;i++){$i=""};print $0}' | sed 's/ /_-_/g'`
#for line in `seq 1 10`
do
{
# 解决空格问题
original_line="$(echo $line | sed s'/_-_/ /g')"
# 去掉目录最后的分隔符
original_line=${original_line%*/}
if [ -n "${original_line}" ];then
echo "${original_line} 不为空"
if [[ "$original_line" =~ ^目录总数.* ]];then
echo "${original_line} 不是目录总数"
read -u6
{
sleep 1
#echo "${original_line}"
#BaiduPCS-Go d "${line%*/}" &
echo "" >&6
} &
fi
fi
}
done
wait
# 关闭fd6管道
exec 6>&-
b=$(date +%H%M%S)
echo -e "startTime:\t$a"
echo -e "endTime:\t$b"

上面的套路不行,后来我发现用BaiduPSC d *这个命令会下载盘内所有数据,如果检测到本地磁盘已经存在,就会自动跳过。下面提供一下BaiduPSC相关API链接https://github.com/iikira/BaiduPCS-Go

日志管理

将日志重定向到myout.file文件中,方便后续查看

1
nohup command > myout.file 2>&1 &

image