通过node.js+python实现蓝奏云上传服务

1. cookie获取

首先是cookie,这个想必大家都知道,我们登录一个网站后,再次访问如果不需要输入密码的话,那么就是cookie的帮助了.所以我们如果需要上传文件,那么就需要使用cookie.

1.2 获取

既然cookie这么重要,那么应该怎么获取呢?大多数的网站,都是通过客户端发送账号密码到服务器,然后服务器返回set-cookie,之后客户端根据set-cookie设置cookie,之后每次访问该网站的时候,都会把cookie传入.这样就不需要输入账号密码登录了.
但是这里有人会问,为什么有的网站登录一段时间后就需要重新登录呢?这里就需要说到cookie的时效性了,cookie大多数的网站都不是永久登录的,可能是浏览器关闭就失效,可能是1天失效,还有可能是30天等等.
这里简单看一下php的setcookie函数

1
setcookie(name,value,expire,path,domain,secure)
参数描述
name必需。规定 cookie 的名称。
value必需。规定 cookie 的值。
expire可选。规定 cookie 的有效期。
path可选。规定 cookie 的服务器路径。
domain可选。规定 cookie 的域名。
secure可选。规定是否通过安全的 HTTPS 连接来传输 cookie。

所以,cookie获取不是一次性就可以的,需要根据时间来获取.那么应该怎么获取呢?
目前其实就三种方法:

  1. 自己登录然后打开f12,选择Network,刷新网页,然后找到网站的请求(一般第一个),找到request headers内的cookie,然后就可以使用了.
  2. 通过逆向,获取账号密码加密的参数,之后模拟请求获取cookie
  3. 通过puppeteer/playwright/selenium等库模拟登录获取cookie

目前其实应该就这三种方法,其中1最简单,但是麻烦.2最方便但是难,所以我们选择3.
通过模拟浏览器进行cookie的获取.这里我们使用的是puppeteer.
如果只是单纯使用puppeteer模块的话,是不行的,这应该是会对浏览器指纹进行判断,所以我们这里要用到的是puppeteer-extra这个库.
通过puppeteer-extra这个库,我们可以让浏览器像正常的浏览器一样使用.之后再登录即可.

然后蓝奏云登录有一个滑动验证,这里也有两个方法可以通过,一个是模拟滑动,一个是通过JavaScript滑动,我比较倾向于模拟滑动.

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
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async ()=>{
let browser = await puppeteer.launch({
headless: false,
args: [
`--proxy-server=127.0.0.1:7890`,
"--disable-gpu",
"--no-sandbox",
"--disable-setuid-sandbox",
],
})
let page = await browser.newPage();
await page.goto('https://pc.woozooo.com/');
await page.waitForTimeout(1000);
await page.click(".y6");
await page.waitForTimeout(1000);
await page.type("#username", "123");
await page.type(".pwd", "123");
await page.waitForTimeout(1000);
const btn = await page.$('.nc_iconfont.btn_slide');
let box = await btn.boundingBox();
await page.mouse.move(box.x+5, box.y+5)
await page.mouse.down()
await page.mouse.move(box.x+70, box.y+3, {steps: 30})
await page.mouse.move(box.x+150, box.y+5, {steps: 30})
await page.mouse.move(box.x+250, box.y+2, {steps: 30})
await page.mouse.up()
await page.waitForTimeout(1000);
await page.click("#s3");
await page.waitForTimeout(1000);
console.log(await page.cookies())
console.log(await page.title());
await browser.close();
})()

1.3 使用

我们可以将cookie保存到文件中,然后通过python的with open读取该文件,然后发送请求即可.

2. 上传

上传这里我使用的是python,其实只用node.js也可以,或者只用python.
我们要用到的一个是requests库,一个是requests_toolbelt库,其中requests_toolbelt库是为了对文件进行处理,可以通过post将数据传递到服务器上.

1
2
import requests
from requests_toolbelt import MultipartEncoder
1
2
3
4
5
6
7
8
9
10
url = "https://pc.woozooo.com/fileup.php"
headers = {
"accept": "*/*",
"accept-encoding": "gzip, deflate, br",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"cache-control": "no-cache",
"pragma": "no-cache",
"referer": "https://pc.woozooo.com",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
}

url为蓝奏云上传文件到服务器的php网址,我们只需要向它传值即可.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
m = MultipartEncoder(
fields={
"task": "1",
"ve": "2",
"id": "WU_FILE_5",
"name": "名字",
"type": "application/pdf",
"lastModifiedDate": "Fri Mar 18 2022 22:31:14 GMT+0800 (中国标准时间)",
"size": "42671023",
"folder_id_bb_n": "-1",
"upload_file": ("文件名", open("文件名", 'rb'), 'application/octet-stream'),
}
)
headers['Content-Type'] = m.content_type
res = requests.post(url, headers=headers, proxies=proxies, data=m)
print(res.text)

这样,我们就可以将文件上传到蓝奏云服务器上了,但是node.js和python怎么整合到一块使用呢?

通过node.js+python实现蓝奏云上传服务

http://www.datehoer.com/posts/69c484ac-6e80-11ee-a697-01b0896cf41d/

作者

datehoer

发布于

2022-04-21

更新于

2023-10-19

许可协议

评论