使用javascript写shell脚本(三) 发起网络请求

7,147 阅读4分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

这是javascript写shell脚本的第三篇文章,之前文章的链接如下:

这篇主要来讲一下如何发起网络请求。

发起网络请求主要使用一个开源的工具curl,其功能和postman差不多,用于构建网络请求,获取并处理数据。

首先介绍下curl的基础使用,如果用过的跳过即可。

curl的基础使用

查看响应

# 查看网页源代码
curl www.baidu.com
# 查看响应头和网页源代码
curl -i www.baidu.com
# 只查看响应头
curl -I www.baidu.comn

构建HTTP请求

http请求包括:

  • 请求行

    • HTTP动词(方法) -X
  • 请求头 -H

    • Content-Type 指定发送数据的类型
  • 请求体

    • -d

指定HTTP方法

# -X指定HTTP方法(动词),默认是GET
curl -X POST www.baidu.com
curl -X DELETE www.baidu.com

发送不同类型的数据

-H 参数添加HTTP请求标头 -d 参数用于发送POST请求的数据体

  • Content-Type : application/x-www-form-urlencoded
# -d发送请求体数据 默认的Content-Type为`application/x-www-form-urlencoded`
curl -X POST -d 'userPhoneNumber=15064761673'   example.com/user
# -d会自动将请求转化为POST,所以-X POST可以省略
curl -d 'userPhoneNumber=15064761673'   example.com/user
# 可以读取本地文本文件的数据,向服务器发送
curl -d '@data.txt' example.com/user
  • Content-Type: multipart/form-data
# -F参数用来向服务器上传二进制文件
curl -F 'file=@photo.png' <https://google.com/profile>
  • Content-Type:application/json

    • H 添加请求头
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' <https://google.com/login>

下载文件

  • o 将服务器的回应保存为文件,等同于wget命令
# 格式:
curl -o 文件名 www.baidu.com
# 示例
curl -o sina.html www.baidu.com
# 可以和其他参数组合使用,例如只下载响应头
curl -o sina_res_header.txt -I www.baidu.com
  • O 将服务器的回应保存为文件,并将URL的最后部分当做文件名
curl -O <https://www.baidu.com/img/dong_66cae51456b9983a890610875e89183c.gif>

脚本中使用curl发起网络请求

举个栗子,假如我要获取掘金首页推荐的文章数据,步骤如下:

  • 打开Network,看掘金首页调用的是哪个接口
  • 复制接口信息

image.png

然后开始写代码,把获取列表的接口放到一个函数里,如果需要修改参数的话,可以把要修改的参数作为函数的参数传入

#!/usr/bin/env node

const shell=require('shelljs')
// 获取数据
function fetchList(){
    return `
        curl 'https://api.juejin.cn/recommend_api/v1/article/recommend_all_feed' \
        -H 'authority: api.juejin.cn' \
        -H 'pragma: no-cache' \
        -H 'cache-control: no-cache' \
        -H 'sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"' \
        -H 'sec-ch-ua-mobile: ?0' \
        -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36' \
        -H 'content-type: application/json' \
        -H 'accept: */*' \
        -H 'origin: https://juejin.cn' \
        -H 'sec-fetch-site: same-site' \
        -H 'sec-fetch-mode: cors' \
        -H 'sec-fetch-dest: empty' \
        -H 'referer: https://juejin.cn/' \
        -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7' \
        -H 'cookie: _ga=GA1.2.151728167.1605962485; n_mh=QqqO9vdPyoUgGdMUK7bmzGg_3PdkxHeXQjID5mYHilk; MONITOR_WEB_ID=f9b5a304-d583-464d-ac25-bd0fc1849132; passport_csrf_token_default=6ae74227ec74685add0271300bf1f275; passport_csrf_token=6ae74227ec74685add0271300bf1f275; sid_guard=5d56b314e811199a40ac8d4a1a03774b%7C1627264731%7C5184000%7CFri%2C+24-Sep-2021+01%3A58%3A51+GMT; uid_tt=df38a08a79a50cfc2bde3f330d5cef2c; uid_tt_ss=df38a08a79a50cfc2bde3f330d5cef2c; sid_tt=5d56b314e811199a40ac8d4a1a03774b; sessionid=5d56b314e811199a40ac8d4a1a03774b; sessionid_ss=5d56b314e811199a40ac8d4a1a03774b; _gid=GA1.2.1703676324.1627819267; _tea_utm_cache_2608={%22utm_source%22:%2220210803%22%2C%22utm_medium%22:%22Push%22%2C%22utm_campaign%22:%2231day%22}' \
        --data-raw '{"id_type":2,"client_type":2608,"sort_type":3,"cursor":"0","limit":20}' \
        --compressed
    `
}

;(function(){
    shell.exec(fetchList(),{silent:true},(code,stdout)=>{
        if(code!==0)throw new Error('调用接口失败')
        console.log(stdout)
    })
}())

输出如控制台所示:

image.png

总体过程比较简单,获取了数据之后,就可以做一些对数据的处理了,例如可以统计一下出现所有的文章最多的关键字什么的。

脚本中可以发起网络请求之后,我们就可以做很多事情了,例如

  • 爬取一些网站的壁纸
  • 爬取知乎的一些回答
  • 爬取一些数据,整理成excel表格
  • 做一些自动签到的脚本

以后会写一些栗子。