修豆听

豆听又坏了一周多了,周六没事干,来公司修修。


  1. charles 抓包新版虾米音乐 app的请求。

    发现接口变了。换成了https://acs.m.taobao.com/gw/ 的。如:

    https://acs.m.taobao.com/gw/mtop.alimusic.search.searchservice.searchalbums/1.0?type=originaljson&rnd=bc6bcfde094cfcccf22c5ba609c328d6&data=%7B%22requestStr%22%3A%22%7B%5C%22model%5C%22%3A%7B%5C%22key%5C%22%3A%5C%22Beyond%20Words%20Bobby%20McFerrin%5C%22%2C%5C%22pagingVO%5C%22%3A%7B%5C%22pageSize%5C%22%3A48%2C%5C%22page%5C%22%3A1%7D%7D%2C%5C%22header%5C%22%3A%7B%5C%22accessToken%5C%22%3A%5C%22af033e243e5ee7476a12af05009fefff%5C%22%2C%5C%22platformId%5C%22%3A%5C%22macApp%5C%22%2C%5C%22osVersion%5C%22%3A%5C%22Version%2010.13.6%20%28Build%2017G65%29%5C%22%2C%5C%22deviceId%5C%22%3A%5C%22W1v8Zh0G%5C%5C%5C%2FrADAMcTysfbiTfi%5C%22%2C%5C%22macAppVersion%5C%22%3A7010200%2C%5C%22language%5C%22%3A%5C%22en-CN%5C%22%2C%5C%22appVersion%5C%22%3A%5C%225000000%5C%22%2C%5C%22utdid%5C%22%3A%5C%22W1v8Zh0G%5C%5C%5C%2FrADAMcTysfbiTfi%5C%22%7D%7D%22%7D

尝试模拟新版接口的请求,行不通,header 请求里有一个参数 x-sign 无法破解。

  1. 尝试反编译新版虾米音乐 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 源代码毫无头绪。

    放弃。

  1. 转换思路,看旧版客户端的接口是否还能用。 去下了 3.1.3 旧版,可以正常使用。抓包,接口和现在现在豆听线上的几乎无差别。 本地起服务,请求正常。发布到 leancloud ,请求时提示:

    {
     ret: [
       "RGV587_ERROR::SM::亲,访问被拒绝了哦!请检查是否使用了代理软件或VPN哦~",
       "FAIL_SYS_USER_VALIDATE::亲,访问被拒绝了哦!请检查是否使用了代理软件或VPN哦~"
     ],
     data: {
       url: "https://www.taobao.com/markets/bx/deny_h5"
     }
    }
  2. 本地正常,线上不正常。会不会是 leancloud 被阿里屏蔽了。在 leancloud 控制台启动了其他的几个备份应用,发现也是同样的报错。

  3. 开始把 doutingapi 项目部署到自己的 vultr 新加坡服务器上,等服务器,加 ssh-key,拉代码,装 node 和 pm2,启动服务,ip 地址加3000端口访问,不行。看来得绑个域名。

  4. 找到闲置的 yumishow.com 域名,A 记录转到新加坡服务器,配置 nginx ,80 端口代理到127.0.0.1:3000。访问 yumishow.com ,可以了,服务正常,接口正常,豆听能拿到数据。但不是 https 的,到时候还是没法用到豆瓣页面里。要不顺便把之前闲置的 random.app 也启动一下

  5. 发现 random.app 会自动跳到 https 的域名,查了下,是域名自己强制的。看来必须要配置 https 了。

  6. 给 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 可以看自己有哪些自动任务。

这样就行了。