Skip to content

Commit

Permalink
支持钉钉自定义机器人
Browse files Browse the repository at this point in the history
  • Loading branch information
dss886 committed Sep 22, 2017
1 parent 06c1275 commit 8b72d2f
Show file tree
Hide file tree
Showing 11 changed files with 164 additions and 40 deletions.
39 changes: 24 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,6 @@

备用机通知提醒转发程序,会在收到短信或者未接电话时自动发送提醒内容至指定邮箱。

### 快速上手

首先需要在【首页- 邮件参数设置】中填入邮箱的相关信息:

1. SMTP服务器:邮箱的发件服务器地址,如 smtp.qq.com
2. 端口号:SMTP服务器的端口号,注意本程序默认启用了SSL加密,一般SMTP服务器的端口号为 465
3. 发件人昵称:默认为 Transmis,若收件人和发件人地址相同,收到提醒时可能不会显示自定义的昵称,而显示 “我”
4. 发件人邮箱:用于发送提醒邮件的邮箱,例如 [email protected]
5. 发件人密码/授权码:用于发送提醒邮件的密码,QQ邮箱可在邮箱设置中生成一组三方邮件服务专用的授权码,其他邮箱可能需要输入登录密码
6. 收件人邮箱:用于接收提醒的邮箱,例如 [email protected]

然后打开主界面的主开关即可

### 权限说明

由于显而易见的原因,本程序需要以下权限才能正常工作
Expand All @@ -27,7 +14,7 @@

在某些系统上(如小米、华为等)可能需要手动在启动管理中将本程序设置为【允许被系统唤醒】

### 邮件提醒模板
### 提醒内容设置

短信提醒:

Expand All @@ -39,14 +26,36 @@
1. 标题:默认为【你的备用机有一个未接电话】,可进行设置,暂不支持通配符
2. 内容:默认为【电话:%s \n时间:%s \n响铃:%s 秒】,通配符【%s】分别代表电话号码、呼入时间和响铃时间

### 提醒方式设置

本程序支持「邮件提醒」和「钉钉提醒」两种方式,可同时启用。

使用邮件提醒时,首先需要在【首页- 邮件参数设置】中填入邮箱的相关信息:

1. SMTP服务器:邮箱的发件服务器地址,如 smtp.qq.com
2. 端口号:SMTP服务器的端口号,注意本程序默认启用了SSL加密,一般SMTP服务器的端口号为 465
3. 发件人昵称:默认为 Transmis,若收件人和发件人地址相同,收到提醒时可能不会显示自定义的昵称,而显示 “我”
4. 发件人邮箱:用于发送提醒邮件的邮箱,例如 [email protected]
5. 发件人密码/授权码:用于发送提醒邮件的密码,QQ邮箱可在邮箱设置中生成一组三方邮件服务专用的授权码,其他邮箱可能需要输入登录密码
6. 收件人邮箱:用于接收提醒的邮箱,例如 [email protected]

使用钉钉提醒时,需要执行下列步骤:

1. 任意拉两个人成立一个群组,然后将其他人踢出群。
2. 在群设置->群机器人中添加一个新的「自定义机器人」
3. 复制自定义机器人的链接中的“access_token=”后面的内容
4. 点击Transmis首页的钉钉机器人设置,输入复制的Token

然后打开主界面的主开关,以及短信和电话相应提醒开关即可

### 其他可选项

1. 合并长短信:收到同一发信人的连续多条短信时会自动将内容进行合并,不会多次提醒

# License

Copyright (C) 2017 dss886

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
Expand Down
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,5 @@ dependencies {
implementation 'com.android.support:appcompat-v7:25.3.1'
implementation 'com.sun.mail:android-mail:1.5.5'
implementation 'com.sun.mail:android-activation:1.5.5'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
}
39 changes: 37 additions & 2 deletions app/src/main/java/com/dss886/transmis/MainActivity.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.dss886.transmis;

import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.text.TextUtils;
import com.dss886.transmis.base.App;
import com.dss886.transmis.base.BaseActivity;
import com.dss886.transmis.call.CallActivity;
import com.dss886.transmis.mail.MailActivity;
import com.dss886.transmis.sms.SmsActivity;
import com.dss886.transmis.utils.DialogBuilder;
import com.dss886.transmis.utils.Tags;
import com.dss886.transmis.view.SectionItem;
import com.dss886.transmis.view.SwitchItem;
Expand All @@ -17,6 +21,7 @@ public class MainActivity extends BaseActivity {
private TextItem mSmsItem;
private TextItem mCallItem;
private TextItem mMailItem;
private TextItem mDingDingItem;
private TextItem mHelpItem;
private TextItem mVersionItem;
private TextItem mLicenseItem;
Expand All @@ -35,9 +40,25 @@ protected boolean showToolbarBackIcon() {
protected void addViews() {
mGlobalSwitch = new SwitchItem(this, "总开关", Tags.SP_GLOBAL_ENABLE, false);
mSmsItem = new TextItem(this, "短信提醒").showRightArrow()
.setCallback(sp -> sp.getBoolean(Tags.SP_SMS_ENABLE, true) ? "开" : "关");
.setCallback(sp -> {
if (sp.getBoolean(Tags.SP_SMS_MAIL_ENABLE, true) ||
sp.getBoolean(Tags.SP_SMS_DING_ENABLE, false)) {
return "开";
}
return "关";
});
mCallItem = new TextItem(this, "未接电话提醒").showRightArrow()
.setCallback(sp -> sp.getBoolean(Tags.SP_MISSED_CALL_ENABLE, true) ? "开" : "关");
.setCallback(sp -> {
if (sp.getBoolean(Tags.SP_MISSED_CALL_MAIL_ENABLE, true) ||
sp.getBoolean(Tags.SP_MISSED_CALL_DING_ENABLE, false)) {
return "开";
}
return "关";
});
mDingDingItem = new TextItem(this, "钉钉机器人设置").setCallback(sp -> {
String value = sp.getString(Tags.SP_DING_TOKEN, null);
return TextUtils.isEmpty(value) ? "未设置" : "已设置";
});
mMailItem = new TextItem(this, "邮件参数设置").showRightArrow();
mHelpItem = new TextItem(this, "使用帮助");
mVersionItem = new TextItem(this, "检查更新", "当前版本 v" + BuildConfig.VERSION_NAME);
Expand All @@ -49,6 +70,7 @@ protected void addViews() {
addView(mCallItem);
addView(new SectionItem(this, "参数设置"));
addView(mMailItem);
addView(mDingDingItem);
addView(new SectionItem(this, "关于"));
addView(mHelpItem);
addView(mVersionItem);
Expand All @@ -61,6 +83,19 @@ protected void setListeners() {
mSmsItem.setOnClickListener(v -> startActivity(new Intent(this, SmsActivity.class)));
mCallItem.setOnClickListener(v -> startActivity(new Intent(this, CallActivity.class)));
mMailItem.setOnClickListener(v -> startActivity(new Intent(this, MailActivity.class)));
mDingDingItem.setOnClickListener(v -> {
String value = App.sp.getString(Tags.SP_DING_TOKEN, null);
DialogBuilder.showEditTextDialog(this, "请设置钉钉机器人的Token", value, false, content -> {
SharedPreferences.Editor editor = App.sp.edit();
if (TextUtils.isEmpty(content)) {
editor.remove(Tags.SP_DING_TOKEN);
} else {
editor.putString(Tags.SP_DING_TOKEN, content);
}
editor.apply();
mDingDingItem.onResume();
});
});
mHelpItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_README))));
mVersionItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_RELEASE))));
mLicenseItem.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Tags.URL_LICENSE))));
Expand Down
12 changes: 8 additions & 4 deletions app/src/main/java/com/dss886/transmis/call/CallActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

public class CallActivity extends BaseActivity {

private SwitchItem mCallSwitch;
private SwitchItem mMailSwitch;
private SwitchItem mDingSwitch;
private TextItem mTitleItem;
private TextItem mContentItem;

Expand All @@ -30,7 +31,8 @@ protected boolean showToolbarBackIcon() {

@Override
protected void addViews() {
mCallSwitch = new SwitchItem(this, "未接电话提醒", Tags.SP_MISSED_CALL_ENABLE, true);
mMailSwitch = new SwitchItem(this, "邮件提醒", Tags.SP_MISSED_CALL_MAIL_ENABLE, true);
mDingSwitch = new SwitchItem(this, "钉钉提醒", Tags.SP_MISSED_CALL_DING_ENABLE, false);
mTitleItem = new TextItem(this, "邮件标题").setCallback(sp -> {
String value = sp.getString(Tags.SP_CALL_TITLE_REGEX, "默认");
return TextUtils.isEmpty(value) ? "未设置" : value;
Expand All @@ -40,7 +42,8 @@ protected void addViews() {
return TextUtils.isEmpty(value) ? "未设置" : value;
});

addView(mCallSwitch);
addView(mMailSwitch);
addView(mDingSwitch);
addView(new SectionItem(this, "提醒模版设置"));
addView(mTitleItem);
addView(mContentItem);
Expand All @@ -49,7 +52,8 @@ protected void addViews() {

@Override
protected void setListeners() {
mCallSwitch.setOnClickListener(v -> {});
mMailSwitch.setOnClickListener(v -> {});
mDingSwitch.setOnClickListener(v -> {});
setTextItemListener(mTitleItem, Tags.SP_CALL_TITLE_REGEX, "设置标题");
setTextItemListener(mContentItem, Tags.SP_CALL_CONTENT_REGEX, "设置内容模版");
}
Expand Down
13 changes: 9 additions & 4 deletions app/src/main/java/com/dss886/transmis/call/CallListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import android.telephony.TelephonyManager;
import com.dss886.transmis.R;
import com.dss886.transmis.base.App;
import com.dss886.transmis.sender.DingDingSender;
import com.dss886.transmis.utils.Settings;
import com.dss886.transmis.mail.MailSender;
import com.dss886.transmis.sender.MailSender;
import com.dss886.transmis.utils.Logger;
import com.dss886.transmis.utils.Tags;

Expand All @@ -32,8 +33,7 @@ public class CallListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Logger.d("Phone State Received.");
if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false) ||
!Settings.is(Tags.SP_MISSED_CALL_ENABLE, true)) {
if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false)) {
Logger.d("Call Transmis has been disable!");
return;
}
Expand Down Expand Up @@ -72,7 +72,12 @@ private void sendMail() {
String contentRegex = App.sp.getString(Tags.SP_CALL_CONTENT_REGEX, App.me().getString(R.string.call_content_default));
String content = String.format(Locale.CHINA, contentRegex, sCallNumber, sdf.format(new Date(sRingTime)), ringTime);
Logger.d("mail content: " + content);
new MailSender().send(titleRegex, content);
if (Settings.is(Tags.SP_MISSED_CALL_MAIL_ENABLE, false)) {
new MailSender().send(titleRegex, content);
}
if (Settings.is(Tags.SP_MISSED_CALL_DING_ENABLE, false)) {
new DingDingSender().send(titleRegex, content);
}
}

}
56 changes: 56 additions & 0 deletions app/src/main/java/com/dss886/transmis/sender/DingDingSender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.dss886.transmis.sender;

import android.text.TextUtils;
import android.util.Log;
import android.widget.Toast;
import com.dss886.transmis.base.App;
import com.dss886.transmis.utils.Tags;
import okhttp3.*;
import org.json.JSONObject;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
* Created by dss886 on 2017/9/22.
*/

public class DingDingSender {

private static final String URL = "https://oapi.dingtalk.com/robot/send?access_token=";

private MediaType mMediaType = MediaType.parse("application/json; charset=utf-8");
private OkHttpClient mClient = new OkHttpClient();
private Executor mExecutor = Executors.newSingleThreadExecutor();

public void send(String title, String content) {
if (TextUtils.isEmpty(title) || TextUtils.isEmpty(content)) {
return;
}
mExecutor.execute(() -> {
try {
String url = URL + App.sp.getString(Tags.SP_DING_TOKEN, null);
StringBuilder sb = new StringBuilder();
sb.append(title).append("\n\n");
for (String line : content.split("\n")) {
sb.append("> ").append(line).append("\n\n");
}
JSONObject message = new JSONObject();
message.put("msgtype", "markdown");
JSONObject markdown = new JSONObject();
markdown.put("title", title);
markdown.put("text", sb.toString().trim());
message.put("markdown", markdown);

RequestBody body = RequestBody.create(mMediaType, message.toString());
Request request = new Request.Builder().url(url).post(body).build();
Response response = mClient.newCall(request).execute();
Log.d("DingDingSender", response.body().string());
} catch (Exception e) {
Toast.makeText(App.me(), e.getMessage(), Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
});
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.dss886.transmis.mail;
package com.dss886.transmis.sender;

import android.widget.Toast;
import com.dss886.transmis.R;
Expand Down
16 changes: 10 additions & 6 deletions app/src/main/java/com/dss886/transmis/sms/SmsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

public class SmsActivity extends BaseActivity {

private SwitchItem mSmsSwitch;
private SwitchItem mMailSwitch;
private SwitchItem mDingSwitch;
private SwitchItem mMergeSwitch;
private TextItem mTitleItem;
private TextItem mContentItem;
Expand All @@ -31,18 +32,20 @@ protected boolean showToolbarBackIcon() {

@Override
protected void addViews() {
mSmsSwitch = new SwitchItem(this, "短信提醒", Tags.SP_SMS_ENABLE, true);
mMailSwitch = new SwitchItem(this, "邮件提醒", Tags.SP_SMS_MAIL_ENABLE, true);
mDingSwitch = new SwitchItem(this, "钉钉提醒", Tags.SP_SMS_DING_ENABLE, false);
mMergeSwitch = new SwitchItem(this, "合并长短信", Tags.SP_SMS_MERGE_LONG_TEXT, true);
mTitleItem = new TextItem(this, "邮件标题").setCallback(sp -> {
mTitleItem = new TextItem(this, "提醒标题").setCallback(sp -> {
String value = sp.getString(Tags.SP_SMS_TITLE_REGEX, "默认");
return TextUtils.isEmpty(value) ? "未设置" : value;
});
mContentItem = new TextItem(this, "邮件内容模版").setCallback(sp -> {
mContentItem = new TextItem(this, "提醒内容模版").setCallback(sp -> {
String value = sp.getString(Tags.SP_SMS_CONTENT_REGEX, "默认");
return TextUtils.isEmpty(value) ? "未设置" : value;
});

addView(mSmsSwitch);
addView(mMailSwitch);
addView(mDingSwitch);
addView(new SectionItem(this, "可选项"));
addView(mMergeSwitch);
addView(new SectionItem(this, "提醒模版设置"));
Expand All @@ -53,7 +56,8 @@ protected void addViews() {

@Override
protected void setListeners() {
mSmsSwitch.setOnClickListener(v -> {});
mMailSwitch.setOnClickListener(v -> {});
mDingSwitch.setOnClickListener(v -> {});
mMergeSwitch.setOnClickListener(v -> {});
setTextItemListener(mTitleItem, Tags.SP_SMS_TITLE_REGEX, "设置标题");
setTextItemListener(mContentItem, Tags.SP_SMS_CONTENT_REGEX, "设置内容模版");
Expand Down
17 changes: 11 additions & 6 deletions app/src/main/java/com/dss886/transmis/sms/SmsListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import android.telephony.SmsMessage;
import com.dss886.transmis.R;
import com.dss886.transmis.base.App;
import com.dss886.transmis.mail.MailSender;
import com.dss886.transmis.sender.DingDingSender;
import com.dss886.transmis.sender.MailSender;
import com.dss886.transmis.utils.Logger;
import com.dss886.transmis.utils.Settings;
import com.dss886.transmis.utils.Tags;
Expand All @@ -25,8 +26,7 @@ public class SmsListener extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Logger.d("SMS Received.");
if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false) ||
!Settings.is(Tags.SP_SMS_ENABLE, true)) {
if (!Settings.is(Tags.SP_GLOBAL_ENABLE, false)) {
Logger.d("SMS Transmis has been disable!");
return;
}
Expand All @@ -40,7 +40,7 @@ public void onReceive(Context context, Intent intent) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
Logger.d("Try To Send Mail.");
sendMail(messages);
doNotify(messages);
} catch (Exception e) {
Logger.e(e.getMessage());
e.printStackTrace();
Expand All @@ -49,7 +49,7 @@ public void onReceive(Context context, Intent intent) {
}
}

private void sendMail(SmsMessage[] messages) {
private void doNotify(SmsMessage[] messages) {
if (messages == null || messages.length == 0) {
return;
}
Expand All @@ -68,6 +68,11 @@ private void sendMail(SmsMessage[] messages) {
}
content = sb.toString();
}
new MailSender().send(titleRegex, content);
if (Settings.is(Tags.SP_SMS_MAIL_ENABLE, false)) {
new MailSender().send(titleRegex, content);
}
if (Settings.is(Tags.SP_SMS_DING_ENABLE, false)) {
new DingDingSender().send(titleRegex, content);
}
}
}
Loading

0 comments on commit 8b72d2f

Please sign in to comment.