首页
留言
动态
归档
推荐
音乐
工具
Search
1
Emby公益服-上万部电影电视剧免费看
64,075 阅读
2
openwrt-docker部署lxk0301京东自动签到脚本
12,679 阅读
3
QuantumultX-京东签到撸京东豆
11,042 阅读
4
LXK0301京东签到脚本-自动提交互助码
9,452 阅读
5
微信-域名被封监测以及自动更换被封域名
9,071 阅读
随便写写
科学上网
Web开发
瞎折腾
Search
标签搜索
quantumultx
laravel
openwrt
laravel nova
laradock
telegram
薅羊毛
google adsense
jd_scripts
京东签到
ubuntu
oh-my-zsh
web开发环境
nginx
工具
shadowsocks shadowsocksR
RBAC
权限管理
内网穿透
Python
orzlee
累计撰写
44
篇文章
累计收到
595
条评论
首页
栏目
随便写写
科学上网
Web开发
瞎折腾
页面
留言
动态
归档
推荐
音乐
工具
搜索到
28
篇与
瞎折腾
的结果
2021-02-08
openwrt-docker部署lxk0301京东自动签到脚本
前言 最近弄了个软路由,J4105/8G/128G SSD,只是用来科学上网太浪费了,内存经常空闲7个多G,CPU 5%左右。 本来在手机上跑lxk0301大佬的京东签到脚本已经很爽了(有兴趣可以阅读我的文章-QuantumultX-京东签到撸京东豆),最近京东有个疯狂的JOY活动,自动看视频、领金币、合成JOY。脚本一旦启动不会停止,8s执行一次,手机上跑不太合适,可能会比较耗电。本想在服务器上弄个docker,想着软路由性能过剩还是折腾下软路由吧。 开撸 推荐科学上网后再折腾,虽然不是必要。 我是用的是eSir高大全,功能比较多,eSir youtube频道有固件讲解视频,包括一些使用教程等。 eSir高大全已经包含了DockerMan,如果没有可以去 DockerMan github看说明安装,当然也可以不使用DockerMan工具,看个人喜好。本片文章是基于DockerMan工具。 开始之前 默认eSir高大全的Overlay分区大小固定,如果硬盘较大其实很多空间都没有使用,可以看eSir说明以及教程OpenWrt扩容Overlay。 eSir推荐docker分区重新分配一个,这样在升级或者恢复出厂设置后不会丢失docker数据,所以在扩容Overlay分区的时候不要把硬盘全部用光,给docker分区多留点。这部分教程可以看eSir-玩转Docker系列视频,第一弹里面有讲到docker分区,视频中使用分区工具diskman,eSir高大全版本在openwrt管理页面 系统 目录下。 配置docker 2021-05-08 LXK0301 jd_docker仓库也被封掉了,最新地址Github jd_docker。 2021-02-20 LXK0301 gitee仓库被大量外链访问封掉了,仓库已被禁止访问,返回403。目前已经套用CDN访问。 大佬telegram脚本更新通知频道JD_fruit Script。 以下是LXK0301大佬telegram bot最新消息: 云端使用仓库自带的docker。更新一下镜像后,然后可继续更新仓库最新脚本。 openwrt docker在 Docker-容器-点击容器名称-升级容器,旧的容器会在名称后面追加_old,删除带有_old的容器,启动新的就好了。 获取京东cookie方法,推荐使用扫码,可以保存cookies 90天。 环境变量说明总汇:jd_scripts docker 环境变量 在opt目录下创建一个目录,存放签到脚本目录,使用shell工具或者WinSCP操作 新建一个docker容器: 配置项 容器名称自定义 Docker 镜像 lxk0301/jd_scripts 始终拉取镜像 √ (每次启动、重启都会拉取最新镜像) 重启策略 Always 环境变量 JD_COOKIE必须,REPO_URL=https://gitee.com/lxk0301/jd_scripts.git 指定更新源,推荐gitee仓库,GitHub总是有人滥用GitHub Action导致作者仓库被封。gitee仓库不存在此问题,相对较稳定。我是用telegram推送签到信息(教程:Telegram通知BOT配置教程),其他环境变量去看jd_scripts docker 环境变量 挂载 具体看使用什么配置,jd_scripts docker 配置说明中举例了几种配置,一般默认挂载出日志文件就好了,当然也可以不挂载命令格式 第一步创建的目录:/scripts/logs,推荐使用绝对路径 点击提交后会回到第一步界面,勾选刚刚创建的容器,点击启动即可。 互助码 在你创建的并且挂载的日志目录下,jd_get_share_code.log、sharecode.log以及其他活动对应的日志中都包含该活动的互助码(如果活动可以互助的话),前两个日志文件会包含多个活动。如果没有想要的活动互助码只能在对应活动脚本日志中找,对应活动脚本(日志文件名与脚本名一致)可以查看脚本列表。 手机用户手动跑一遍脚本或者看看是否有脚本日志,一般会在日志或手动跑脚本的时候输出互助码 使用telegram提交互助码, 有两个BOT: @TuringLabbot @LvanLamCommitCodeBot 进入BOT点击消息输入框右边的斜杠按钮可以查看所有命令,使用/help查看说明,最好看一下,两个bot提交的互助码活动不一样,一个是长期活动,一个是临时活动。切勿频繁提交。BOT在1、8、16、24号0点会清空数据,0点后重新提交自己的互助码,作者服务器资源有限,互助码有上限(目前好像是5500个)。有兴趣可以折腾下:LXK0301京东签到脚本-自动提交互助码 docker容器相关操作命令 docker exec -it jd_scripts /bin/sh -c 'git -C /scripts pull && node /scripts/jd_bean_change.js' 手动拉取仓库最新脚本并且运行jd_bean_change.js脚本 docker exec -it jd_scripts /bin/sh -c 'env' 查看设置的环境变量 docker exec -it jd_scripts /bin/sh -c 'git pull' 手动更新jd_scripts仓库最新脚本 docker exec -it jd_scripts /bin/sh 仅进入容器命令(进入容器后也可以手动运行脚本: node /scripts/jd_bean_change.js) rm -rf logs/*.log 删除logs文件夹里面所有的日志文件(这行命令一般是在进入容器后执行) 结语 使用docker可以解放手机了,docker默认会开启jd_crazy_joy_coin.js脚本。这个docker不怎么耗资源,所以低配置软路由也没有问题,我同时跑了3个账号,除了内存上去了几百M,CPU还是老样子。脚本每天23:50会清空日志,每天会自动拉取最新脚本,所有挂上去后除了更新cookie基本上不用管。 diskman没法编辑环境变量,每次都要重建,在Docker-容器-点击你得容器名称-复制/编辑容器-可以复制一份容器配置文件,REPO_URL=https://xxxx 环境变量会丢失,估计是包含特殊符号,如果需要记得加上,补全信息:容器名称,始终拉取镜像,重启策略,修改cookie后删除原容器, 点击提交,操作麻烦了点,但比重新创建一个要简单。 有时候启动会无限重启,查看docker 容器日志会发现脚本没有执行完。 ... stderr: + expr 16 '%' 8 stderr: + remainder_h=0 可能是脚本BUG,当前时间小时数取余如果为0就会发生此问题,修改系统时间没有用,要修改容器时间才行,还是等待下一个小时在启动吧。
2021年02月08日
12,679 阅读
101 评论
3 点赞
2020-12-26
NeteaseCloudMusicApi +YesPlayMusic +UnblockNeteaseMusic搭建自己的音乐站(解锁网易云无版权音乐)
前言 最近逛论坛,看到一篇文章一台国内的1h1g1m小鸡可以做些什么?来看看我的吧(多图),其中有个项目吸引了我,网易云api及在线音乐播放器。顺腾摸瓜看教程。 可惜,文档比较少,前端知识也不够,折腾了我许久。 必须要有国内服务器,不然UnblockNeteaseMusic没法用的,其他音乐平台都屏蔽了国外IP。可能有部分平台屏蔽国外服务器,但是我没发现!!! 2021-05-09 更新,YesPlayMusic作者这短时间更新了不少代码,但是使用UnblockNeteaseMusic依然非常简单! 思路 NeteaseCloudMusicApi - 网易云音乐 Node.js API service。 YesPlayMusic - 高颜值的第三方网易云播放器 UnblockNeteaseMusic - 解锁网易云音乐客户端变灰歌曲 YesPlayMusic作为客户端请求自己部署的NeteaseCloudMusicApi网易云音乐API服务,这样可以形成一个闭环,前后端齐了,使用没有问题。 但是我们还要解锁网易云没有版权的歌曲。相信很多人都知道网易云没有版权的歌曲可能在其他平台上可以播放,这时候UnblockNeteaseMusic的好处来了,它可以将想听的歌曲在多个指定平台上搜索,然后将找到的歌曲url拼装请求返回。 在服务器端将网易云音乐部分服务域名重定向到UnblockNeteaseMusic服务就可以很完美的解锁大部分歌曲了!目前来说,不论音质的话,Music-YouTube的歌曲是我听过最全的了! 安装 如果部署到国内服务器,那么一台服务器就够了,如果部署在国外服务器,可能需要一台国内服务器,不然搜不到国内歌曲/艺人。歌曲还是能在国外服务器上解锁。 一个个来,不然乱套了。 NeteaseCloudMusicApi 1.1 安装nodejs 这个比较简单,上命令: apt update && apt install -y git curl curl -sL https://deb.nodesource.com/setup_lts.x | bash - apt-get install -y nodejs 1.2 克隆NeteaseCloudMusicApi项目: git clone https://github.com/Binaryify/NeteaseCloudMusicApi.git cd NeteaseCloudMusicApi npm install 1.3 配置Nginx: 我使用的是Nginx反向代理: server { listen 80; server_name xxx.xxx.com; ### 记得替换 rewrite ^(.*) https://$server_name$1 permanent; } #跨域配置 map $http_origin $allow_origin { default ""; "~^(https?://[\w]+.domain.com)" $1; ##你的域名,记得替换,*.domain.com,这里可以添加多行域名 } server { listen 443 http2 ssl; ssl_certificate /xxx/xxx.cer; #证书 记得替换 ssl_certificate_key /xxx/xxx.key; #私钥 记得替换 ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; #屏蔽不安全的加密方式 server_name xxx.xxx.com; #域名, 记得替换成自己的 charset utf-8; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header REMOTE-HOST $remote_addr; proxy_hide_header Access-Control-Allow-Origin; proxy_hide_header Access-Control-Allow-Credentials; proxy_hide_header Access-Control-Allow-Methods; proxy_hide_header Access-Control-Allow-Headers; proxy_pass http://0.0.0.0:3000; ###API端口,修改了下面supervisorctl配置也要同步修改 # 跨域配置 add_header Access-Control-Allow-Origin $allow_origin always; add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,DELETE,PATCH' always; add_header 'Access-Control-Allow-Headers' 'Token,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,X_Requested_With,If-Modified-Since,Cache-Control,Content-Type' always; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; #浏览日志,关了, 要开自己填写路径 error_log /var/log/nginx/xxx.xxx.xxx-error.log error; #错误日志路径 sendfile off; location ~ /\.ht { deny all; } } 1.4 需要添加一处代码,忽略ssl错误(大概122行左右,其实无所谓,因为是环境变量,但是要加在请求执行之前): nano NeteaseCloudMusicApi/util/request.js ... const settings = { method: method, url: url.replace(/^https:/, 'http:'), //将HTTPS全部转换成HTTP请求,不然一堆502错误 headers: headers, data: queryString.stringify(data), httpAgent: new http.Agent({ keepAlive: true }), httpsAgent: new https.Agent({ keepAlive: true }), } //添加下面这一行代码 process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; 1.5 配置supervisorctl守护进程: 安装: apt update && apt install -y supervisor 写配置 nano /etc/supervisor/conf.d/music-api.conf 端口3000,如果端口改了记得nginx配置文件也要改 [program:music-api] command=/bin/bash -c 'PORT=3000 HOST=127.0.0.1 /usr/bin/node /var/www/NeteaseCloudMusicApi/app.js' autostart=true autorestart=true user=root numprocs=1 更新配置文件,启动 sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start music-api:* 搞定,看看状态: $ supervisorctl status music-api:* music-api RUNNING pid 3312, uptime 0:57:01 1.6 如果不想用Nginx,那就记得服务器开放3000端口(或者你自己配置的端口, 还是建议使用Nginx)。 YesPlayMusic 以下步骤可以到本地操作,之后把编译的文件传到服务器就好了,当然服务器上操作也没问题。 2.1 安装yarn: curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list apt-get update && apt-get install -y yarn 2.2 安装YesPlayMusic: git clone https://github.com/qier222/YesPlayMusic.git cd YesPlayMusic yarn install cp .env.example .env 2.3 编辑.env环境变量: 用了Nginx填写域名,没有使用Nginx的填写http://服务器外网IP:3000(改了端口记得改) nano .env ... VUE_APP_NETEASE_API_URL=https://xxx.xxx.com VUE_APP_ELECTRON_API_URL=/api VUE_APP_ELECTRON_API_URL_DEV=https://xxx.xxx.com VUE_APP_ENABLE_SENTRY=false DEV_SERVER_PORT=20201 NODE_ENV=production VUE_APP_LASTFM_API_KEY=09c55292403d961aa517ff7f5e8a3d9c VUE_APP_LASTFM_API_SHARED_SECRET=307c9fda32b3904e53654baff215cb67 vue.config.js文件可以修改网页标题版权信息。 src/mian.js可以修改google analytics追踪代码ID。 src/Utils/Player.js 44行 document.title = ${track.name} · ${track.ar[0].name} - YesPlayMusic;这里YesPlayMusic是播放音乐的时候标题尾。 其他 YesPlayMusic 关键词要修改全局代码搜索吧,有点多! 2.4 修改代码,为了后面使用UnblockNeteaseMusic: 文件路径 YesPlayMusic/src/Utils/Player.js。 _getAudioSourceFromNetease(track) { if (isAccountLoggedIn()) { return getMP3(track.id).then(result => { if (!result.data[0]) return null; if (!result.data[0].url) return null; if (result.data[0].freeTrialInfo !== null) return null; // 跳过只能试听的歌曲 const source = result.data[0].url.replace(/^http:/, 'https:'); if (store.state.settings.automaticallyCacheSongs) { cacheTrackSource(track, source, result.data[0].br); } return source; }); } else { //这段代码替换,其实应该能更解耦,不就结了! let url = `https://music.163.com/song/media/outer/url?id=${track.id}`; return getMP3(track.id).then(result => { if (!result.data[0] || !result.data[0].url || result.data[0].freeTrialInfo !== null) { resolve(url); } const source = result.data[0].url.replace(/^http:/, 'https:'); // const source = result.data[0].url; if (store.state.settings.automaticallyCacheSongs) { cacheTrackSource(track, source, result.data[0].br); } return source; }); } } 2.5 编译: yarn run build 2.6 配置Nginx: 此处需要新的域名,不能用NeteaseCloudMusicApi的域名 server { listen 80; server_name xxx.xxx.com; ### 记得替换 rewrite ^(.*) https://$server_name$1 permanent; ### 强制重定向到https } server { listen 443 http2 ssl; ssl_certificate /root/xxx.cer; ### 域名证书 ssl_certificate_key /root/xxx.key; ### 域名证书私钥 ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; #屏蔽不安全的加密方式 ssl_prefer_server_ciphers on; server_name xxx.xxx.com; root "/var/www/YesPlayMusic/dist"; #### 如果服务器上编译那就是这个目录,本地编译上传dist目录到服务器,然后填写dist目录地址 index index.html index.htm index.php; charset utf-8; location / { try_files $uri $uri/ =404; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/xxx.xxx.com-error.log error; sendfile off; location ~ /\.ht { deny all; } } 2.7 Tips 其实这样就已经弄好了,只是我在折腾的时候发现了一个更又意思的东西,发现前端技术现在真心酷。 我是在windows上操作的,要先在windows安装Nodejs,yarn,这部分就直接去NodeJS、yarn官网下载吧! 我被electronjs坑惨了,根本不知道electronjs是跨平台桌面平台(相信很多前端都没有接触过这东西),使用electronjs可以编译出windows(MacOS, Linux)客户端,如果这样操作可以省去折腾UnblockNeteaseMusic,因为YesPlayMusic已经集成了。 起初只是看到YesPlayMusic有人提交PR,说是集成了UnblockNeteaseMusic,我就去看源码,发现 .env 中添加一个环境变量 IS_ELECTRON=true 就会开启UnblockNeteaseMusic,操作一番发现依赖electronjs通讯,window.require not a function 这错误让我在网上找了好久,其实是electronjs依赖nodejs,就算解决了 window.require not a function 问题,还是会接着来新问题。 后面发现electronjs不可能编译后通过浏览器使用的,这过程折腾了我一个晚上。 以下操作都是在本地windows系统操作的,可以按上文2-3部操作,NodeJS、yarn官网下载 开搞吧,先到.env中添加IS_ELECTRON=true。 安装electronjsnpm install -g electron 编译:"scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint", "electron:build": "vue-cli-service electron:build -mwl -p never", //编译macos, windows, linux三个平台 "electron:build-mac": "vue-cli-service electron:build -m -p never", //编译MacOS "electron:build-win": "vue-cli-service electron:build -w -p never", //编译windows "electron:build-linux": "vue-cli-service electron:build -l -p never", //编译linux "electron:serve": "vue-cli-service electron:serve", //运行服务,没什么用折腾我好久 "electron:buildicon": "electron-icon-builder --input=./build/icons/icon.png --output=build --flatten", "electron:publish": "vue-cli-service electron:build -mwl -p always", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", "prettier": "npx prettier --write ./src ./script", "netease_api:run": "cd ./netease_api && npm run start", "netease_api:pull": "node script/pull.js", "netease_api:install": "cd ./netease_api && npm install", "netease_api:setup": "npm run netease_api:pull && npm run netease_api:install" }, 以上都是yarn run ...支持的命令,开始编译windows版本: yarn run electron:build-win 编译完了在YesPlayMusic\dist_electron目录下,进入目录,你会看到YesPlayMusic Steup.exe,这是安装程序,YesPlayMusic\dist_electron\win-unpacked里面有已解包程序YesPlayMusic.exe,点击就可以执行。 和网页版一样的效果,不得不说这界面做的真的好看。首页拉到底设置里面有深色模式。 点击右上角x并没有退出,最小化了,如果你再新开一个程序会提示你端口占用报错的。 UnblockNeteaseMusic 3.1 安装UnblockNeteaseMusic 其实也说不上安装,目前有四种方法: npx @nondanee/unblockneteasemusic docker run nondanee/unblockneteasemusic docker-compose up git clone https://github.com/nondanee/UnblockNeteaseMusic.git cd UnblockNeteaseMusic // node app.js //运行 不过暂时不用,下文配置supervisor守护进程 自己选吧,都可以用,前三种要自己生成163.com域名证书。 目前我使用的是替换host全局代理方法,其他方法实在懒得折腾了,真心累。 作者说替换host方法必须要开启80(443)端口,其实也不用(80端口占了就docker也能搞定),nginx反代就好了。 3.2 配置nginx: server{ listen 80; server_name music.163.com *.music.163.com; ##这里就别替换了 location / { proxy_set_header Host $http_host; proxy_pass http://127.0.0.1:3001; ##UnblockNeteaseMusic绑定端口 80 } } server { listen 443 ssl http2; server_name music.163.com *.music.163.com; ssl_certificate /var/www/UnblockNeteaseMusic/server.crt; ##不用换了 ssl_certificate_key /var/www/UnblockNeteaseMusic/server.key; ##不用换了 ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; location / { proxy_set_header Host $http_host; proxy_pass https://127.0.0.1:3002; ##UnblockNeteaseMusic绑定端口 443 } } 如果是国外服务器(国内服务器请忽略),那么你需要一台国内服务器,这份nginx配置只需要配置在国内服务器就好了,不然听不了歌,全是502错误。 国内外服务器都没有问题,国外只是会出现搜索不到中文歌曲/艺人,大部分都是对应服务器所在国家的歌曲/艺人,可以将解锁服务部署到国内服务器。当然方法有很多种,下面我给出我正在使用的部分,这并不是最简单的方法,因为需要两台服务器部署解锁服务,但是我这样也有优点,国外服务器依然可以自己解锁歌曲,不必全部交给国内服务器,如果服务器线路好延迟低倒是无所谓,不然响应很慢,如果不在意搜索不到国内信息那大可不必折腾国内服务器和修改代码。修改代码如下: // UnblockNeteaseMusic/src/request.js const configure = (method, url, headers, proxy) => { ... if (url.pathname == '/weapi/search/get') { options.hostname = '123.123.123.123' //这里的修改是为了将搜索服务交给自己国内服务器上,这样搜索出来包含很多国内的歌曲或艺人 } return options } 3.3 https反代歌曲URL域名: 此处需要新的域名,不能用NeteaseCloudMusicApi或YesPlayMusic的域名。 server { listen 443; server_name xxx.xxx.com; # 改为你自己的域名 ssl on; ssl_certificate /root/xxx.cer; ## 证书记得换 ssl_certificate_key /root/xxx.xxx.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost:3001; # 代理到 Unblock 服务地址 } } 3.4 修改hosts文件, 末尾添加,把域名劫持到本机,NeteaseCloudMusicApi请求API就会通过nginx到UnblockNeteaseMusic,让UnblockNeteaseMusic通过其他音乐平台获取相关资源: nano /etc/hosts ... ... 127.0.0.1 music.163.com 127.0.0.1 interface.music.163.com 127.0.0.1 music.126.net 127.0.0.1 interface3.music.163.com 如果是国外服务器(国内服务器请忽略),并且3.2节使用了国内服务器,这里本机地址需要修改成国外服务器地址。因为只有国内才能使用,很多音乐没有国外版权! 最近试了下国外服务器一样可以解锁国内外歌曲(UnblockNeteaseMusic新增了 X-Real-IP 参数解锁海外限制),如果国外服务器和国内服务器之间线路比较好可以直接使用国内服务器,将解锁服务部署到国内服务器就行了,不需要两边折腾!如果线路拉跨,那就部署国内外服务器,国内服务器只部署解锁服务即可,然后按照3.2加粗部分操作即可! 3.5 添加supervisor守护进程: xxx.xxx.xxx用你的服务器ping music.163.com,然后替换掉。这里不使用-f参数指定域名会死循环的,直接爆出http 502错误 -e https://xxx.xxx.com 这个参数是指定歌曲URL输出域名,刚刚第3部配置的域名,网易的域名不会替换,只有网易没版权通过其他音乐平台获取的歌曲URL的才会替换。如果不替换的话其他平台大多只支持http协议,你的网站如果是https,chrome会强制https访问站点下所有资源(外链也不放过),这时候https其他音乐平台又不支持,嗝屁了。所以只能通过这种方式用服务器反向代理了。 nano /etc/supervisor/conf.d/music-unblock.conf [program:music-unblock] command=/usr/bin/node /var/www/UnblockNeteaseMusic/app.js -p 3001:3002 -s -f xxx.xxx.xxx -a 127.0.0.1 -e https://xxx.xxx.com autostart=true autorestart=true user=root numprocs=1 3.6 更新配置文件,启动 sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start music-unblock:* 看状态: $ supervisorctl status music-unblock:* music-unblock RUNNING pid 3373, uptime 2:39:00 搞定,nginx -t看看有错误没有,没错误nginx -s reload,然后打开网站看看。 结语 虽然碰到很多问题,但是确实有意思,感兴趣才有动力去研究。大大小小的坑都趟过去了,还有意外发现electronjs。 看Demo可以访问我刚刚搭建好的站点Music OrzLee,可能有点卡,毕竟UnblockNeteaseMusic要绕回国。然后套了CF,就随便看看吧,主要还是自己搭建个国内站点最好了。
2020年12月26日
3,100 阅读
23 评论
4 点赞
2020-12-24
Vue-videoJS播放m3u8视频
前言 找到一部分M3U8视频源,之前用H5 video 标签播放MP4视频,但是支持视频格式很少,索性换掉算了。 M3U8简单了解 引用维基百科: M3U8是Unicode版本的M3U,用UTF-8编码。"M3U"和"M3U8M3U8"文件都是苹果公司使用的HTTP Live Streaming格式的基础,这种格式可以在iPhone和Macbook等设备播放。 引用知乎: 上述文字定义来自于维基百科。可以看到,m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS) 协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。 HLS 的工作原理是把整个流分成一个个小的基于 HTTP 的文件来下载,每次只下载一些。当媒体流正在播放时,客户端可以选择从许多不同的备用源中以不同的速率下载同样的资源,允许流媒体会话适应不同的数据速率。在开始一个流媒体会话时,客户端会下载一个包含元数据的 extended M3U (m3u8) playlist文件,用于寻找可用的媒体流。 HLS 只请求基本的 HTTP 报文,与实时传输协议(RTP)不同,HLS 可以穿过任何允许 HTTP 数据通过的防火墙或者代理服务器。它也很容易使用内容分发网络来传输媒体流。 简单理解,M3U8其实就是视频文件碎片索引URL(类似于播放列表),播放器会解析并且下载这些视频碎片,拼接成一整个视频。MP4格式对HTTP和Flash都比较友好,但是MP4文件头部结果比较复杂,播放过程对网络带宽要求较高,在网络复杂的场景用户体验较差。 Vue集成 集成之前大致了解了下,网上比较多的是vue-video-player和videojs,我选择了后者(之前video标签转过来还是不能跨度太大,免得拉跨)。 这东西让我折腾挺久的,只能怪自己懒,好好的文档不看,到处搜,结果搜到一堆复制粘贴的垃圾文章,也不知道什么年代的了,结果发布日期全是今年的。 官方文档相当简洁,其实非常简单,文档在此tutorial-vue,一目了然。 说说我的情况吧!,官方文档是在mounted方法中初始化播放器,但是我的视频流是动态加载的,这样直接加载会报错: CODE:4 MEDIA_ERR_SRC_NOT_SUPPORTED) No compatible source was found for this media 因为我的视频地址和视频类型都没有请求,只能在请求完成之后再初始化播放器。 播放器已经封装成组件了,看代码。 安装videojs: npm install --save video.js npm install --save @videojs/http-streaming //这个应该是不需要的,video.js在7.x就已经包含了,报错就还是加上吧,懒得试了 <template> <video ref="video" class="video-js" > <source :src="src" :type="video_type"> </video> </template> import Video from 'video.js' import '@videojs/http-streaming' import 'video.js/dist/video-js.css' //css要加载 export default { name: "playVideo", data: () => { return { player: null, } }, props: { width: { type: Number, default: 0, }, height: { type: Number, default: 0, }, src: { type:String, default: '', }, video_type: { type: String, default: 'video/mp4', } }, watch: { video_type(){ //监听props赋值,初始化播放器 this.initVideo(); } }, beforeDestroy() { //销毁不能少啊!!!!! if (this.player) { this.player.dispose() } }, methods: { pause() { this.$nextTick(function () { // DOM 现在更新了 // `this` 绑定到当前实例 this.$refs.video.pause(); }) }, initVideo() { //初始化视频方法 this.player = Video(this.$refs.video, { //确定播放器是否具有用户可以与之交互的控件。没有控件, //启动视频播放的唯一方法是使用autoplay属性或通过Player API。 controls: true, //自动播放属性,muted:静音播放 autoplay: "muted", //建议浏览器是否应在<video>加载元素后立即开始下载视频数据。 preload: "auto", //设置视频播放器的显示宽度(以像素为单位) width: this.width, //设置视频播放器的显示高度(以像素为单位) height: this.height, //网上很多没有用这个参数,默认获取<video><source src="" type=""/></video> //标签中的 source中的链接和类型,手动指定就可以避免动态获取视频信息的坑 sources: { src: this.src, //视频地址 type: this.video_type //视频类型 } }); } } } 结语 其实分分钟的是,搞了大半天。不过这个项目快一年没碰了,搞起来还有点懵逼。Graphql只用过一次,就是这项目上,Vue也好久没碰了,边熟悉边折腾,真是学无止尽啊。
2020年12月24日
1,081 阅读
0 评论
0 点赞
2020-12-22
QuantumultX-京东签到撸京东豆
前言 自从有了QuantumultX,各种签到脚本满天飞,调试、抓包都非常方便。京东签到脚本真的多,各种大大小小的签到、活动都做完,一天一百多个京东豆还是很容易的。 开撸 QuantumultX在1.0.17 (build 433) TF版加入了 task-gallery,而且正式版已经更新几个月了。 这东西就像是个脚本库,已经有大佬把脚本集合了,先放上来方便撸友: 2021-02-20 LXK0301 gitee仓库被大量外链访问封掉了,仓库访问已被禁止访问,返回403。目前已经套用CDN访问 大佬telegram脚本更新通知频道JD_fruit Script 以下是LXK0301大佬telegram bot最新消息,CDN节点已经屏蔽中国IP,需要梯子! 下面链接都是CDN,没流量了再说 BoxJs订阅地址:https://jdsharedresourcescdn.azureedge.net/jdresource/lxk0301.boxjs.json Surge的Task&Cookies脚本模块地址: https://jdsharedresourcescdn.azureedge.net/jdresource/lxk0301_Task.sgmodule.sgmodule Loon的Task&Cookies脚本订阅链接: https://jdsharedresourcescdn.azureedge.net/jdresource/lxk0301_LoonTask.conf 圈x: Task脚本订阅链接: https://jdsharedresourcescdn.azureedge.net/jdresource/lxk0301_gallery.json cookie脚本订阅链接: https://jdsharedresourcescdn.azureedge.net/jdresource/llxk0301_cookies.conf Peng-YM:https://gist.githubusercontent.com/Peng-YM/cc2cd6205b305d36544a44ec77129832/raw/gallery.json HotKids:https://raw.githubusercontent.com/HotKids/Rules/master/Quantumult/X/TaskGallery.json blackmatrix7:https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/script/gallery.json lxk0301 大佬:https://jdsharedresourcescdn.azureedge.net/jdresource/lxk0301_gallery.json 锄禾合集:https://dove.589669.xyz/task2qxgallery?sub=https://raw.githubusercontent.com/ChuheGit/1/main/Surge/Module/Task.sgmodule&img=1 打开QuantumultX,进入设置-构造请求(按红框标记点击): 点击+后输入上面大佬脚本地址,然后想要什么脚本就点击什么脚本,它会自动添加到定时任务中。 京东有些活动脚本不要随便修改执行时间,以免错失良机。 所有京东cookies通用,获取一次即可,保持一个月左右。 添加完脚本就要获取自己京东账号的cookies了,看大佬脚本描述: [rewrite_local] # 获取京东Cookie. # 注意此为远程路径, 低版本用户请自行调整为本地路径. https:\/\/api\.m\.jd\.com\/client\.action.*functionId=signBean url script-request-header https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js [mitm] hostname = api.m.jd.com 在QuantumultX配置文件中编辑rewrite_local和mitm,加入上文代码。保存后用手机浏览器访问https://bean.m.jd.com,登录(安装京东APP后一键登录,方便快捷),手动签到一次,QuantumultX会提示获取cookies成功,这时大功告成。 有些活动到时间后一次几百京东豆,不亦乐乎。 上面大神们的脚本有些签到哦已经失效了,使用过程签到不成功之类的问题就不要疑惑了,直接放弃就好! 结语 大神太多,脚本都用不过来,各种签到脚本已经很全了,小众的签到只能自己抓包调试了。
2020年12月22日
11,042 阅读
0 评论
3 点赞
2020-12-18
laradock-xdebug与php版本不兼容
前言 今天掉坑里了,为了添加grpc-php扩展,重新build php-fpm和workspace。过程相当顺利,而且启动docker都没问题,开发过程也没发现(api 调式和开发)。知道访问laravel-admin后台页面,访问半天打不开。HTTP 502错误。 摸索过程 出现502错误开始没在意,以为是早上composer update,太慢直接手动中断了,可能缓存什么的出问题了。 刚开始没在意,直到我尝试php artisan ide-helper:gen (ide-helper开发工具)时出错了 segmentation fault php artisan ide-helper:gen。 这下真有问题了。 尝试访问其他开发站点,登录页没有问题,laravel日志也没有。 查看docker日志 docker-compose logs php-fpm 出现大量日志 看到这行感觉莫名其妙: Illuminate\Contracts\Container\BindingResolutionException: Target [Closure] is not instantiable while building [Encore\Admin\Layout\Content]. in /var/www/html/vendor/laravel/framework/src/Illuminate/Container/Container.php on line。 不可能会出现这种错误啊,查看源码: namespace Encore\Admin\Layout; use ... class Content implements Renderable { ... /** * Content constructor. * * @param Closure|null $callback */ public function __construct(\Closure $callback = null) { if ($callback instanceof Closure) { $callback($this); } } } 构造函数有默认值,而且参数也是个闭包,不可能出现字符串Closure被容器实例化啊。简直一脸懵逼... 想断点调试代码,xdebug也失效了。开始用gdb调试过,发现大量xdebug关键字,想着八成与它脱不了干系。 去laradock看源码,对比本地php-fmp和workspace的Dockerfile文件,虽然没有新版本发布,但是这两文件确实有改动xdebug部分。 php-fpm ########################################################################### # xDebug: ########################################################################### ARG INSTALL_XDEBUG=false RUN if [ ${INSTALL_XDEBUG} = true ]; then \ # Install the xdebug extension if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ pecl install xdebug-2.5.5; \ else \ if [ $(php -r "echo PHP_MINOR_VERSION;") = "0" ]; then \ pecl install xdebug-2.9.0; \ else \ pecl install xdebug-2.9.8; \ fi \ fi && \ docker-php-ext-enable xdebug \ ;fi # Copy xdebug configuration for remote debugging COPY ./xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /usr/local/etc/php/conf.d/xdebug.ini && \ sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /usr/local/etc/php/conf.d/xdebug.ini && \ sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /usr/local/etc/php/conf.d/xdebug.ini workspace ########################################################################### # xDebug: ########################################################################### USER root ARG INSTALL_XDEBUG=false RUN if [ ${INSTALL_XDEBUG} = true ]; then \ # Install the xdebug extension if [ $(php -r "echo PHP_MAJOR_VERSION;") = "5" ]; then \ pecl install xdebug-2.5.5; \ else \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ] && [ $(php -r "echo PHP_MINOR_VERSION;") = "0" ]; then \ pecl install xdebug-2.9.0; \ else \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ] && [ $(php -r "echo PHP_MINOR_VERSION;") = "1" ]; then \ pecl install xdebug-2.9.8; \ else \ if [ $(php -r "echo PHP_MAJOR_VERSION;") = "7" ]; then \ pecl install xdebug-2.9.8; \ else \ #pecl install xdebug; \ echo "xDebug 3 required, not supported."; \ fi \ fi \ fi \ fi && \ echo "zend_extension=xdebug.so" >> /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/20-xdebug.ini \ ;fi # ADD for REMOTE debugging COPY ./xdebug.ini /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini RUN sed -i "s/xdebug.remote_autostart=0/xdebug.remote_autostart=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini && \ sed -i "s/xdebug.remote_enable=0/xdebug.remote_enable=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini && \ sed -i "s/xdebug.cli_color=0/xdebug.cli_color=1/" /etc/php/${LARADOCK_PHP_VERSION}/cli/conf.d/xdebug.ini xdebug版本被限制在2.9.8,我去xdebug官网查看发现最新3.0.1,立马去workspace执行php -v: PHP 7.4.13 (cli) (built: Nov 28 2020 06:24:43) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.13, Copyright (c), by Zend Technologies with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans 果然是最新版本,这是laradock问题,将php-fpm和workspace Dockerfile xdebug代码段替换再 build 就能解决了。 结语 xdebug 3.x估计是对应php8,目前开发环境使用PHP7,出现这种莫名其妙的错误真的很难调试。浪费大半天时间,重新build不知道多少遍,总之记住扩展不兼容也会出现各种莫名其妙问题。
2020年12月18日
805 阅读
0 评论
0 点赞
2020-06-23
IOS14-beta-尝鲜
前言 WWDC20 今天凌晨已经召开,与以往不同,这届是录播方式,可能与疫情有关! 整个开发者大会将近两个小时,我只特意关注了IOS14部分。没有那些炸天的新特性,大多数还是一些体验改进。 介绍 ios14描述文件下载 小组件 搜索页面小组件有形状多样化,而且长按还可以直接添加到桌面,添加到桌面会叠加你所使用的小组件,你可以向上或者向下翻动,显示更多。 翻译APP 一直使用google-翻译,IOS14新增了自带的翻译APP。 隐藏APP页面 在IOS14下可以隐藏其他APP页面,只保留主页面,其他被隐藏的app都会集中在APP资源库,也就是最后一页。 长按页面空白处,再点击dock栏上面的小点点就可以根据自己的喜欢隐藏页面了。 APP 资源库 APP资源库包含所有APP,并且会自动归类,大图标是经常使用的APP,而小图标是不常使用的APP,点击小图标会列出该类所有APP。 向下拉或者点击搜索,所有APP会已开头字母或者拼音首写字母排序,这样就方便多了。 来电更友好 来电不再是全屏显示了,可以继续干别的,向上推会缩起来,时间显示位置会有一个小电话的动画效果。锁屏界面还是全屏的。 vedio 画中画 在safari网页中播放的视频可以使用画中画功能,在设置-通用-画中画中可以关闭facetime和视频app返回页面时自动画中画功能。其他APP暂未发现此功能,说不定以后会支持。画中画只能拖放到四个角,不能放在任何你想放的位置。 向左或者向右可以把视频隐藏起来,但是还是在播放。 新增点击手机背部功能 在设置-辅助功能-触控-轻点背面中可以设置,分别为轻点两下和三下,可配置预设功能。 quantumultX 用户可能在wifi下其他APP没有网络 因为quantumultX作为代理,接管了路由,所以要开启本地网络权限。 按照作者的说明添加,并且允许即可。本机IP地址查看已连接wifi中的IP地址填上,如果出现无法链接服务器一般是已经允许,或者换wifi中的网关地址再试。 其实我以上方式都不行,估计是允许了,开机自动启动quantumultX时看到提示错误,重新开关下就好了。 结语 这次IOSBeta版本并没有太多BUG,至少没有发现严重影响使用的BUG。APP情况大多数都OK。不像IOS13Beta刚出来那会,wifi下电话都打不进来,漏接不少电话。虽然这次没有多少BUG,但是也确实没有很惊艳的功能,慢慢等IOS15吧............
2020年06月23日
1,101 阅读
0 评论
1 点赞
2020-06-05
阿里云活动-答题送T恤
前言 阿里云活动,限量 Linux X Hands-on Labs T恤免费领,参与linux实验并答题送T恤!!! 开搞 活动6月1-10号 获取路径: 访问 https://summit.aliyun.com/hol 体验馆-《Linux命令入门》 体验Linux场景,通过10道测试题 拿90分,T恤 Get 点击开始体验,实例创建完成,然后直接结束体验,再点击再次体验,再结束就可以开始做下一个任务了。 每天凌晨刷新200件,上午11点刷新300件好像是这样的,听说8-9号每天1000件。 可以先完成所有任务包括考试,等到刷新T恤后直接领取,领取要填写姓名,手机和收货地址 T恤有码,活动后统一收集! 考试答案 题目都一样,只是顺序可能不同。 1,下面哪个命令可以用于删除文件而无需确认 B A. rm B. rm -f C.del D.remove 2,下面哪个命令可以获取到当前工作目录的绝对路径 B A.passwd B.pwd C.whereis D.whois 3,下面哪条命令可以把f1.tst 复制为f2.txt? C A. cp f1.txt | f2.txt B.cat f1.txt | f2.txt C.cat f1.txt > f2.txt D. copy f1.txt | f1.txt 4,为了让文件的所有者有读(r)和写{w}的权限,而其他用户只能进行只读访问,权限应设置为 C A.566 B.655 C.644 D.744 5,在vim 编辑器中的命令模式下,键入( )可以光标当前所在行下添加一新行 A A.o B.p C.i D.a 6.在ps命令中,哪个参数可以用来 显示所有用户的进程? A A.a B.b C.u D.x 7,如何在文件中查找显示所有以“*”开头的行? D A. find \* file B.wc -l * < file C.grep -n * file D.grep '^\*' file (多选)8,下面哪些命令可以看到文件的大小? ACD (D选项存疑 自行判断) A.wc B.df C.du D.state (多选)9,Linux下用哪些命令可以在管道统计一个文件中单词出现的次数?ABD A.grep B.wc C.find D.awk (多选)10,下面哪些命令可以停止sshd服务? ABD A.ps -ef | grep sshd | xargs kill -9 B.killall sshd C.kill -9 sshd D.pidof sshd |xargs kill -9 结语 赶紧去撸羊毛吧!!!
2020年06月05日
898 阅读
0 评论
1 点赞
2020-03-27
Laradock-PHPStorm开启XDebug
前言 前几天写了一篇Laradock-部署本地开发环境,使用了几天发现确实很方便。最近又折腾点东西,没有XDebug确实不顺手,网上找了不少资料和教程,有些坑和解决方案记录一下。 开搞 开启XDebug 需要laradock容器php-fpm、workspace都安装XDebug,如果已经安装则不需要管它,否则需要修改你的laradock目录\.env。 PHP_FPM_INSTALL_XDEBUG=true WORKSPACE_INSTALL_XDEBUG=true PHP_IDE_CONFIG=serverName=laradock PHP_IDE_CONFIGXDebug服务名看你自己,你想改就改,不想改默认就行。 然后再重新build docker-compose build php-fpm workspace。每次build真心漫长,就一个扩展也要整个编译,这里不得不吐槽下。强烈建议科学上网或者修改laradock源地址(修改源地址我没有验证过,不会科学上网你可以试试): # If you need to change the sources (i.e. to China), set CHANGE_SOURCE to true CHANGE_SOURCE=true # Set CHANGE_SOURCE and UBUNTU_SOURCE option if you want to change the Ubuntu system sources.list file. UBUNTU_SOURCE=aliyun 配置xdebug.ini 两处都要修改你的laradock目录\workspace\xdebug.ini、你的laradock目录\php-fpm\xdebug.ini: //xdebug.remote_host="docker.for.win.host.internal" xdebug.remote_connect_back=1 xdebug.remote_port=9000 xdebug.idekey=PHPSTORM xdebug.remote_autostart=0 xdebug.remote_enable=0 xdebug.cli_color=0 xdebug.profiler_enable=0 xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling" xdebug.remote_handler=dbgp xdebug.remote_mode=req xdebug.var_display_max_children=-1 xdebug.var_display_max_data=-1 xdebug.var_display_max_depth=-1 两种方法: 修改xdebug.remote_host值为Windows:docker.for.win.host.internal,MacOS:docker.for.mac.host.internal。xdebug.remote_connect_back修改为0。 注释掉xdebug.remote_host配置,不指定主机xdebug.remote_connect_back=1,让XDebug自动捕获主机。 网上很多教程说是改成xdebug.remote_host=docker.for.win.localhost或者xdebug.remote_host=docker.for.mac.localhost,这是之前的写法,巨坑。直接使用第二种方法省得坑爹。 默认xdebug.ini配置文件是不能动态修改的,每次修改都必须build,为了方便可以修改docker-compose.yml文件 ### Workspace Utilities ################################## workspace: build: context: ./workspace args: ... volumes: ... - ./workspace/xdebug.ini:/etc/php/${PHP_VERSION}/cli/conf.d/xdebug.ini ###添加磁盘挂载 ### PHP-FPM ############################################## php-fpm: build: context: ./php-fpm args: ... volumes: ... - ./php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini ###添加磁盘挂载 ... 这样修改后可以热修改文件,就像配置nginx站点一样方便 配置PHPStorm 新建一个服务,服务名称就是这里配置的PHP_IDE_CONFIG=serverName=laradock laradock,Host填写你本地站点访问地址,开启Use path mappings,填写你的映射地址/var/www/you-project,然后OK。 点击Run菜单: 点击+添加一个PHP Remote Debug: 勾选Filter debug connection by IDE key,选择你的刚刚添加的Server,IDE key填写PHPSTORM,这个值是在xdebug.ini配置的。 再点击run, Debug 'xxx'就可以调试了。 我在调试的时候发现PHPStorm时不时断点,提示错误:Remote file path '/var/www/xxxxx artisan' is not mapped to any file path in project,这是因为XDebug也会调试php cli,如果不需要可以关掉: 进入workspace容器docker-compose exec workspace bash。 编辑cli的xdebug.ini,nano /etc/php/7.4/cli/conf.d/xdebug.ini,注意你自己的PHP版本,修改两项配置:xdebug.remote_autostart=0 xdebug.remote_enable=0 保存退出就好了,不会再调试php cli了。需要的时候再打开好了。 配置后所有laradock容器中的站点全部都有效。你可以试着访问容器中其他站点,当前项目也会进入调试模式,而且PHPStorm又出现错误:Remote file path '/var/www/xxxxx' is not mapped to any file path in project。因为当前目录映射找不到。要重新打开其他项目,配置下目录映射,然后再开启动调试,不要开多个PHPStorm一起调试,会疯掉的。 结语 在这里浪费不少时间,确实够折腾的,不过确实长记性了,最近又开始折腾Laravel nova,2018年刚出的时候确实很多不完善,一直使用Laravel admin,总得来说还是没有Laravel nova那么舒服。现在Laravel nova经过那么长时间过度已经很完善了,是时候使用Laravel nova继续折腾了。
2020年03月27日
1,631 阅读
0 评论
1 点赞
2020-03-23
Golang oh-my-zsh 自定义插件批量更新程序
前言 Golang很火啊,引用维基百科词条说明 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。。并发对于我来说接触很少,几乎没有写过多线程并发之类的程序。之前折腾Python的时候使用过多线程,执行效率要高不少。PHP也有多线程,我真是一次都没有用到过。 oh my zsh(有兴趣可以了解下oh-my-zsh强大的zsh配置管理)会自动提示更新,但是自己安装的一些插件却不会一起更新,最近翻了一遍Go语言官方文档,写了个oh my zsh自定义插件更新程序。 开搞 oh my zsh的自定义插件都安装在了/root/.oh-my-zsh/custom/plugins目录下,我随便找了个已安装的插件试着git pull,果然没有更新。插件也不多,就两个。但是我看了Go语言文档有劲没处使啊,就要折腾下。 我不仅要写,我还要多线程,各种多线程。 第一步,找出需要更新的目录 上网查、看文档,折腾出这么个玩意: func GetDir(path string) ([]string, error) { var s []string rd, err := ioutil.ReadDir(path) if err != nil { fmt.Println("read dir error:", err) return s, err } for _, dir := range rd { if dir.IsDir() { s = append(s, path+"/"+dir.Name()) } } return s, err } ioutil.ReadDir读取传入路径下所有文件和目录,然后找出所有目录返回,这样一个简单的获取oh my zsh自定义插件目录的函数就封装好了。 第二步,进入目录更新 其实写这篇文章的时候我已经修改了好几遍程序了,还是贴最终的吧。 更新函数,遍历目录然后执行pull函数拉代码。 var wg sync.WaitGroup ... func Update(path string) { //不异步不需要执行 defer wg.Done() paths, _ := GetDir(path) if len(paths) != 0 { for _, dir := range paths { //添加进程数 wg.Add(1) fmt.Println("get pull dir:", dir) go Pull(dir) } } } 最开始的版本没有使用sync.WaitGroup,会出现问题。涉及到Channels,主线程也是用多线程,update函数中也有多线程。Channels在使用<- ch接收值时会堵塞,直到ch接收到Channels的值后继续执行。那么不使用sync.WaitGroup堵塞进程,还没等子线程/协程执行完主线程就已经执行完毕退出了。 func Pull(path string) { //每执行一个进程都要标记完成 defer wg.Done() //command := exec.Command("sh", "-c", "cd ", path, "&&", "git", "pull") command := exec.Command("sh", "-c", "cd " + path + "&& git pull") ch := make(chan int) go Stdout(command, ch) fmt.Println("ProcessState PID:", <- ch) } exec.Command有点讲究,起初我直接把命令作为第一个参数传入是不行的,需要把命令拆分成参数才能执行。 后面我又把获取参数封装成了Stdout函数,其实我想折腾下Channels。 第三步,返回命令行输出 折腾起来浑身是劲,编写命令行返回输出函数,我要看到所有git pull的执行结果。 func Stdout(command *exec.Cmd, ch chan int) { stdout, _ := command.StdoutPipe() stderr, _ := command.StderrPipe() if err := command.Start(); nil != err { fmt.Println("command start err:", err) ch <- 0 return } pid := command.Process.Pid output(stdout, pid) output(stderr, pid) err := command.Wait() //等待执行完成 if nil != err { fmt.Printf("Process PID %d command wait err: %s", pid, err) } ch <- command.ProcessState.Pid() return } command.StdoutPipe,command.StderrPipe分别获取命令正确输出返回和错误输出返回,好打印出来。command.Wait()等待命令结束。exec.Command需要好好看看文档。直接执行命令不需要这么麻烦,使用exec.Run()就行,但是我要捕获命令输出,所以相对麻烦。 func outputLine(oReader *bufio.Reader, pid int) { for { line, err := oReader.ReadString('\n') if nil != err{ if io.EOF != err { log.Printf("Process PID %d: err %v", pid, err) } break } log.Printf("Process PID %d: %s", pid, line) } } func output(stdout io.ReadCloser, pid int) { oReader := bufio.NewReader(stdout) outputLine(oReader, pid) } 这两个函数主要是重复代码太多,封装了下,outputLine函数主要是按行输出命令返回信息。 第四部,主函数 主函数我改进接收参数功能,在执行的时候可以接收多个目录参数,然后并发git pull。 func main() { // 接收多目录参数 args := os.Args[1:] if len(args) != 0 { for _, path := range args { fmt.Println(path) wg.Add(1) go Update(path) } } else { path := "/root/.oh-my-zsh/custom/plugins" //添加进程数,相对于Update异步,如果Update不异步可以不需要add wg.Add(1) go Update(path) //等待所有进程全部结束后退出主线程 } wg.Wait() } sync.WaitGroup就是一个计数器,使用Add()添加,Done()就释放,Wait()会等待所有Add()全部Done()后向下执行,否则一直堵塞进程。如果这里我使用Channels无法控制,主线程传入Channels,那么Update()函数何时返回呢?函数中又是多进程/协程,没有找到其他办法,因为Update()函数中还要输出,全部用Channels会乱成一锅粥的。 贴一下完整代码吧,看著挺乱的: package main import ( "bufio" "fmt" "io" "io/ioutil" "log" "os" "os/exec" "runtime" "sync" ) // 更新oh my zsh 自定义插件 //同步 var wg sync.WaitGroup func GetDir(path string) ([]string, error) { var s []string rd, err := ioutil.ReadDir(path) if err != nil { fmt.Println("read dir error:", err) return s, err } for _, dir := range rd { if dir.IsDir() { s = append(s, path+"/"+dir.Name()) } } return s, err } func Update(path string) { //不异步不需要执行 defer wg.Done() paths, _ := GetDir(path) if len(paths) != 0 { for _, dir := range paths { //添加进程数 wg.Add(1) fmt.Println("get pull dir:", dir) go Pull(dir) } } } func Stdout(command *exec.Cmd, ch chan int) { stdout, _ := command.StdoutPipe() stderr, _ := command.StderrPipe() if err := command.Start(); nil != err { fmt.Println("command start err:", err) ch <- 0 return } pid := command.Process.Pid output(stdout, pid) output(stderr, pid) err := command.Wait() //等待执行完成 if nil != err { fmt.Printf("Process PID %d command wait err: %s", pid, err) } ch <- command.ProcessState.Pid() return } func outputLine(oReader *bufio.Reader, pid int) { for { line, err := oReader.ReadString('\n') if nil != err{ if io.EOF != err { log.Printf("Process PID %d: err %v", pid, err) } break } log.Printf("Process PID %d: %s", pid, line) } } func output(stdout io.ReadCloser, pid int) { oReader := bufio.NewReader(stdout) outputLine(oReader, pid) } func Pull(path string) { //每执行一个进程都要标记完成 defer wg.Done() //command := exec.Command("sh", "-c", "cd ", path, "&&", "git", "pull") command := exec.Command("sh", "-c", "cd " + path + "&& git pull") ch := make(chan int) go Stdout(command, ch) fmt.Println("ProcessState PID:", <- ch) } func main() { // 接收多目录参数 args := os.Args[1:] if len(args) != 0 { for _, path := range args { fmt.Println(path) wg.Add(1) go Update(path) } } else { path := "/root/.oh-my-zsh/custom/plugins" //添加进程数,相对于Update异步,如果Update不异步可以不需要add wg.Add(1) go Update(path) //等待所有进程全部结束后退出主线程 } wg.Wait() } 最后使用go build 文件名编译就好了,跨平台。 结语 在看Golang文档的时候语法有点别扭,不过敲了几遍后居然特别顺手。敲这个程序真的试了很多只用Channels的方法,但是达不到想要的效果,还是总线程不等待所有子线程执行完毕的问题。因为这里线程/协程用得太杂乱了。不过这就是我的目的,让线程/协程极致的情况下怎么控制好。各种线程/协程满天飞是怎么样的体验。
2020年03月23日
1,092 阅读
0 评论
0 点赞
2020-03-22
Ubuntu-18.10降级至18.04
前言 不知什么时候买的一台服务器,很久没有管它了,今天无聊上去看看,本想装个oh my zsh(有兴趣的同学可以看看我写的文章oh-my-zsh强大的zsh配置管理),在更新源(apt update)出现错误Failed to fetch http://xxx 404 Not Found,一部分官方源404了,这种错误是由于Ubuntu18.10已经停止维护了,18.10并不是LTS版本,已经停止维护了。 网上找了一通,基本上替换源为old-releases.ubuntu.com即可: ### 一定要备份啊 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i -r 's/([a-z]{2}\.)?archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo sed -i -r 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo apt update 一般这样操作后可以继续使用当前Ubuntu版本了。 但是当前版本的Ubuntu已经停止更新维护了,索性还是降级算了。 降级Ubuntu至18.04LTS 1. 替换源代号 这些cosmic是Ubuntu18.10版本的代号,需要修改成bionic,用命令修改,不然头疼: ### 切记备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i 's/cosmic/bionic/g' /etc/apt/sources.list 2. apt软件包降级 sudo nano /etc/apt/preferences ### 粘贴以下信息 Package: * Pin: release a=bionic Pin-Priority: 1001 3. 更新 接下来更新软件源,升级 sudo apt update sudo apt upgrade sudo apt dist-upgrade 出现警告很正常,不用管它,不是致命错误。 安装期间有些软件需要替换会堵塞询问,例如nginx,由于我有写小玩意在服务器,就不替换了,使用当前版本,具体看你的需求。默认选项是N,你也可以一路回车下去。 等待更新完成: 最后查看当前版本信息: cat /etc/os-release| grep -i version 到这里就成功啦!!! 还有些小问题 系统算是降级成功了,在执行apt update又出错了。 一堆错误直接退出了。 snap包管理器,从ubuntu 16.04LTS就默认安装。在执行apt update也会执行snap包管理器的更新,反正我没用过,如果有需要那就删了再装吧。 ### 删除snap sudo rm -rf /etc/apt/apt.conf.d/20snapd.conf 结语 又折腾到十一点,降级之前装oh my zsh敲太快,执行了chsh -s /bin/zsh,然后发现服务器内存吃紧,索性升级了一下。这倒好,进不去系统了,登录后弹出,又要登录,死循环。 我以为密码错了,打开服务商控制台后ctrl+alt+del 然后 esc,选择第一个引导项输入e,在linux /boot/...这一行后面加上init=/bin/bash,ctrl +x,系统会启动命令行,修改密码passwd然后exit,重启进入系统,发现还是登录不上去。研究了半天,各种资料一顿查。 这种情况网上都说/.Xauthority文件权限问题,我是用root用户登录能有什么问题呢? 挂载Finnix系统,挂载服务器磁盘mount /dev/vda1 /mnt,上去看auth.log日志,sshd[1192]: User root not allowed because shell /bin/zsh does not exist 发现这行错误,这个zsh真是特别打眼的,就是它的锅,因为18.10版本已经过期,apt update都失败,我都没看就直接装apt install zsh,当然也失败了。而且还直接使用chsh -s /bin/zsh,把密码验证shell给改成zsh了。 改回来试试吧(此时我的环境是在挂载的Finnix系统中): nano /mnt/etc/passwd 果不其然,改成root:x:0:0:root:/root:/usr/bin/bash,退出Finnix,移除Finnix,开机登录上去了。 累死了,不过又GET到新技能。
2020年03月22日
2,704 阅读
0 评论
0 点赞
1
2
3