charles 抓包新版虾米音乐 app的请求。
发现接口变了。换成了https://acs.m.taobao.com/gw/ 的。如:
尝试模拟新版接口的请求,行不通,header
请求里有一个参数 x-sign
无法破解。
尝试反编译新版虾米音乐 app,看
x-sign
如何计算。 用之前的asar extract app.asar example-sourcecode
来反编译 electron, 但发现新版并不是 electron 写的,于是找到了class-dump 来反编译:class-dump -H /Applications/虾米音乐.app/Contents/MacOS/虾米音乐 -o /Users/mine/Project/xiamiOrigin
但编译出来的
xxxxx.h
源代码毫无头绪。放弃。
转换思路,看旧版客户端的接口是否还能用。 去下了 3.1.3 旧版,可以正常使用。抓包,接口和现在现在豆听线上的几乎无差别。 本地起服务,请求正常。发布到 leancloud ,请求时提示:
{ ret: [ "RGV587_ERROR::SM::亲,访问被拒绝了哦!请检查是否使用了代理软件或VPN哦~", "FAIL_SYS_USER_VALIDATE::亲,访问被拒绝了哦!请检查是否使用了代理软件或VPN哦~" ], data: { url: "https://www.taobao.com/markets/bx/deny_h5" } }
本地正常,线上不正常。会不会是 leancloud 被阿里屏蔽了。在 leancloud 控制台启动了其他的几个备份应用,发现也是同样的报错。
开始把
doutingapi
项目部署到自己的 vultr 新加坡服务器上,等服务器,加 ssh-key,拉代码,装 node 和 pm2,启动服务,ip 地址加3000端口访问,不行。看来得绑个域名。找到闲置的 yumishow.com 域名,A 记录转到新加坡服务器,配置 nginx ,80 端口代理到127.0.0.1:3000。访问 yumishow.com ,可以了,服务正常,接口正常,豆听能拿到数据。但不是 https 的,到时候还是没法用到豆瓣页面里。要不顺便把之前闲置的 random.app 也启动一下
发现 random.app 会自动跳到 https 的域名,查了下,是域名自己强制的。看来必须要配置 https 了。
给 random.app 启用 https。也是先把 A 记录转到新加坡服务器,但改了之后,ping 时无法识别,
ping random.app ping: cannot resolve random.app: Unknown host
改成
$ nslookup random.app
Server: 211.167.230.100
Address: 211.167.230.100#53
Non-authoritative answer:
Name: random.app
Address: 45.76.149.238
这样就行了。搜了几篇怎么安装 Let's Encrypt 证书的文章参考。
安装Certbot客户端:
yum install certbot
获取证书:
我的不能用 Webroot
模式,因为端口会跟 nginx 冲突。发现不行后,改成了 standalone
重来。
certbot certonly --standalone -d random.app
nginx 配置:
#=================================
# random.app
#=================================
# the nginx server instance
server {
listen 80;
server_name random.app;
# access_log /var/log/nginx/random.app.log;
if ($http_user_agent ~ (Jorgee|Wget) ) {
return 403;
}
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /usr/share/nginx/html;
}
location = /.well-known/acme-challenge/ {
return 404;
}
# pass the request to the node.js server with the correct headers and much more can be added, see nginx config options
location / {
return 301 https://$server_name$request_uri;
}
}
server {
#启用 https, 使用 http/2 协议
listen 443 ssl http2;
#ssl
#证书路径
ssl_certificate /etc/letsencrypt/live/random.app/fullchain.pem;
#私钥路径
ssl_certificate_key /etc/letsencrypt/live/random.app/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/random.app/chain.pem;
#可选的加密算法,顺序很重要,越靠前的优先级越高
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!RC4-SHA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
#在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法.
ssl_prefer_server_ciphers on;
#以下与证书无关了
location /{
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
自动更新证书
certbot renew --dry-run
后失败,还是 nginx 端口冲突的问题。
在这里 http://diamondfsd.com/lets-encrytp-hand-https/ 找到一段:
这是因为我的api.diamondfsd.com生成证书的时候使用的是
--standalone
模式,验证域名的时候,需要启用443端口,这个错误的意思就是要启用的端口已经被占用了。 这时候我必须把nginx
先关掉,才可以成功。果然,我先运行service nginx stop
运行这个命令,就没有报错了,所有的证书都刷新成功。
参考这篇文章,配置了自动跟新的脚本:
5 2 * */2 * certbot renew --pre-hook "service nginx stop" --post-hook "service nginx start"
crontab certbot-auto-renew-cron
`crontab -l
可以看自己有哪些自动任务。
这样就行了。