E5的全部续订方法

写在最前面

申请教程在前面,请自行查看

以下是鸣谢名单(排名不分先后)

EdNovas SundayRX SAM Misaka No
MS365 E5 Renew Plus全体开发者

关于排序

我将按照稳定性自动排序,纯属亲测,仅代表一家之言,如有错误,请多改正

NO.1 PC本地软件/Windows VPS 部署软件

官网地址:https://e5renew.com

下载并且安装软件

官方使用文档(看作者Sundays的)

LINK:https://blog.csdn.net/qq_33212020/article/details/119747634

为了节省大家的时间

以下是缩略版本

1.注册AZ应用程序

1.点击登录 Azure或点击直接进入Azure应用注册,登录账号使用申请到的Microsoft 365 E5的管理员账户(账户名类似XXXX@YYYY.onmicrosoft.com格式)。
2.登录完成后点击右上角的“门户”按钮进入Azure管理中心,在搜索栏内输入“应用注册”,点击进入(若应用注册搜索不到请点击此处直接进入)。

!

3.单击“新注册”按钮

!

4.配置应用 应用名称随意写、注意可访问性选项选择最后一项、重定向URL暂时不填 、完成后点击注册

!

2 配置应用重定向URL(身份验证)

1.先点击“概述”,然后点击“添加重定向URL”,进入重定向URL配置界面,下图中的应用程序(客户端)ID即为”客户端ID”。
!

2.点击“添加平台”,再点击“移动和桌面应用程序”

!

3.继续勾选中第一个URL,最后点击底部的“配置”,该URL为“https://login.microsoftonline.com/common/oauth2/nativeclient”也可手动添加。

!

4.配置默认客户端类型将应用程序视为公共客户端 点击切换按钮为“是” ,最后点击“保存”按钮保存。

!

3.配置应用程序的API权限(重要)

这里直接用“委托的权限(用户登录)”

其更简单和成功率高

手动配置API权限
1.点击“API权限”-“添加权限”-“Microsoft Graph”

!

2.选择“委托的权限”

!

3.根据编辑页面中列出的API权限需求表(注意在程序中切换为”登录“)来勾选所对应的API权限,全部选择完成后点击”添加权限”。

!

!

添加完后

!

如果没有“代表XXX授予管理员同意”按钮 说明该账号不是管理员账号 换登管理员账号创建应用

4.最后点击代表XXX授予管理员同意,对话框选择“是”(该图包含了当前程序“委托的权限(用户登录)”全部API所需要的权限)。

!

3 使用程序进行 API 调用

tips:最好用子号

创建一个新的 E5 子账户 (可选步骤)
登入 E5 管理员账户进入管理员界面,创建一个新的子账户,使用这个子账户登录程序调用 API。
为什么建议这样做:Microsoft 365 E5 Renew Plus 中的部分 API 包含了写操作,例如 Onedrive 的 API,这些 API 在随机模式下会生成大量垃圾邮件和文件(虽然单独为此设立了一个文件夹),部分人可能会对此行为非常介意,而且程序频繁的读写可能会对您正常使用账户造成影响,因此不建议使用管理员账户登录。

3.1 添加一个账户

点击 “开始运行”-“添加账号”
!

这里可以切换 API 调用方式但也需要更改对应的填写内容

登录调用方式填写

!

最后点击确定

!

3.2 开始运行

点击 “开始运行”

!

LAST

关闭 E5 账户登录双重验证

点击进入 Office 365 E5 账户多重身份验证管理,并且按照下图配置即可关闭 E5 账户登录的双重验证。

!

!

关闭 Azure 中 API 调用的双重验证
点击进入 Azure Active Directory 管理中心,按照下图配置即可关闭 Azure 中 API 调用的双重验证。

!

以上原内容来自于
SundayRX 博客:https://blog.csdn.net/qq_33212020/article/details/119747634

EdNovas 的小站:https://ednovas.xyz/2022/01/10/e5renewplus/

NO.2 web

  • 你需要的东西

一个微软账户/GITHUB号

可用站点

主站:https://e5.sundayrx.net(由 SundayRX 运营)(可登录不可注册)

自建共享站点
自建共享站:https://ew.chirmyram.com(由 七米蓝 运营)(可登录不可注册)

自建共享站:https://e5.hm0420.cc(由 小冰酱 运营)

自建共享站:https://ms-e5.hm0420.cc(由 小冰酱 运营)

自建共享站:https://e5.xzh.gs(由 XZH 运营)

自建共享站:https://e5.tianli0.top(由 Tinali 运营)

自建共享站:https://renew.lrize.xyz(由 Lrize、 运营)

自建共享站:https://e5zh.xyz(由 z 运营)

2.1 进入网站注册并登录账户

从可用站点列表中,选择站点进入(记住无论使用任何人运营网站显示内容都是基本相同的)

从两种登录中任选一个,这里不建议选择GitHub登录(GitHub的第三方登录很迷经常性崩溃)

第一次登录账户系统会显示注册成功,然后再登录一次即可登录进入系统

!

2.2 激活您的账户

阅读并同意用户协议,点击激活账户

!

2.3 添加一个E5账户的运行配置信息

在成功登录系统后,页面会自动跳转到“主页”页面,在“账户详情”页面点击“添加运行账号”按钮,前往“账户运行配置”页面

!

在账户运行配置页面中填写账户信息,且登录调用填写账户密码、非登录调用填写客户端密码,并选择自己选定的调用方式,注意调用方式不要选错了!!! 最后点击“添加运行账号”按钮完成配置。

!

由于前后台数据同步需要时间,任何添加账户或者修改账户配置信息的操作都不会立即被后台执行。

返回用户页面查看账户信息中的“配置同步状态”,如果显示为“正在运行”表明配置已经上传至后台,修改账户配置成功。
警示:配置成功了也要定期来看看自己的账户是否在正常运行(虽然有邮件通知服务),但也建议每月查看一次账户状态!!!

!

2.4设置一个通知邮箱(强烈建议)
在任何页面下 点击右上角“用户名-账户设置”,进入个人信息设置

!

记住你的UID,出现任何问题请使用这个UID与你所选站点的管理员沟通

编辑你的邮箱 并点击保存
!

以下是部署端

(请勿使用任何Cookie缓存加速服务)

传统方式
下载服务程序源文件(https://sundayrx.lanzoui.com/aW09Lsss75g)

参阅 Skyler的部署帮助文档(https://docs-1.leeskyler.top)
参阅 Gladtbam的部署帮助文档 (https://www.gladtbam.top/posts/37680)

Docker方式
参阅 韩韩的Docker版部署帮助文档(https://blog.csdn.net/qq_40605167/article/details/122888580)
参阅 Gladtbam的Docker版部署帮助文档(https://www.gladtbam.top/posts/22256/)
参阅 Curious的部署帮助文档 (https://www.bilibili.com/read/cv16338214)

传统方式服务部署
安装运行环境
以下示例可能不完全包含全部操作系统,但无论是哪种系统都要安装 Asp.Net Core 3.1 SDK支持包,服务程序运行依赖于这个包也只依赖这一个包,只要成功安装了Asp.Net Core 3.1 SDK支持包,服务程序就可以正常运行!
详情请参阅在 Windows、Linux 和 macOS 上安装 .NET

Windows
前往https://dotnet.microsoft.com/download/dotnet/3.1下载安装最新的Asp.Net Core 3.1 SDK 安装包

Ubuntu
详情请参阅在 Ubuntu 上安装 .NET SDK 或 .NET 运行时

Ubuntu 21.04

1
2
3
4
5
6
7
8
wget https://packages.microsoft.com/config/ubuntu/21.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y aspnetcore-runtime-3.1

CentOS
详情请参阅在 CentOS 上安装 .NET SDK 或 .NET 运行时

CentOS 8

1
sudo dnf install dotnet-sdk-3.1

CentOS 7

1
2
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.1

MacOS
前往https://dotnet.microsoft.com/download/dotnet/3.1下载安装最新的Asp.Net Core 3.1 SDK 安装包

填写配置信息
站点拥有开放和私用两种模式,请根据自己的部署目的来选择对应的教程来阅读!
配置文件是Deploy/Config.xml 务必打开并修改默认的管理员登录密码

开放站点
开放站点必须使用全链路HTTPS,即便是使用了Nginx反向代理也必须设置HTTPS为启用状态

Configuration.ShareSite.Enable设置为true

HTTPS SSL证书
方式1:服务程序Kestrel—(HTTPS)—外部Internet
准备一个PFX格式的SSL证书文件,放置在Deploy文件夹中

Configuration.HTTPS.Enable设置为true
Configuration.HTTPS.Certificate设置为PFX文件的名称带后缀名
Configuration.HTTPS.Password设置为PFX文件的密码

方式2:服务程序Kestrel—(HTTPS localhost)—Nginx/IIS/Apache—(HTTPS 外部访问域名)—外部Internet
反向代理服务器部分请自行配置

执行下列两个命令 以创建localhsot HTTPS证书 该证书时效为1年
dotnet dev-certs https —clean
dotnet dev-certs https —trust

Configuration.HTTPS.Enable设置为true
Configuration.HTTPS.Certificate设置为空(什么都不要填)
Configuration.HTTPS.Password设置为空(什么都不要填)

Microsoft OAuth
Github OAuth
SMTP邮件服务
准备一个可以使用SMTP服务发信的邮箱

Configuration.ShareSite.SMTP.Email设置为 发件人邮箱地址
Configuration.ShareSite.SMTP.Password设置为 邮箱密钥
Configuration.ShareSite.SMTP.Host设置为 发件人邮箱的SMTP服务器地址 (以Outlook为例子是smtp.office365.com)

私用
在私用模式下不用准备任何配置信息,填写好登录密码端口即可使用!

启用HTTPS(选配)
若要启用HTTPS请在下面选择一种合适的方式来实现

方式1:服务程序Kestrel—(HTTPS)—外部Internet
准备一个PFX格式的SSL证书文件,放置在Deploy文件夹中

Configuration.HTTPS.Enable设置为true
Configuration.HTTPS.Certificate设置为PFX文件的名称带后缀名
Configuration.HTTPS.Password设置为PFX文件的密码

方式2:服务程序Kestrel—(HTTP)—Nginx/IIS/Apache—(HTTPS 外部访问域名)—外部Internet
反向代理服务器部分请自行配置

Configuration.HTTPS.Enable设置为false

启动服务程序
在任何系统下,打开命令行定位到程序目录 运行dotnet Microsoft365_E5_Renew_X.dll命令即可启动

管理员登录
非OAuth后台登录(开放或私享部署皆可用)
管理员登录路由 /Admin/Login 默认密码在配置文件Deploy/Config.xml中更改

OAuth认证登录(仅开放部署可用)
设置管理员OAuth登录的OAuthID
使用想要关联的OAuth账号(Microsoft/Github)在任意站点登录/注册均可看到此账号的OAuthID,记录此ID

通过管理员密码登录自己的站点:管理员功能-用户列表 找到管理员账户 点击“编辑”按钮填写记录的OAuthID 保存

直接在主登录页面使用与管理员账户关联的OAuth账号登录即可

来源:SundayRX 博客:https://blog.csdn.net/qq_33212020/article/details/119747634

另一个位置

进入AZ面板

Azure

https://portal.azure.com/#home

跳过安全警告

点击属性,管理安全默认值,在启用安全默认值的选项中选择“否”

点击保存

点击应用注册,点击新注册

受支持账户名称选第三个

需要填写的重定向URI:

https://e5.qyi.io/outlook/auth2/receive

点击注册即可

然后点击该应用的“证书和密码”面板下面

进入E5续订网站

https://e5.qyi.io/user/baseSetting

用GITHUB账户登录

新建,写上名称,填上密码,返回刚才的页面中复制你所创建的密码的“值”(注意,不是机密ID)

ID在应用概述中复制“应用程序客户端ID”

调用设置最好默认

点击菜单中的API权限

依次点击 添加权限 Microsoft Graph 应用程序权限

搜索 mail

勾选前4个api(Mail目录)

最后添加权限

确认

返回续订登录

勾选代表组织同意

E5续订完成

来源:2233的小屋 https://hello2233.cf/

SAM的CF方法

LINK:https://owo.misaka.rest/mse5-apirenew-cfworkers/

准备材料

  • 一个 Cloudflare 账号
  • 一个 E5 账号

注意,下面演示的全部密钥和ID都是临时的,在此文章发表前已全部失效。

创建 Cloudflare Workers

随便填一个名字即可

然后按 继续使用 Free 计划 即可

成功后,你应能看见以下画面

创建一个服务

点击 创建服务 并输入一个名字,没有限制

选择 HTTP 处理程序 然后点击 创建服务

关闭 Routing

前往触发器,并选择 禁用路由,然后选择 取消部署

创建微软应用程序

应用注册
页面中,点击 新注册

名称
名称 API Call Cloudflare
受支持的帐户类型 仅此组织目录(仅 <组织名称> - 单一租户)中的帐户
重定向 URI (可选) Web, http://localhost:42791/

填写后,按 注册

创建密钥

前往 证书和密码 页面,点击 `新客户端密码

截止期限最大值为两年,如需要更长时间请自行透过搜索引擎查看如何调整为永久

名称
说明 Workers
截止期限 24 个月

你应该能看到 机密 ID,请保存

名称
S_N8Q~K6gj3hWVx36G.JuCE0f8boxoXUH7Gf-cSe

添加权限

前往 API 权限,根据下图中的 API 添加权限

添加后,按一下 代表 <组织名称> 授予管理员同意

获取 refresh_token

前往 概述,把 应用程序(客户端) ID 保存下来

名称
应用程序(客户端) ID 2d4599ba-57e1-44a3-9fcb-aa4e0d2e7755

请把 {{client_id}} 替换成 应用程序(客户端) ID 并在浏览器打开以下页面:

如果出现错误请再三检查URL是否输入正确,是否已经进行 url-encoded

https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize?client_id={{client_id}}&response_type=code&redirect_uri=http://localhost:42791&scope=https://graph.microsoft.com/offline_access

点击 接受 然后你会得到以下网址:

http://localhost:42791/?code=0.AXAAL9t9i7-ze0uADZmakODAWLqZRS3hV6NEn8uqTg0ud1VwABU.AQABAAIAAAD--DLA3VO7QrddgJg7Wevr9M5G7V4xymnWO2knhWvOk6aYPR4IlcbOq1D4Qt6nVa4gtz00NeYo1evTEKRUBk8STsarptgH-tFBPl9GfssTjgXJWra7_rgXIuezgNDsyaIxBU9BcmpUjIMw6_L4bp0JdJp57uJ9_qYvFvudptGXaWxwscypyGFopk_9q2Y2j1RuY17seLancbuRYzK_2ozTxwcAo3SFOYYDCEJZrRD1PgxJNqrDyW6j6eyNPwj9XnlOFyhtErJ6g5S2wKLonSIcWDE8ep6QJ5lTFPdLQm8B34kLzjC8y12kvGcdVPdb_WCoIymM2Y-cTDSlhhyCjB4uPVbsTei0tOvjl69byoR8dyUlwRYNJSFrdV79OJpJ3HntcOIqSaXqiOw-IqIRQ7ybijZzNSVzTWIorzGNOc-QJAen82o6d9oTkTr_QQ8QPWH53a2WUFMq7YQCZhsUYw_sbbIlbycmDiQQO41Neut1RniSJ8yG0LwPCh5XJSakhYV1KDHUGXnUrbZLoR8390nEL8scxqdMknC3-Pu4oR2-nTRMModj57hDCo4unmRuQs4WvfWYL6R-3DzDNVBgtHQ4TgGynXqqNDaBUaCH8hz-YKoeI3ynHI1GtDf_N2RoOg1UnisVyIjbyrjjp3IPAd_1IAA&session_state=52fd633e-7b30-4209-bb16-5d2873621057#

Key Value
code 0.AXAAL9t9i7-ze0uADZmakODAWLqZRS3hV6NEn8uqTg0ud1VwABU.AQABAAIAAAD--DLA3VO7QrddgJg7Wevr9M5G7V4xymnWO2knhWvOk6aYPR4IlcbOq1D4Qt6nVa4gtz00NeYo1evTEKRUBk8STsarptgH-tFBPl9GfssTjgXJWra7_rgXIuezgNDsyaIxBU9BcmpUjIMw6_L4bp0JdJp57uJ9_qYvFvudptGXaWxwscypyGFopk_9q2Y2j1RuY17seLancbuRYzK_2ozTxwcAo3SFOYYDCEJZrRD1PgxJNqrDyW6j6eyNPwj9XnlOFyhtErJ6g5S2wKLonSIcWDE8ep6QJ5lTFPdLQm8B34kLzjC8y12kvGcdVPdb_WCoIymM2Y-cTDSlhhyCjB4uPVbsTei0tOvjl69byoR8dyUlwRYNJSFrdV79OJpJ3HntcOIqSaXqiOw-IqIRQ7ybijZzNSVzTWIorzGNOc-QJAen82o6d9oTkTr_QQ8QPWH53a2WUFMq7YQCZhsUYw_sbbIlbycmDiQQO41Neut1RniSJ8yG0LwPCh5XJSakhYV1KDHUGXnUrbZLoR8390nEL8scxqdMknC3-Pu4oR2-nTRMModj57hDCo4unmRuQs4WvfWYL6R-3DzDNVBgtHQ4TgGynXqqNDaBUaCH8hz-YKoeI3ynHI1GtDf_N2RoOg1UnisVyIjbyrjjp3IPAd_1IAA
session_state 52fd633e-7b30-4209-bb16-5d2873621057

如果得到错误回应请参考微软的错误响应

Postman 中前往 Variables 然后填入要求的内容,记得按 Save 保存

如果没有 Postman 账号可以注册一个,很简单

接着,前往 Step 2 并按一下 Send

成功后,回应 200 OK 并返回 JSON内容

Key Value
token_type Bearer
scope profile openid email https://graph.microsoft.com/User.Read
expires_in 3599
access_token eyJ...
refresh_token 0.AX...

access_token 而取 refresh_token 者也。

添加账号

回到 Cloudflare,前往 Workers -> KV创建命名空间

建议格式为 MS_<你的组织名称> 以方便管理

添加完成后,点击 查看

添加以下变量

密钥
config_id <应用程序(客户端) ID (client_id) 值>
config_key <机密 ID 中的>
refresh_token <refresh_token 的值>

绑定 KV 命名空间

完成后,前往 Workers -> 概述 -> 你的 Workers -> 设置 并点击 添加绑定

完成后点击 保存

添加脚本

回到 资源,点击 快速编辑 并粘贴以下内容

代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// region Config
// Telegram 机器人回报
const botToken = "123456789:AAAAAAAAAAAAAAAAAAAAAAAAAAAA";
const chatId = "-100123456789";
// Cloudflare KV
const NAMESPACES = [ // 可添加多个
"MS_ORGNAME"
];
// endregion ==========

// region Constant
const msGraphRoot = "https://graph.microsoft.com";
const msGraphVer = "1.0";
const MSAPIList = [
`${msGraphRoot}/v${msGraphVer}/me/drive/root`,
`${msGraphRoot}/v${msGraphVer}/me/drive`,
`${msGraphRoot}/v${msGraphVer}/me/drive/root`,
`${msGraphRoot}/v${msGraphVer}/users`,
`${msGraphRoot}/v${msGraphVer}/me/messages`,
`${msGraphRoot}/v${msGraphVer}/me/mailFolders/inbox/messageRules`,
`${msGraphRoot}/v${msGraphVer}/me/mailFolders/inbox/messageRules`,
`${msGraphRoot}/v${msGraphVer}/me/drive/root/children`,
`${msGraphRoot}/v${msGraphVer}/me/mailFolders`,
`${msGraphRoot}/v${msGraphVer}/me/outlook/masterCategories`
];
// endregion ==========


// region Utils function
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

function randInt(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}

function getUNIX() {
return parseInt("" + new Date() / 1000);
}

// endregion ==========

// region Telegram
async function sendMessage(message) {
if (!botToken) return;
try {
await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
method: "post",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
chat_id: chatId,
text: message,
parse_mode: "html",
disable_web_page_preview: true,
disable_notification: true
})
});
} catch {
}
}

// endregion =====

async function getToken(NAMESPACE) {
let formData = new FormData();
formData.append("grant_type", "refresh_token");
formData.append("refresh_token", await NAMESPACE.get("refresh_token"));
formData.append("client_id", await NAMESPACE.get("config_id"));
formData.append("client_secret", await NAMESPACE.get("config_key"));
formData.append("redirect_uri", "http://localhost:42791/");
let response = await fetch("https://login.microsoftonline.com/common/oauth2/v2.0/token", {
method: "post",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams(Object.fromEntries(formData))
});
let respJson;
try {
respJson = await response.json();
} catch (e) {
console.error("Failed to parse response to JSON:", e);
return null;
}
if (response.status === 200) {
await NAMESPACE.put("refresh_token", respJson["refresh_token"]);
return [respJson["token_type"], respJson["access_token"]].join(" ");
} else {
console.error(`Error response from login (${respJson["error"]})\n`,
respJson["error_description"]);
return null;
}
}

async function mainInvoke(NAMESPACE, NAMESPACE_NAME) {
await sendMessage(`${NAMESPACE_NAME} 已准备就绪`);
const accessToken = await getToken(NAMESPACE);
if (!accessToken) return await sendMessage(`${NAMESPACE_NAME} 執行失敗: accessToken`);
else await sendMessage(`${NAMESPACE_NAME} 开始执行`);
for (let apiUrl of MSAPIList) {
try {
let response = await fetch(apiUrl, {
headers: {
"Authorization": accessToken,
"Content-Type": "application/json"
}
});
if (response.status === 200) await sleep(randInt(2, 12));
} catch {
}
}
await sendMessage(`${NAMESPACE_NAME} 执行完成`);
}

async function handleSchedule() {
let tasks = [];
await sendMessage("任務开始");
for (let nsKey of NAMESPACES) {
tasks.push(mainInvoke(this[nsKey], nsKey));
}
await Promise.all(tasks);
await sleep(60 * randInt(1, 8));
await sendMessage("任务结束");
}

addEventListener("scheduled", event => event.waitUntil(handleSchedule()));

可修改的部分:

说明
botToken 电报的机器人回报,如果不需要可以设置为空 ""
chatId 电报的频道/个人对话 ID
NAMESPACES Cloudflare 的命名空间,就是刚才设置的那个

保存后返回上一页

设置定时

触发器,选择 添加 Cron 触发器

按照以下图片设置即可

如一切正常,机器人应该会每 15分钟 发送一次信息,见效果演示

参考资料

写在最后

微软对E5的态度是变化的,微软最近新的反机器调用API伪装活跃机制使得微软大幅度升高了续订的难度

不要24H调用API,如果你是服务器或者PC不停机,一定要将软件的续订模式改成工作日续订

要检查续订情况或者是在最后30日内就检查

混合订阅尽量不要操作,很大几率被微软发现问题


转载于2233smallhouse