From d3caf2afb64150144568761a6db2410321ffcf38 Mon Sep 17 00:00:00 2001 From: name Date: Wed, 27 Apr 2022 11:33:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E9=99=A4=E5=8E=86=E5=8F=B2=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=EF=BC=8C=E9=81=BF=E5=85=8D=E6=8B=89=E5=8F=96=E4=BB=93?= =?UTF-8?q?=E5=BA=93=E6=97=B6=E5=8C=85=E5=90=AB=E5=8E=86=E5=8F=B2=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/destversion.yml | 23 ++++++ .github/workflows/notify.yml | 18 +++++ .gitignore | 30 +++++++ README.md | 21 +++++ scripts/destVersionRelease.sh | 127 ++++++++++++++++++++++++++++++ scripts/destversion.sh | 85 ++++++++++++++++++++ scripts/notify.sh | 84 ++++++++++++++++++++ 7 files changed, 388 insertions(+) create mode 100644 .github/workflows/destversion.yml create mode 100644 .github/workflows/notify.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100755 scripts/destVersionRelease.sh create mode 100755 scripts/destversion.sh create mode 100755 scripts/notify.sh diff --git a/.github/workflows/destversion.yml b/.github/workflows/destversion.yml new file mode 100644 index 0000000..c528175 --- /dev/null +++ b/.github/workflows/destversion.yml @@ -0,0 +1,23 @@ +name: Wechat Dest Version + +on: + schedule: + - cron: '0 7 * * *' + workflow_dispatch: + inputs: + download_link: + description: 'The manual WechatSetup.exe download link' + required: false + default: 'https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe' + +jobs: + save_new_wechat: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + # - name: Test Github Action Server Time + # run: echo `date` + - name: Check new version and push + env: + GHTOKEN: ${{ secrets.GHTOKEN }} + run: bash -x ./scripts/destVersionRelease.sh ${{ github.event.inputs.download_link }} diff --git a/.github/workflows/notify.yml b/.github/workflows/notify.yml new file mode 100644 index 0000000..663bc79 --- /dev/null +++ b/.github/workflows/notify.yml @@ -0,0 +1,18 @@ +name: Wechat Release Notify + +on: + release: + types: [published] + + +jobs: + notify_to_tg: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Check new version and push + env: + GHTOKEN: ${{ secrets.GHTOKEN }} + BOTTOKEN: ${{ secrets.BOTTOKEN }} + CHATIDS: ${{ secrets.CHATIDS }} + run: bash -x ./scripts/notify.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ab55c2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,30 @@ +################################################################################ +# This below was automatically created for macOS system +################################################################################ +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk diff --git a/README.md b/README.md new file mode 100644 index 0000000..477c6b9 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# wechat-windows-versions +收集 Windows 微信版本并保存 + +## 目录结构 +```shell +├── README.md # 自述文件 +├── WeChatSetup # 微信安装包临时目录 +│ └── temp # 临时目录 +└── scripts # 脚本目录 + ├── destVersionRelease.sh # 获取安装包及取得版本号与 hash 值的脚本 + └── notify.sh # 新release 时调用通知的脚本 +``` + +## 说明 +项目使用 Github Action 自动下载微信最新版本安装包计算 Hash 值并推送至仓库。 + +**注意: 3.5.0.46 版本以下(不包含 3.5.0.46 版, 仅下载了一部分)均下载自 [web.archive.org](https://web.archive.org/web/*/https://pc.weixin.qq.com/)** + +各版本更新日志可参见 [changelog](https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_faq_list&head=true) + +*如有问题/侵权,请直接提交 issue 告知。* diff --git a/scripts/destVersionRelease.sh b/scripts/destVersionRelease.sh new file mode 100755 index 0000000..bc4bede --- /dev/null +++ b/scripts/destVersionRelease.sh @@ -0,0 +1,127 @@ +#!/usr/bin/env bash + +set -eo pipefail + +temp_path="WeChatSetup/temp" +latest_path="WeChatSetup/latest" + +download_link="$1" +if [ -z "$1" ]; then + >&2 echo -e "Missing argument. Using default download link" + download_link="https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe" +fi + +function install_depends() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mInstalling 7zip, shasum, wget, curl, git\033[0m" + printf "#%.0s" {1..60} + echo + + apt install -y p7zip-full p7zip-rar libdigest-sha-perl wget curl git +} + +function login_gh() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mLogin to github to use github-cli...\033[0m" + printf "#%.0s" {1..60} + echo + if [ -z $GHTOKEN ]; then + >&2 echo -e "\033[1;31mMissing Github Token! Please get a BotToken from 'Github Settings->Developer settings->Personal access tokens' and set it in Repo Secrect\033[0m" + exit 1 + fi + + echo $GHTOKEN > WeChatSetup/temp/GHTOKEN + gh auth login --with-token < WeChatSetup/temp/GHTOKEN + if [ "$?" -ne 0 ]; then + >&2 echo -e "\033[1;31mLogin Failed, please check your network or token!\033[0m" + clean_data 1 + fi + rm -rfv WeChatSetup/temp/GHTOKEN +} + +function download_wechat() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mDownloading the newest WechatSetup...\033[0m" + printf "#%.0s" {1..60} + echo + + wget "$download_link" -O ${temp_path}/WeChatSetup.exe + if [ "$?" -ne 0 ]; then + >&2 echo -e "\033[1;31mDownload Failed, please check your network!\033[0m" + clean_data 1 + fi +} + +function extract_version() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mExtract WechatSetup, get the dest version of wechat\033[0m" + printf "#%.0s" {1..60} + echo + + local outfile=`7z l ${temp_path}/WeChatSetup.exe | grep improve.xml | awk 'NR ==1 { print $NF }'` + ## 7z x ${temp_path}/WeChatSetup.exe -o${temp_path}/temp "\$R5/Tencent/WeChat/improve.xml" + 7z x ${temp_path}/WeChatSetup.exe -o${temp_path}/temp $outfile + dest_version=`awk '/MinVersion/{ print $2 }' ${temp_path}/temp/$outfile | sed -e 's/^.*="//g' -e 's/".*$//g'` +} + + +# rename and replace +function prepare_commit() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mPrepare to commit new version\033[0m" + printf "#%.0s" {1..60} + echo + + mkdir -p WeChatSetup/$dest_version + cp $temp_path/WeChatSetup.exe WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe + echo "DestVersion: $dest_version" > WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 + echo "Sha256: $now_sum256" >> WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 + echo "UpdateTime: $(date -u '+%Y-%m-%d %H:%M:%S') (UTC)" >> WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 + echo "DownloadFrom: $download_link" >> WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 + +} + +function clean_data() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mClean runtime and exit...\033[0m" + printf "#%.0s" {1..60} + echo + + rm -rfv WeChatSetup/* + exit $1 +} + +function main() { + # rm -rfv WeChatSetup/* + mkdir -p ${temp_path}/temp + login_gh + ## https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md + # install_depends + download_wechat + + now_sum256=`shasum -a 256 ${temp_path}/WeChatSetup.exe | awk '{print $1}'` + local latest_sum256=`gh release view --json body --jq ".body" | awk '/Sha256/{ print $2 }'` + + if [ "$now_sum256" = "$latest_sum256" ]; then + >&2 echo -e "\n\033[1;32mThis is the newest Version!\033[0m\n" + clean_data 0 + fi + ## if not the newest + extract_version + prepare_commit + + gh release create v$dest_version ./WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe -F ./WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 -t "Wechat v$dest_version" + + gh auth logout --hostname github.com | echo "y" + + clean_data 0 +} + +main + diff --git a/scripts/destversion.sh b/scripts/destversion.sh new file mode 100755 index 0000000..f35cc09 --- /dev/null +++ b/scripts/destversion.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# 已废弃 + +set -eo pipefail + +temp_path="WeChatSetup/temp" +latest_path="WeChatSetup/latest" + +function install_depends () { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mInstalling 7zip, shasum, wget, curl, git\033[0m" + printf "#%.0s" {1..60} + echo + apt install -y p7zip-full p7zip-rar libdigest-sha-perl wget curl git +} + +function download_wechat() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mDownloading the newest WechatSetup...\033[0m" + printf "#%.0s" {1..60} + echo + wget https://dldir1.qq.com/weixin/Windows/WeChatSetup.exe -O ${temp_path}/WeChatSetup.exe + if [ "$?" -ne 0 ]; then + >&2 echo -e "\033[1;31mDownload Failed, please check your network!\033[0m" + exit 1 + fi +} + +function extract_version() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mExtract WechatSetup, get the dest version of wechat\033[0m" + printf "#%.0s" {1..60} + echo + mkdir -p ${temp_path}/temp + local outfile=`7z l ${temp_path}/WeChatSetup.exe | grep improve.xml | awk 'NR ==1 { print $NF }'` + # 7z x ${temp_path}/WeChatSetup.exe -o${temp_path}/temp "\$R5/Tencent/WeChat/improve.xml" + 7z x ${temp_path}/WeChatSetup.exe -o${temp_path}/temp $outfile + dest_version=`awk '/MinVersion/{ print $2 }' ${temp_path}/temp/$outfile | sed -e 's/^.*="//g' -e 's/".*$//g'` + rm -rfv ${temp_path}/temp +} + + +# rename and replace +function prepare_commit() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mPrepare to commit new version and clean runtime\033[0m" + printf "#%.0s" {1..60} + echo + mkdir -p WeChatSetup/$dest_version + cp $temp_path/WeChatSetup.exe WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe + echo "$now_sum256 WeChatSetup-$dest_version.exe" > WeChatSetup/$dest_version/WeChatSetup-$dest_version.exe.sha256 + + cp $temp_path/WeChatSetup.exe WeChatSetup/latest/WeChatSetup-latest.exe + echo "$now_sum256 WeChatSetup-latest.exe" > WeChatSetup/latest/WeChatSetup-latest.exe.sha256 + + # clean runtime + rm -rfv ${temp_path}/* +} + + +function main() { + install_depends + download_wechat + + now_sum256=`shasum -a 256 ${temp_path}/WeChatSetup.exe | awk '{print $1}'` + local latest_sum256=`cat ${latest_path}/WeChatSetup-latest.exe.sha256 | awk '{print $1}'` + + if [ "$now_sum256" = "$latest_sum256" ]; then + >&2 echo -e "\n\033[1;32mThis is the newest Version! Clean runtime and exit...\033[0m\n" + rm -rfv ${temp_path}/* + exit 0 + fi + ## if not the newest + extract_version + prepare_commit + + git add . && git commit -m "Add new dest version: $dest_version" && git push origin master +} + +main + diff --git a/scripts/notify.sh b/scripts/notify.sh new file mode 100755 index 0000000..ec4bf59 --- /dev/null +++ b/scripts/notify.sh @@ -0,0 +1,84 @@ +#!/usr/bin/env bash + +set -eo pipefail + + +if [ -z $GHTOKEN ]; then + >&2 echo -e "\033[1;31mMissing Github Token(GHTOKEN)! Please get a BotToken from 'Github Settings->Developer settings->Personal access tokens' and set it in Repo Secrect\033[0m" + exit 1 +fi + +if [ -z $BOTTOKEN ]; then + >&2 echo -e "\033[1;31mMissing Bot Token(BOTTOKEN)! Please get a BotToken from @Botfather on Telegram and set it in Repo Secrect\033[0m" + exit 2 +fi + +if [ -z $CHATIDS ]; then + >&2 echo -e "\033[1;31mMissing ChatIds(CHATIDS)! Please get ChatId from @GroupIDbot on Telegram Chats(Muti chatids split with comma ',') and set it in Repo Environment Values\033[0m" + exit 2 +fi + +function login_gh() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mLogin to github to use github-cli...\033[0m" + printf "#%.0s" {1..60} + echo + + echo $GHTOKEN > WeChatSetup/temp/GHTOKEN + gh auth login --with-token < WeChatSetup/temp/GHTOKEN + if [ "$?" -ne 0 ]; then + >&2 echo -e "\033[1;31mLogin Failed, please check your network or token!\033[0m" + clean_data 1 + fi + rm -rfv WeChatSetup/temp/GHTOKEN +} + +### https://kodango.com/sed-and-awk-notes-part-5 +## start=${1:-""} means as follows in general +## if ($1) then +## start=$1 +## else +## start="" +## end +function join_lines() { + local delim=${1:-,} + sed 'H;$!d;${x;s/^\n//;s/\n/\'$delim'/g}' +} + +function clean_data() { + printf "#%.0s" {1..60} + echo + echo -e "## \033[1;33mClean runtime and exit...\033[0m" + printf "#%.0s" {1..60} + echo + + rm -rfv WeChatSetup/* + exit $1 +} + +function main() { + temp_path="WeChatSetup/temp" + mkdir -p ${temp_path} + + login_gh + + gh release view --json body --jq ".body" > ${temp_path}/release.info + + release_info=`awk '!/^$|Sha256/ { $1="*"$1"*";sub("UpdateTime", "CheckTime"); if ( match($2, /https?:\/\/([\w\.\/:])*/) ) $2="[Url]("$2")"; print $0 }' ${temp_path}/release.info | join_lines '%0A' | sed 's/ /%20/g'` + dest_version=`awk '/DestVersion/ { print $2 }' ${temp_path}/release.info` + release_info="$release_info%0A%0A*NotifyFrom:*%20[Github](https://github.com/tom-snow/wechat-windows-versions/releases/tag/v$dest_version)" + + echo $CHATIDS | sed 's/,/\n/g' > ${temp_path}/chat_ids + # while IFS="" read -r chatid || [ -n "$chatid" ] + while IFS="" read -r chatid + do + api_link="https://api.telegram.org/bot$BOTTOKEN/sendMessage?chat_id=$chatid&text=*New%20WeChat%20Windows%20Version!!*%0A%0A$release_info&parse_mode=Markdown&disable_web_page_preview=true" + curl -s -o /dev/null $api_link + done < ${temp_path}/chat_ids + + gh auth logout --hostname github.com | echo "y" + clean_data 0 +} + +main \ No newline at end of file