作者 钟来

添加抖音私信

package com.zhonglai.luhui.api.controller.test;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.api.controller.test.dto.ClueData;
import com.zhonglai.luhui.config.requestbodymiss.RequestReaderHttpServletRequestWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
@Api(tags = "测试")
@RestController
@RequestMapping("/test")
... ... @@ -17,4 +32,139 @@ public class TestController {
{
return AjaxResult.success(new TestDto());
}
@ApiOperation("默认主页")
@RequestMapping(value = "")
public String index(HttpServletRequest httpServletRequest) throws IOException {
StringBuffer bodyBytes = new StringBuffer("<html>");
bodyBytes.append("<head><meta charset=\"UTF-8\"></head>");
bodyBytes.append("<body>");
Map<String, String[]> map = httpServletRequest.getParameterMap();
bodyBytes.append("<b>parameter:</b></br>");
for (Map.Entry<String, String[]> entry : map.entrySet()) {
String key = entry.getKey();
String[] values = entry.getValue();
if (values.length == 1) {
bodyBytes.append(key).append(":").append(values[0]).append("</br>");
} else {
bodyBytes.append(key).append(":").append(values).append("</br>");
}
}
// 打印请求头信息
bodyBytes.append("<b>header:</b></br>");
Enumeration<String> headerNames = httpServletRequest.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String headerValue = httpServletRequest.getHeader(headerName);
bodyBytes.append(headerName).append(":").append(headerValue).append("</br>");
}
//获取请求body
byte[] rbody = StreamUtils.copyToByteArray(httpServletRequest.getInputStream());
String body = new String(rbody, httpServletRequest.getCharacterEncoding());
bodyBytes.append("<b>body:</b></br>");
bodyBytes.append(body);
bodyBytes.append("</body>");
bodyBytes.append("</html>");
return bodyBytes.toString();
}
@ApiOperation("抖音")
@RequestMapping(value = "douyin")
public String douyin(@RequestBody String jsr) throws IOException {
ClueData clueData = GsonConstructor.get().fromJson(jsr, ClueData.class);
String tenant_access_token = gettenant_access_token();
JsonObject field = new JsonObject();
field.addProperty("日期",Integer.parseInt(clueData.getCreate_time()));
field.addProperty("发送人","");
field.addProperty("接收人",clueData.getRefer_dy_name());
field.addProperty("内容",clueData.getTelephone());
field.addProperty("线索来源","抖音");
field.addProperty("地址",clueData.getLocation());
subFeishuTables(tenant_access_token,"YY58bkeMjahX5Uskh4WcnYOCnZc","tbldo1VjlU9jY51Y",field);
// switch (clueData.getActionType())
// {
// case 0: // 0: 其他
// break;
// case 1: // 1: 短视频
// break;
// case 2: // 2: 直播
// break;
// case 3: // 3: 企业主页
// break;
// case 4: // 4: 私信
// break;
// case 5: // 5: 订阅文章
// break;
// case 6: // 6: 群聊
// break;
// case 7: // 7: 独立店铺
// break;
// case 8: // 8: 搜索服务卡
// break;
// }
return "{\n" +
" \"code\": \"1\",\n" +
" \"message\": \"success\"\n" +
"}";
}
private static String tenant_access_token;
private static long tokenExpireTime = 0; // 添加token过期时间字段
private String gettenant_access_token() {
// 判断token是否未超时
if (tenant_access_token != null && System.currentTimeMillis() < tokenExpireTime) {
return tenant_access_token;
}
String url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal";
JsonObject params = new JsonObject();
params.addProperty("app_id", "cli_a77e560b9475100c"); // 替换为实际的 app_id
params.addProperty("app_secret", "7E80HFwgkmHjngFWDNsz6Pe1aqtKLC3m"); // 替换为实际的 app_secret
String str = HttpRequest.post(url).header("Content-Type", "application/json; charset=utf-8").body(params.toString()).execute().body();
JsonObject responseMap = GsonConstructor.get().fromJson(str, JsonObject.class);
if (responseMap != null && responseMap.get("code").getAsInt()==0) {
tenant_access_token = responseMap.get("tenant_access_token").getAsString();
// 设置token过期时间,假设token有效期为7200秒
tokenExpireTime = System.currentTimeMillis() + responseMap.get("expire").getAsInt() * 1000;
return tenant_access_token;
} else {
throw new RuntimeException("Failed to get tenant_access_token: " + str);
}
}
/**
* HTTP URL
* https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records
* HTTP Method
* POST
* 接口频率限制
* 50 次/秒
*
* 请求头 :Authorization、Content-Type
*/
private void subFeishuTables(String tenant_access_token,String app_token,String table_id, JsonObject field )
{
String url = "https://open.feishu.cn/open-apis/bitable/v1/apps/"+app_token+"/tables/"+table_id+"/records";
JsonObject params = new JsonObject();
params.add("fields",field);
System.out.println(params.toString());
String str = HttpRequest.post(url).header("Authorization", "Bearer "+tenant_access_token ).header("Content-Type", "application/json").body(params.toString()).execute().body();
System.out.println(str);
}
public static void main(String[] args) {
String jsr= "{\"store_id\":0,\"create_time\":\"1745031148\",\"gender\":\"未知\",\"action_type\":4,\"telephone\":\"13063963982\",\"promotion_id\":0,\"clue_source\":5,\"store_pack_id\":0,\"refer_dy_id\":\"2046931013\",\"app_name\":\"暂未获取到\",\"ad_id\":\"0\",\"module_id\":\"0\",\"flow_type\":1,\"name\":\"未命名\",\"site_id\":\"0\",\"remark_dict\":{},\"adv_id\":\"0\",\"clue_type\":1,\"location\":\"江苏+常州\",\"id\":\"7494853024813154342\",\"clue_convert_status\":\"外部流量\",\"refer_dy_name\":\"鱼儿乐智慧渔业系统\"}";
ClueData clueData = GsonConstructor.get().fromJson(jsr, ClueData.class);
System.out.println(clueData);
}
}
... ...
package com.zhonglai.luhui.api.controller.test.dto;
import java.util.Date;
import java.util.Map;
// 线索数据类,用于存储和管理与线索相关的各种信息
public class ClueData {
// 日期
private String date;
// 门店活动id
private String store_pack_id;
// 请求id
private String req_id;
// 落地页链接
private String external_url;
// 门店活动备注
private String store_pack_remark;
// 广告主id
private String adv_id;
// 素材组
private String mid_info;
// 线索id
private String id;
// 广告主名称
private String adv_name;
// QQ号
private String qq;
// 线索创建时间
private String create_time;
// 手动填写地域 - 省
private String province_name;
// 站点名称
private String site_name;
// 计划id
private String ad_id;
// 微信
private String weixin;
// 组件id
private String module_id;
// 流量类型,枚举值:
// 1: 经营 - 自然流量线索
// 2: 经营 - 广告直接线索
// 3: 经营 - 广告间接线索
// 4: 广告线索
// 5: 无
private Integer flow_type;
// 电话
private String telephone;
// 姓名
private String name;
// 站点id
private String site_id;
// 组件名称
private String module_name;
// 创意id
private String cid;
// 性别,枚举值:
// 0:未知
// 1:男
// 2:女
private String gender;
// 互动类型,枚举值:
// 0: 其他
// 1: 短视频
// 2: 直播
// 3: 企业主页
// 4: 私信
// 5: 订阅文章
// 6: 群聊
// 7: 独立店铺
// 8: 搜索服务卡
private Integer action_type;
// 门店详细地址
private String store_address;
// 用户备注留言
private String remark;
// 广告id
private String promotion_id;
// 来源抖音号
private String refer_dy_id;
// 门店备注
private String store_remark;
// 广告主表单自定义字段,无业务逻辑,仅作表单标志
private String form_remark;
// 手动填写地域 - 市
private String city_name;
// 广告名称
private String promotion_name;
// 门店活动名称
private String store_pack_name;
// 广告主自定义的其它字段信息,可自定义获取
// 例:若创建表单时自定义了"test_case"字段的设置,则产生的remark_dict线索为:"test_case": "xxx"
private Map<String, String> remark_dict;
// 门店名称
private String store_name;
// 转化状态
private String clue_convert_status;
// 邮箱
private String email;
// 门店所在地
private String store_location;
// 来源抖音昵称
private String refer_dy_name;
// 门店id
private String store_id;
// 详细地址
private String address;
// 行业原始字段
private String business;
// 计划名称
private String ad_name;
// 经营工具id
private String corporate_tool_id;
// 线索渠道,枚举值:
// 0&1: 字节 - 橙子建站
// 2: 其他渠道 - 外部导入
// 5: 字节 - 抖音企业号
// 7: 字节 - 巨量线索
// 8:字节 - 云店
// 9:字节 - 星图
// 10:字节 - 获客宝
// 11:字节 - 住小帮
private Integer clue_source;
// 手动填写地域 - 区
private String country_name;
// 流量来源,如[字节 - 今日头条]、[字节 - 抖音]
private String app_name;
// 线索类型,枚举值:
// 0: 字节 - 表单提交
// 1: 字节 - 在线咨询
// 2: 字节 - 智能电话
// 3: 字节 - 网页回呼
// 4: 字节 - 卡券
// 5:字节 - 抽奖
private Integer clue_type;
// 定位城市,用户提交线索时所在省市
private String location;
// 年龄
private Integer age;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getStore_pack_id() {
return store_pack_id;
}
public void setStore_pack_id(String store_pack_id) {
this.store_pack_id = store_pack_id;
}
public String getReq_id() {
return req_id;
}
public void setReq_id(String req_id) {
this.req_id = req_id;
}
public String getExternal_url() {
return external_url;
}
public void setExternal_url(String external_url) {
this.external_url = external_url;
}
public String getStore_pack_remark() {
return store_pack_remark;
}
public void setStore_pack_remark(String store_pack_remark) {
this.store_pack_remark = store_pack_remark;
}
public String getAdv_id() {
return adv_id;
}
public void setAdv_id(String adv_id) {
this.adv_id = adv_id;
}
public String getMid_info() {
return mid_info;
}
public void setMid_info(String mid_info) {
this.mid_info = mid_info;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAdv_name() {
return adv_name;
}
public void setAdv_name(String adv_name) {
this.adv_name = adv_name;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
public String getProvince_name() {
return province_name;
}
public void setProvince_name(String province_name) {
this.province_name = province_name;
}
public String getSite_name() {
return site_name;
}
public void setSite_name(String site_name) {
this.site_name = site_name;
}
public String getAd_id() {
return ad_id;
}
public void setAd_id(String ad_id) {
this.ad_id = ad_id;
}
public String getWeixin() {
return weixin;
}
public void setWeixin(String weixin) {
this.weixin = weixin;
}
public String getModule_id() {
return module_id;
}
public void setModule_id(String module_id) {
this.module_id = module_id;
}
public Integer getFlow_type() {
return flow_type;
}
public void setFlow_type(Integer flow_type) {
this.flow_type = flow_type;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSite_id() {
return site_id;
}
public void setSite_id(String site_id) {
this.site_id = site_id;
}
public String getModule_name() {
return module_name;
}
public void setModule_name(String module_name) {
this.module_name = module_name;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAction_type() {
return action_type;
}
public void setAction_type(Integer action_type) {
this.action_type = action_type;
}
public String getStore_address() {
return store_address;
}
public void setStore_address(String store_address) {
this.store_address = store_address;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getPromotion_id() {
return promotion_id;
}
public void setPromotion_id(String promotion_id) {
this.promotion_id = promotion_id;
}
public String getRefer_dy_id() {
return refer_dy_id;
}
public void setRefer_dy_id(String refer_dy_id) {
this.refer_dy_id = refer_dy_id;
}
public String getStore_remark() {
return store_remark;
}
public void setStore_remark(String store_remark) {
this.store_remark = store_remark;
}
public String getForm_remark() {
return form_remark;
}
public void setForm_remark(String form_remark) {
this.form_remark = form_remark;
}
public String getCity_name() {
return city_name;
}
public void setCity_name(String city_name) {
this.city_name = city_name;
}
public String getPromotion_name() {
return promotion_name;
}
public void setPromotion_name(String promotion_name) {
this.promotion_name = promotion_name;
}
public String getStore_pack_name() {
return store_pack_name;
}
public void setStore_pack_name(String store_pack_name) {
this.store_pack_name = store_pack_name;
}
public Map<String, String> getRemark_dict() {
return remark_dict;
}
public void setRemark_dict(Map<String, String> remark_dict) {
this.remark_dict = remark_dict;
}
public String getStore_name() {
return store_name;
}
public void setStore_name(String store_name) {
this.store_name = store_name;
}
public String getClue_convert_status() {
return clue_convert_status;
}
public void setClue_convert_status(String clue_convert_status) {
this.clue_convert_status = clue_convert_status;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStore_location() {
return store_location;
}
public void setStore_location(String store_location) {
this.store_location = store_location;
}
public String getRefer_dy_name() {
return refer_dy_name;
}
public void setRefer_dy_name(String refer_dy_name) {
this.refer_dy_name = refer_dy_name;
}
public String getStore_id() {
return store_id;
}
public void setStore_id(String store_id) {
this.store_id = store_id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBusiness() {
return business;
}
public void setBusiness(String business) {
this.business = business;
}
public String getAd_name() {
return ad_name;
}
public void setAd_name(String ad_name) {
this.ad_name = ad_name;
}
public String getCorporate_tool_id() {
return corporate_tool_id;
}
public void setCorporate_tool_id(String corporate_tool_id) {
this.corporate_tool_id = corporate_tool_id;
}
public Integer getClue_source() {
return clue_source;
}
public void setClue_source(Integer clue_source) {
this.clue_source = clue_source;
}
public String getCountry_name() {
return country_name;
}
public void setCountry_name(String country_name) {
this.country_name = country_name;
}
public String getApp_name() {
return app_name;
}
public void setApp_name(String app_name) {
this.app_name = app_name;
}
public Integer getClue_type() {
return clue_type;
}
public void setClue_type(Integer clue_type) {
this.clue_type = clue_type;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
\ No newline at end of file
... ...