通过node.js+python实现蓝奏云上传服务
# 1. cookie获取
# 1.1 cookie
首先是cookie,这个想必大家都知道,我们登录一个网站后,再次访问如果不需要输入密码的话,那么就是cookie的帮助了.所以我们如果需要上传文件,那么就需要使用cookie.
# 1.2 获取
既然cookie这么重要,那么应该怎么获取呢?大多数的网站,都是通过客户端发送账号密码到服务器,然后服务器返回set-cookie,之后客户端根据set-cookie设置cookie,之后每次访问该网站的时候,都会把cookie传入.这样就不需要输入账号密码登录了. 但是这里有人会问,为什么有的网站登录一段时间后就需要重新登录呢?这里就需要说到cookie的时效性了,cookie大多数的网站都不是永久登录的,可能是浏览器关闭就失效,可能是1天失效,还有可能是30天等等. 这里简单看一下php的setcookie函数
setcookie(name,value,expire,path,domain,secure)
参数 | 描述 |
---|---|
name | 必需。规定 cookie 的名称。 |
value | 必需。规定 cookie 的值。 |
expire | 可选。规定 cookie 的有效期。 |
path | 可选。规定 cookie 的服务器路径。 |
domain | 可选。规定 cookie 的域名。 |
secure | 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。 |
所以,cookie获取不是一次性就可以的,需要根据时间来获取.那么应该怎么获取呢? 目前其实就三种方法:
- 自己登录然后打开f12,选择Network,刷新网页,然后找到网站的请求(一般第一个),找到request headers内的cookie,然后就可以使用了.
- 通过逆向,获取账号密码加密的参数,之后模拟请求获取cookie
- 通过puppeteer/playwright/selenium等库模拟登录获取cookie
目前其实应该就这三种方法,其中1最简单,但是麻烦.2最方便但是难,所以我们选择3. 通过模拟浏览器进行cookie的获取.这里我们使用的是puppeteer. 如果只是单纯使用puppeteer模块的话,是不行的,这应该是会对浏览器指纹进行判断,所以我们这里要用到的是puppeteer-extra这个库. 通过puppeteer-extra这个库,我们可以让浏览器像正常的浏览器一样使用.之后再登录即可.
然后蓝奏云登录有一个滑动验证,这里也有两个方法可以通过,一个是模拟滑动,一个是通过JavaScript滑动,我比较倾向于模拟滑动.
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();
})()
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
# 1.3 使用
我们可以将cookie保存到文件中,然后通过python的with open读取该文件,然后发送请求即可.
# 2. 上传
上传这里我使用的是python,其实只用node.js也可以,或者只用python. 我们要用到的一个是requests库,一个是requests_toolbelt库,其中requests_toolbelt库是为了对文件进行处理,可以通过post将数据传递到服务器上.
import requests
from requests_toolbelt import MultipartEncoder
2
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",
}
2
3
4
5
6
7
8
9
10
url为蓝奏云上传文件到服务器的php网址,我们只需要向它传值即可.
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)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
这样,我们就可以将文件上传到蓝奏云服务器上了,但是node.js和python怎么整合到一块使用呢?