Commit d472478d333c0cbbca7312129a8834d36de1962c
1 parent
e17d2707
2022年6月30日18:19:28 调用接口时候发现500002错误码, 直接更新sig信息
Showing
31 changed files
with
520 additions
and
315 deletions
src/main/java/cn/fw/freya/controller/BLBLController.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.freya.controller; |
2 | 2 | |
3 | 3 | import cn.fw.freya.model.data.pool.LivePool; |
4 | 4 | import cn.fw.freya.model.data.pool.VideoPool; |
5 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
5 | 6 | import cn.fw.freya.service.crawl.impl.BilibiliCrawl; |
6 | 7 | import lombok.RequiredArgsConstructor; |
7 | 8 | import org.springframework.validation.annotation.Validated; |
... | ... | @@ -52,8 +53,8 @@ public class BLBLController { |
52 | 53 | * @param accountNo 账户号 |
53 | 54 | */ |
54 | 55 | @GetMapping("/updateAccountFans") |
55 | - public Integer updateAccountFans(String accountNo) throws IOException { | |
56 | - return bilibiliCrawl.updateAccountFans(accountNo); | |
56 | + public ReportAccountDto updateAccountFans(String accountNo) throws IOException { | |
57 | + return bilibiliCrawl.updateAccountMsg(accountNo); | |
57 | 58 | } |
58 | 59 | |
59 | 60 | /** | ... | ... |
src/main/java/cn/fw/freya/controller/DCDController.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.freya.controller; |
2 | 2 | |
3 | 3 | import cn.fw.freya.model.data.pool.LivePool; |
4 | 4 | import cn.fw.freya.model.data.pool.VideoPool; |
5 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
5 | 6 | import cn.fw.freya.service.crawl.impl.DongCheDiCrawl; |
6 | 7 | import lombok.RequiredArgsConstructor; |
7 | 8 | import org.springframework.validation.annotation.Validated; |
... | ... | @@ -61,8 +62,8 @@ public class DCDController { |
61 | 62 | * @param accountNo 账户号 |
62 | 63 | */ |
63 | 64 | @GetMapping("/updateAccountFans") |
64 | - public Integer updateAccountFans(String accountNo) { | |
65 | - return dongCheDiCrawl.updateAccountFans(accountNo); | |
65 | + public ReportAccountDto updateAccountFans(String accountNo) { | |
66 | + return dongCheDiCrawl.updateAccountMsg(accountNo); | |
66 | 67 | } |
67 | 68 | |
68 | 69 | /** | ... | ... |
src/main/java/cn/fw/freya/controller/DYController.java
... | ... | @@ -3,6 +3,7 @@ package cn.fw.freya.controller; |
3 | 3 | import cn.fw.freya.model.data.LiveOverview; |
4 | 4 | import cn.fw.freya.model.data.pool.LivePool; |
5 | 5 | import cn.fw.freya.model.data.pool.VideoPool; |
6 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
6 | 7 | import cn.fw.freya.service.crawl.impl.DouYinCrawl; |
7 | 8 | import lombok.RequiredArgsConstructor; |
8 | 9 | import org.springframework.validation.annotation.Validated; |
... | ... | @@ -62,8 +63,8 @@ public class DYController { |
62 | 63 | * @param accountNo 账户号 |
63 | 64 | */ |
64 | 65 | @GetMapping("/updateAccountFans") |
65 | - public Integer updateAccountFans(String accountNo) { | |
66 | - return douyinCrawl.updateAccountFans(accountNo); | |
66 | + public ReportAccountDto updateAccountFans(String accountNo) { | |
67 | + return douyinCrawl.updateAccountMsg(accountNo); | |
67 | 68 | } |
68 | 69 | |
69 | 70 | /** | ... | ... |
src/main/java/cn/fw/freya/controller/KSController.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.freya.controller; |
2 | 2 | |
3 | 3 | import cn.fw.freya.model.data.pool.LivePool; |
4 | 4 | import cn.fw.freya.model.data.pool.VideoPool; |
5 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
5 | 6 | import cn.fw.freya.service.crawl.impl.KuaiShouCrawl; |
6 | 7 | import com.alibaba.fastjson.JSONObject; |
7 | 8 | import lombok.RequiredArgsConstructor; |
... | ... | @@ -59,8 +60,8 @@ public class KSController { |
59 | 60 | * @param accountNo 账户号 |
60 | 61 | */ |
61 | 62 | @GetMapping("/updateAccountFans") |
62 | - public Integer updateAccountFans(String accountNo) throws IOException { | |
63 | - return kuaishouCrawl.updateAccountFans(accountNo); | |
63 | + public ReportAccountDto updateAccountFans(String accountNo) throws IOException { | |
64 | + return kuaishouCrawl.updateAccountMsg(accountNo); | |
64 | 65 | } |
65 | 66 | |
66 | 67 | /** |
... | ... | @@ -79,13 +80,12 @@ public class KSController { |
79 | 80 | * @param accountNo 账户号 |
80 | 81 | */ |
81 | 82 | @GetMapping("/getNS_sig3") |
82 | - public String getNS_sig3(String accountNo, Integer type) { | |
83 | - return kuaishouCrawl.getNS_sig3(accountNo, type); | |
83 | + public String getNS_sig3(String accountNo, Integer type, boolean retryGet) { | |
84 | + return kuaishouCrawl.getNS_sig3(accountNo, type, retryGet); | |
84 | 85 | } |
85 | 86 | |
86 | 87 | /** |
87 | 88 | * 设置setSig3Map |
88 | - * | |
89 | 89 | */ |
90 | 90 | @GetMapping("/setSig3Map") |
91 | 91 | public boolean setSig3Map() { |
... | ... | @@ -94,16 +94,14 @@ public class KSController { |
94 | 94 | |
95 | 95 | /** |
96 | 96 | * 设置setSig3Map |
97 | - * | |
98 | 97 | */ |
99 | 98 | @PostMapping("/setMapFromString") |
100 | 99 | public boolean setMapFromString(@RequestBody String jsonStr) { |
101 | - return kuaishouCrawl.setMapFromString(jsonStr); | |
100 | + return kuaishouCrawl.setMapFromString(jsonStr, false); | |
102 | 101 | } |
103 | 102 | |
104 | 103 | /** |
105 | 104 | * 停止设置setSig3Map |
106 | - * | |
107 | 105 | */ |
108 | 106 | @GetMapping("/stopSetSig3Map") |
109 | 107 | public boolean stopSetSig3Map() { |
... | ... | @@ -111,8 +109,15 @@ public class KSController { |
111 | 109 | } |
112 | 110 | |
113 | 111 | /** |
112 | + * 清空Sig3Map | |
113 | + */ | |
114 | + @GetMapping("/cleanSig3Map") | |
115 | + public boolean cleanSig3Map() { | |
116 | + return kuaishouCrawl.cleanSig3Map(); | |
117 | + } | |
118 | + | |
119 | + /** | |
114 | 120 | * 获取getSig3Map |
115 | - * | |
116 | 121 | */ |
117 | 122 | @GetMapping("/getSig3Map") |
118 | 123 | public String getSig3Map() { | ... | ... |
src/main/java/cn/fw/freya/controller/OtherController.java
... | ... | @@ -5,6 +5,7 @@ import cn.fw.freya.model.data.Account; |
5 | 5 | import cn.fw.freya.model.data.pool.LivePool; |
6 | 6 | import cn.fw.freya.model.dto.other.ReportLiveDto; |
7 | 7 | import cn.fw.freya.model.dto.other.ReportVideoDto; |
8 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
8 | 9 | import cn.fw.freya.service.CommonBizService; |
9 | 10 | import cn.fw.freya.service.crawl.impl.Common; |
10 | 11 | import cn.fw.freya.service.rpc.AccountRpcService; |
... | ... | @@ -86,16 +87,16 @@ public class OtherController { |
86 | 87 | } |
87 | 88 | |
88 | 89 | /** |
89 | - * 上报账户粉丝数 | |
90 | + * 上报账户信息 | |
90 | 91 | * |
91 | - * @param account 账号 | |
92 | - * @param type 账号类型 | |
93 | - * @param fansCnt 粉丝数 | |
92 | + * @param account 账号 | |
93 | + * @param type 账号类型 | |
94 | + * @param accountMsg 账户信息 | |
94 | 95 | * @return |
95 | 96 | */ |
96 | - @PostMapping("/reportFansCnt") | |
97 | - public ResponseMessage<Boolean> reportFansCnt(@NotBlank(message = "账号不能为空") String account, @NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "粉丝数量不能为空") Integer fansCnt) { | |
98 | - return ResponseMessage.success(reportRpcService.reportFansCnt(account, type, fansCnt)); | |
97 | + @PostMapping("/reportAccountMsg") | |
98 | + public ResponseMessage<Boolean> reportAccountMsg(@NotBlank(message = "账号不能为空") String account, @NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "账户信息不能为空") ReportAccountDto accountMsg) { | |
99 | + return ResponseMessage.success(reportRpcService.reportAccountMsg(account, type, accountMsg)); | |
99 | 100 | } |
100 | 101 | |
101 | 102 | /** |
... | ... | @@ -175,7 +176,7 @@ public class OtherController { |
175 | 176 | * @return |
176 | 177 | */ |
177 | 178 | @GetMapping("/getWithoutPlaybackLive") |
178 | - public List<LivePool> getWithoutPlaybackLive(@NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "时长阈值不能为空")Double durationThreshold) { | |
179 | + public List<LivePool> getWithoutPlaybackLive(@NotNull(message = "账户类型不能为空") Integer type, @NotNull(message = "时长阈值不能为空") Double durationThreshold) { | |
179 | 180 | return common.getWithoutPlaybackLive(type, durationThreshold); |
180 | 181 | } |
181 | 182 | ... | ... |
src/main/java/cn/fw/freya/dao/AccountDao.java
... | ... | @@ -18,23 +18,23 @@ public interface AccountDao extends JpaRepository<Account, Long> { |
18 | 18 | /** |
19 | 19 | * 删除指定账号 |
20 | 20 | * |
21 | - * @param phoneNo | |
21 | + * @param accountNo | |
22 | 22 | * @param value |
23 | 23 | */ |
24 | 24 | @Transactional(rollbackFor = Exception.class) |
25 | 25 | @Modifying |
26 | - @Query("delete from Account a where a.phoneNo = ?1 and a.type = ?2") | |
27 | - void deleteByPhoneNoAndType(String phoneNo, Integer value); | |
26 | + @Query("delete from Account a where a.accountNo = ?1 and a.type = ?2") | |
27 | + void deleteByAccountNoAndType(String accountNo, Integer value); | |
28 | 28 | |
29 | 29 | /** |
30 | 30 | * 查询账号 |
31 | 31 | * |
32 | - * @param phoneNo | |
32 | + * @param accountNo | |
33 | 33 | * @param type |
34 | 34 | * @return |
35 | 35 | */ |
36 | - @Query("select a from Account a where a.phoneNo = ?1 and a.type = ?2 ") | |
37 | - Account findByPhoneNoAndType(String phoneNo, Integer type); | |
36 | + @Query("select a from Account a where a.accountNo = ?1 and a.type = ?2 ") | |
37 | + Account findByAccountNoAndType(String accountNo, Integer type); | |
38 | 38 | |
39 | 39 | /** |
40 | 40 | * 随机获取一个账号 |
... | ... | @@ -72,45 +72,47 @@ public interface AccountDao extends JpaRepository<Account, Long> { |
72 | 72 | List<Account> findNotUseAccount(); |
73 | 73 | |
74 | 74 | /** |
75 | - * 更新账户粉丝数 | |
75 | + * 更新账户信息 | |
76 | 76 | * |
77 | - * @param id | |
78 | - * @param fansCnt | |
77 | + * @param id 账户id | |
78 | + * @param accountName 账户名 | |
79 | + * @param fansCnt 账户粉丝数 | |
79 | 80 | * @return |
80 | 81 | */ |
81 | 82 | @Transactional(rollbackFor = Exception.class) |
82 | 83 | @Modifying |
83 | - @Query("update Account a set a.fansCnt = ?2, a.reportDate = ?3 where a.id = ?1") | |
84 | - int updateFans(Long id, int fansCnt, Date reportDate); | |
84 | + @Query("update Account a set a.accountName = ?2, a.fansCnt = ?3, a.reportDate = ?4 where a.id = ?1") | |
85 | + int updateMsg(Long id, String accountName, int fansCnt, Date reportDate); | |
85 | 86 | |
86 | 87 | /** |
87 | 88 | * 获取今天上报的粉丝数据 |
88 | 89 | * |
89 | - * @param phoneNo 账户号 | |
90 | + * @param accountNo 账户号 | |
90 | 91 | * @param type 账户类型 |
91 | 92 | * @param reportDate 上报日期 |
92 | 93 | * @return |
93 | 94 | */ |
94 | - @Query("select a.fansCnt from Account a where a.phoneNo = ?1 and a.type = ?2 and a.reportDate >= ?3") | |
95 | - Integer getHasReportDate(String phoneNo, Integer type, Date reportDate); | |
95 | + @Query("select a from Account a where a.accountNo = ?1 and a.type = ?2 and a.reportDate >= ?3") | |
96 | + List<Account> getHasReportDate(String accountNo, Integer type, Date reportDate); | |
96 | 97 | |
97 | 98 | /** |
98 | 99 | * 更新账户cookies状态 |
99 | 100 | * |
100 | - * @param phoneNo | |
101 | + * @param accountNo | |
101 | 102 | * @param type |
102 | 103 | * @param cookiesStatus |
103 | 104 | */ |
104 | 105 | @Transactional(rollbackFor = Exception.class) |
105 | 106 | @Modifying |
106 | - @Query("update Account a set a.cookiesStatus = ?3 where a.phoneNo = ?1 and a.type = ?2") | |
107 | - void updateAccountCookiesStatus(String phoneNo, Integer type, boolean cookiesStatus); | |
107 | + @Query("update Account a set a.cookiesStatus = ?3 where a.accountNo = ?1 and a.type = ?2") | |
108 | + void updateAccountCookiesStatus(String accountNo, Integer type, boolean cookiesStatus); | |
108 | 109 | |
109 | 110 | /** |
110 | 111 | * 设置账户状态为未完成 |
112 | + * | |
111 | 113 | * @param accountNo |
112 | 114 | */ |
113 | 115 | @Modifying |
114 | - @Query("update Account a set a.done = false where a.phoneNo = ?1") | |
116 | + @Query("update Account a set a.done = false where a.accountNo = ?1") | |
115 | 117 | void setAccountUndone(String accountNo); |
116 | 118 | } | ... | ... |
src/main/java/cn/fw/freya/dao/CookieDao.java
... | ... | @@ -17,21 +17,21 @@ public interface CookieDao extends JpaRepository<FwCookie, Long> { |
17 | 17 | /** |
18 | 18 | * 删除账号对应的cookie |
19 | 19 | * |
20 | - * @param phoneNo 账户号 | |
21 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
20 | + * @param accountNo 账户号 | |
21 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
22 | 22 | */ |
23 | 23 | @Transactional |
24 | 24 | @Modifying |
25 | - @Query("delete from FwCookie f where f.phoneNo = ?1 and f.type = ?2") | |
26 | - void deleteByPhoneNoAndType(String phoneNo, Integer type); | |
25 | + @Query("delete from FwCookie f where f.accountNo = ?1 and f.type = ?2") | |
26 | + void deleteByAccountNoAndType(String accountNo, Integer type); | |
27 | 27 | |
28 | 28 | /** |
29 | 29 | * 查询账号对应平台的cookie |
30 | 30 | * |
31 | - * @param phoneNo 账户号 | |
32 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
31 | + * @param accountNo 账户号 | |
32 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
33 | 33 | * @return |
34 | 34 | */ |
35 | - @Query("select f from FwCookie f where f.phoneNo = ?1 and f.type = ?2") | |
36 | - List<FwCookie> findByPhoneNoAndType(String phoneNo, Integer type); | |
35 | + @Query("select f from FwCookie f where f.accountNo = ?1 and f.type = ?2") | |
36 | + List<FwCookie> findByAccountNoAndType(String accountNo, Integer type); | |
37 | 37 | } | ... | ... |
src/main/java/cn/fw/freya/dao/LivePoolDao.java
... | ... | @@ -17,13 +17,13 @@ public interface LivePoolDao extends JpaRepository<LivePool, Long> { |
17 | 17 | /** |
18 | 18 | * 获取今天上报的数据 |
19 | 19 | * |
20 | - * @param phoneNo 账户号 | |
20 | + * @param accountNo 账户号 | |
21 | 21 | * @param type 账户类型 |
22 | 22 | * @param reportDate 上报日期 |
23 | 23 | * @return |
24 | 24 | */ |
25 | - @Query("select live from LivePool live where live.phoneNo = ?1 and live.type = ?2 and live.reportDate >= ?3") | |
26 | - List<LivePool> getHasReportDate(String phoneNo, Integer type, Date reportDate); | |
25 | + @Query("select live from LivePool live where live.accountNo = ?1 and live.type = ?2 and live.reportDate >= ?3") | |
26 | + List<LivePool> getHasReportData(String accountNo, Integer type, Date reportDate); | |
27 | 27 | |
28 | 28 | /** |
29 | 29 | * 获取没有拿到回播的直播 |
... | ... | @@ -41,6 +41,6 @@ public interface LivePoolDao extends JpaRepository<LivePool, Long> { |
41 | 41 | * @param accountNo 账户号 |
42 | 42 | * @return |
43 | 43 | */ |
44 | - @Query("select live from LivePool live where live.phoneNo = ?1") | |
44 | + @Query("select live from LivePool live where live.accountNo = ?1") | |
45 | 45 | List<LivePool> getLiveByAccountNo(String accountNo); |
46 | 46 | } | ... | ... |
src/main/java/cn/fw/freya/dao/VideoPoolDao.java
... | ... | @@ -21,24 +21,24 @@ public interface VideoPoolDao extends JpaRepository<VideoPool, Long> { |
21 | 21 | /** |
22 | 22 | * 删除 |
23 | 23 | * |
24 | - * @param phoneNo 账户号 | |
24 | + * @param accountNo 账户号 | |
25 | 25 | * @param previousDay 前一天 |
26 | 26 | * @param type 账户类型 |
27 | 27 | * @param resourceType 资源类型 |
28 | 28 | */ |
29 | 29 | @Transactional(rollbackFor = Exception.class) |
30 | 30 | @Modifying |
31 | - @Query("delete from VideoPool where phoneNo = ?1 and reportDate = ?2 and type=?3 and resourceType=?4") | |
32 | - void deleteByPhoneNoAndDate(String phoneNo, Date previousDay, Integer type, Integer resourceType); | |
31 | + @Query("delete from VideoPool where accountNo = ?1 and reportDate = ?2 and type=?3 and resourceType=?4") | |
32 | + void deleteByAccountNoAndDate(String accountNo, Date previousDay, Integer type, Integer resourceType); | |
33 | 33 | |
34 | 34 | /** |
35 | 35 | * 获取今天上报的数据 |
36 | 36 | * |
37 | - * @param phoneNo 账户号 | |
37 | + * @param accountNo 账户号 | |
38 | 38 | * @param type 账户类型 |
39 | 39 | * @param reportDate 上报日期 |
40 | 40 | * @return |
41 | 41 | */ |
42 | - @Query("select v from VideoPool v where v.phoneNo = ?1 and v.type = ?2 and v.reportDate >= ?3") | |
43 | - List<VideoPool> getHasReportDate(String phoneNo, Integer type, Date reportDate); | |
42 | + @Query("select v from VideoPool v where v.accountNo = ?1 and v.type = ?2 and v.reportDate >= ?3") | |
43 | + List<VideoPool> getHasReportDate(String accountNo, Integer type, Date reportDate); | |
44 | 44 | } | ... | ... |
src/main/java/cn/fw/freya/enums/AccountTypeEnum.java
src/main/java/cn/fw/freya/model/data/Account.java
... | ... | @@ -18,16 +18,12 @@ import java.util.Objects; |
18 | 18 | @AllArgsConstructor |
19 | 19 | @Builder(toBuilder = true) |
20 | 20 | @Entity |
21 | -@Table(name = "account", uniqueConstraints = @UniqueConstraint(columnNames = {"phoneNo", "type"})) | |
21 | +@Table(name = "account", uniqueConstraints = @UniqueConstraint(columnNames = {"accountNo", "type"})) | |
22 | 22 | public class Account { |
23 | 23 | @Id |
24 | 24 | @GeneratedValue(strategy = GenerationType.IDENTITY) |
25 | 25 | private Long id; |
26 | 26 | /** |
27 | - * 账户号 | |
28 | - */ | |
29 | - private String phoneNo; | |
30 | - /** | |
31 | 27 | * 回播搜索关键词 |
32 | 28 | */ |
33 | 29 | private String playbackSearchKey; |
... | ... | @@ -36,6 +32,10 @@ public class Account { |
36 | 32 | */ |
37 | 33 | private String accountNo; |
38 | 34 | /** |
35 | + * 账户名 | |
36 | + */ | |
37 | + private String accountName; | |
38 | + /** | |
39 | 39 | * 账户类型 (1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) |
40 | 40 | */ |
41 | 41 | private Integer type; | ... | ... |
src/main/java/cn/fw/freya/model/data/FwCookie.java
... | ... | @@ -23,7 +23,7 @@ import java.util.Objects; |
23 | 23 | @ToString |
24 | 24 | @AllArgsConstructor |
25 | 25 | @NoArgsConstructor |
26 | -@Table(name = "cookie", indexes = {@Index(columnList = "phoneNo")}) | |
26 | +@Table(name = "cookie", indexes = {@Index(columnList = "accountNo")}) | |
27 | 27 | public class FwCookie { |
28 | 28 | @Id |
29 | 29 | @GeneratedValue(strategy = GenerationType.IDENTITY) |
... | ... | @@ -31,7 +31,7 @@ public class FwCookie { |
31 | 31 | /** |
32 | 32 | * 账户号 |
33 | 33 | */ |
34 | - private String phoneNo; | |
34 | + private String accountNo; | |
35 | 35 | /** |
36 | 36 | * 账户类型 (1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) |
37 | 37 | */ |
... | ... | @@ -104,13 +104,13 @@ public class FwCookie { |
104 | 104 | /** |
105 | 105 | * WebDriver获取到的cookies->DB |
106 | 106 | * |
107 | - * @param cookie WebDriver获取到的cookie | |
108 | - * @param phoneNo 账户号 | |
107 | + * @param cookie WebDriver获取到的cookie | |
108 | + * @param accountNo 账户号 | |
109 | 109 | * @return cookies |
110 | 110 | */ |
111 | - public static FwCookie toDb(Cookie cookie, String phoneNo, Integer type) { | |
111 | + public static FwCookie toDb(Cookie cookie, String accountNo, Integer type) { | |
112 | 112 | FwCookie fwCookie = new FwCookie(); |
113 | - fwCookie.setPhoneNo(phoneNo); | |
113 | + fwCookie.setAccountNo(accountNo); | |
114 | 114 | fwCookie.setType(type); |
115 | 115 | fwCookie.setDomain(cookie.getDomain()); |
116 | 116 | fwCookie.setExpiryDate(DateUtil.date2LocalDateTime(cookie.getExpiry())); | ... | ... |
src/main/java/cn/fw/freya/model/data/LiveOverview.java
... | ... | @@ -18,7 +18,7 @@ import java.util.Date; |
18 | 18 | @Builder(toBuilder = true) |
19 | 19 | @Entity |
20 | 20 | @ToString |
21 | -@Table(name = "live_overview", uniqueConstraints = @UniqueConstraint(columnNames = {"phoneNo", "reportDate", "type"})) | |
21 | +@Table(name = "live_overview", uniqueConstraints = @UniqueConstraint(columnNames = {"accountNo", "reportDate", "type"})) | |
22 | 22 | public class LiveOverview { |
23 | 23 | @Id |
24 | 24 | @GeneratedValue(strategy = GenerationType.IDENTITY) |
... | ... | @@ -41,7 +41,7 @@ public class LiveOverview { |
41 | 41 | /** |
42 | 42 | * 账户号 |
43 | 43 | */ |
44 | - private String phoneNo; | |
44 | + private String accountNo; | |
45 | 45 | /** |
46 | 46 | * 直播场次 |
47 | 47 | */ | ... | ... |
src/main/java/cn/fw/freya/model/data/pool/LivePool.java
... | ... | @@ -20,7 +20,7 @@ import java.util.Objects; |
20 | 20 | @AllArgsConstructor |
21 | 21 | @Builder(toBuilder = true) |
22 | 22 | @Entity |
23 | -@Table(name = "live_pool", uniqueConstraints = @UniqueConstraint(columnNames = {"reportDate", "type", "phoneNo", "roomId"})) | |
23 | +@Table(name = "live_pool", uniqueConstraints = @UniqueConstraint(columnNames = {"reportDate", "type", "accountNo", "roomId"})) | |
24 | 24 | public class LivePool { |
25 | 25 | /** |
26 | 26 | * 主键id |
... | ... | @@ -35,7 +35,7 @@ public class LivePool { |
35 | 35 | /** |
36 | 36 | * 账户号 |
37 | 37 | */ |
38 | - private String phoneNo; | |
38 | + private String accountNo; | |
39 | 39 | /** |
40 | 40 | * 数据上报日期 |
41 | 41 | */ | ... | ... |
src/main/java/cn/fw/freya/model/data/pool/VideoPool.java
... | ... | @@ -19,7 +19,7 @@ import java.util.Date; |
19 | 19 | @Builder(toBuilder = true) |
20 | 20 | @Entity |
21 | 21 | @ToString |
22 | -@Table(name = "video_pool", uniqueConstraints = @UniqueConstraint(columnNames = {"phoneNo", "videoId", "type", "reportDate"})) | |
22 | +@Table(name = "video_pool", uniqueConstraints = @UniqueConstraint(columnNames = {"accountNo", "videoId", "type", "reportDate"})) | |
23 | 23 | public class VideoPool { |
24 | 24 | @Id |
25 | 25 | @GeneratedValue(strategy = GenerationType.IDENTITY) |
... | ... | @@ -27,7 +27,7 @@ public class VideoPool { |
27 | 27 | /** |
28 | 28 | * 账户号 |
29 | 29 | */ |
30 | - private String phoneNo; | |
30 | + private String accountNo; | |
31 | 31 | /** |
32 | 32 | * 视频id |
33 | 33 | **/ | ... | ... |
src/main/java/cn/fw/freya/model/dto/rpc/AccountDto.java
src/main/java/cn/fw/freya/model/dto/rpc/ReportAccountDto.java
0 → 100644
1 | +package cn.fw.freya.model.dto.rpc; | |
2 | + | |
3 | +import lombok.AllArgsConstructor; | |
4 | +import lombok.Builder; | |
5 | +import lombok.Data; | |
6 | +import lombok.NoArgsConstructor; | |
7 | + | |
8 | +/** | |
9 | + * @author unknown | |
10 | + * @version 1.0 | |
11 | + * @date 2022/6/29 16:10 | |
12 | + * @Description | |
13 | + */ | |
14 | +@Data | |
15 | +@NoArgsConstructor | |
16 | +@AllArgsConstructor | |
17 | +@Builder(toBuilder = true) | |
18 | +public class ReportAccountDto { | |
19 | + /** | |
20 | + * 粉丝数 | |
21 | + */ | |
22 | + private Integer fansCnt; | |
23 | + /** | |
24 | + * 关注数 | |
25 | + */ | |
26 | + private Integer followCnt; | |
27 | + /** | |
28 | + * 点赞数 | |
29 | + */ | |
30 | + private Integer likeCnt; | |
31 | + /** | |
32 | + * 用户在平台的其他信息id | |
33 | + */ | |
34 | + private String userOtherId; | |
35 | + /** | |
36 | + * 用户id | |
37 | + */ | |
38 | + private String accountId; | |
39 | + /** | |
40 | + * 用户名 | |
41 | + */ | |
42 | + private String accountName; | |
43 | +} | ... | ... |
src/main/java/cn/fw/freya/service/CommonBizService.java
... | ... | @@ -113,7 +113,7 @@ public class CommonBizService { |
113 | 113 | } |
114 | 114 | accountList.addAll(list.stream() |
115 | 115 | .map(item -> Account.builder() |
116 | - .phoneNo(item.getPhoneNo()) | |
116 | + .accountNo(item.getAccountNo()) | |
117 | 117 | .playbackSearchKey(item.getPlaybackSearchKey()) |
118 | 118 | .type(typeEnum.getValue()) |
119 | 119 | .cookiesStatus(Boolean.TRUE) | ... | ... |
src/main/java/cn/fw/freya/service/CrawlBizService.java
... | ... | @@ -4,6 +4,7 @@ import cn.fw.freya.enums.AccountTypeEnum; |
4 | 4 | import cn.fw.freya.model.data.Account; |
5 | 5 | import cn.fw.freya.model.data.pool.LivePool; |
6 | 6 | import cn.fw.freya.model.data.pool.VideoPool; |
7 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
7 | 8 | import cn.fw.freya.service.crawl.CrawlStrategy; |
8 | 9 | import cn.fw.freya.service.data.AccountService; |
9 | 10 | import cn.fw.freya.service.rpc.AccountRpcService; |
... | ... | @@ -53,43 +54,43 @@ public class CrawlBizService { |
53 | 54 | /** |
54 | 55 | * 登陆准备 |
55 | 56 | * |
56 | - * @param phoneNo 账户号 | |
57 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
57 | + * @param accountNo 账户号 | |
58 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
58 | 59 | * @return |
59 | 60 | */ |
60 | - public String preLogin(String phoneNo, Integer type) { | |
61 | + public String preLogin(String accountNo, Integer type) { | |
61 | 62 | AccountTypeEnum typeEnum = AccountTypeEnum.getEnumByValue(type); |
62 | 63 | AssertUtil.notNull(typeEnum, () -> "平台类型不正确"); |
63 | 64 | CrawlStrategy crawlStrategy = crawlStrategyMap.get(typeEnum); |
64 | - return crawlStrategy.preLogin(phoneNo); | |
65 | + return crawlStrategy.preLogin(accountNo); | |
65 | 66 | } |
66 | 67 | |
67 | 68 | /** |
68 | 69 | * 登陆 |
69 | 70 | * |
70 | - * @param phoneNo 账户号 | |
71 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
71 | + * @param accountNo 账户号 | |
72 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
72 | 73 | * @return |
73 | 74 | */ |
74 | - public boolean doLogin(String phoneNo, Integer type) { | |
75 | + public boolean doLogin(String accountNo, Integer type) { | |
75 | 76 | AccountTypeEnum typeEnum = AccountTypeEnum.getEnumByValue(type); |
76 | 77 | AssertUtil.notNull(typeEnum, () -> "平台类型不正确"); |
77 | 78 | CrawlStrategy crawlStrategy = crawlStrategyMap.get(typeEnum); |
78 | - return crawlStrategy.doLogin(phoneNo); | |
79 | + return crawlStrategy.doLogin(accountNo); | |
79 | 80 | } |
80 | 81 | |
81 | 82 | /** |
82 | 83 | * 退出浏览器 |
83 | 84 | * |
84 | - * @param phoneNo 账户号 | |
85 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
85 | + * @param accountNo 账户号 | |
86 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
86 | 87 | * @return |
87 | 88 | */ |
88 | - public boolean exitBrowser(String phoneNo, Integer type) { | |
89 | + public boolean exitBrowser(String accountNo, Integer type) { | |
89 | 90 | AccountTypeEnum typeEnum = AccountTypeEnum.getEnumByValue(type); |
90 | 91 | AssertUtil.notNull(typeEnum, () -> "平台类型不正确"); |
91 | 92 | CrawlStrategy crawlStrategy = crawlStrategyMap.get(typeEnum); |
92 | - return crawlStrategy.exitBrowser(phoneNo); | |
93 | + return crawlStrategy.exitBrowser(accountNo); | |
93 | 94 | } |
94 | 95 | |
95 | 96 | /** |
... | ... | @@ -99,13 +100,13 @@ public class CrawlBizService { |
99 | 100 | */ |
100 | 101 | public void crawlData(Account account) throws IOException { |
101 | 102 | Integer type = account.getType(); |
102 | - final String accountNo = account.getPhoneNo(); | |
103 | + final String accountNo = account.getAccountNo(); | |
103 | 104 | AccountTypeEnum typeEnum = AccountTypeEnum.getEnumByValue(type); |
104 | 105 | CrawlStrategy crawlStrategy = crawlStrategyMap.get(typeEnum); |
105 | 106 | // 抓取数据 |
106 | 107 | log.info("线程: " + Thread.currentThread().getName() + " 开始抓取数据"); |
107 | - final Integer fansCnt = crawlStrategy.updateAccountFans(accountNo);// 更新粉丝数 | |
108 | - if (Objects.isNull(fansCnt)) { | |
108 | + final ReportAccountDto accountMsg = crawlStrategy.updateAccountMsg(accountNo);// 更新粉丝数 | |
109 | + if (Objects.isNull(accountMsg)) { | |
109 | 110 | doPushExpireAccount(account); |
110 | 111 | return; |
111 | 112 | } |
... | ... | @@ -120,19 +121,20 @@ public class CrawlBizService { |
120 | 121 | return; |
121 | 122 | } |
122 | 123 | // 上报数据 |
123 | - final boolean reportFansCnt = this.doReportFansCnt(account, fansCnt); | |
124 | - if (!reportFansCnt) { | |
125 | - log.error(LocalDate.now() + " 上报账户为" + accountNo + "的" + (account.getType() == 1 ? "快手" : "抖音") + "的粉丝数据失败"); | |
124 | + final boolean reportAccountMsg = this.doReportAccountMsg(account, accountMsg); | |
125 | + final String format = String.format("上报[%s]平台, 账户号为: %s", AccountTypeEnum.getNameByValue(account.getType()), accountNo); | |
126 | + if (!reportAccountMsg) { | |
127 | + log.error(format + "的账户信息失败"); | |
126 | 128 | return; |
127 | 129 | } |
128 | 130 | final boolean reportVideo = this.doReportVideo(account, allVideoMsg); |
129 | 131 | if (!reportVideo) { |
130 | - log.error(LocalDate.now() + " 上报账户为" + accountNo + "的" + (account.getType() == 1 ? "快手" : "抖音") + "的视频数据失败"); | |
132 | + log.error(format + "的视频数据失败"); | |
131 | 133 | return; |
132 | 134 | } |
133 | 135 | final boolean reportLive = this.doReportLive(account, yesterdayLiveMsg); |
134 | 136 | if (!reportLive) { |
135 | - log.error(LocalDate.now() + " 上报账户为" + accountNo + "的" + (account.getType() == 1 ? "快手" : "抖音") + "的直播数据失败"); | |
137 | + log.error(format + "的直播数据失败"); | |
136 | 138 | return; |
137 | 139 | } |
138 | 140 | this.afterCrawl(accountService.findById(account.getId())); |
... | ... | @@ -158,24 +160,24 @@ public class CrawlBizService { |
158 | 160 | int hasTryTimes = 0; |
159 | 161 | int maxTryTimes = 2; |
160 | 162 | while (!result && hasTryTimes < maxTryTimes) { |
161 | - result = accountRpcService.pushExpireAccount(account.getPhoneNo(), account.getType()); | |
163 | + result = accountRpcService.pushExpireAccount(account.getAccountNo(), account.getType()); | |
162 | 164 | hasTryTimes++; |
163 | 165 | } |
164 | 166 | } |
165 | 167 | |
166 | 168 | /** |
167 | - * 上报粉丝数 | |
169 | + * 上报账户信息 | |
168 | 170 | * |
169 | - * @param account 账户 | |
170 | - * @param fansCnt 粉丝数 | |
171 | + * @param account 账户 | |
172 | + * @param accountMsg 账户其他信息 | |
171 | 173 | * @return |
172 | 174 | */ |
173 | - private boolean doReportFansCnt(Account account, Integer fansCnt) { | |
175 | + private boolean doReportAccountMsg(Account account, ReportAccountDto accountMsg) { | |
174 | 176 | boolean reportFansCnt; |
175 | 177 | int hasTryTimes = 0; |
176 | 178 | int maxTryTimes = 2; |
177 | 179 | while (hasTryTimes < maxTryTimes) { |
178 | - reportFansCnt = reportRpcService.reportFansCnt(account.getPhoneNo(), account.getType(), fansCnt); | |
180 | + reportFansCnt = reportRpcService.reportAccountMsg(account.getAccountNo(), account.getType(), accountMsg); | |
179 | 181 | if (reportFansCnt) { |
180 | 182 | return true; |
181 | 183 | } else { |
... | ... | @@ -198,7 +200,7 @@ public class CrawlBizService { |
198 | 200 | int hasTryTimes = 0; |
199 | 201 | int maxTryTimes = 2; |
200 | 202 | while (hasTryTimes < maxTryTimes) { |
201 | - reportVideo = reportRpcService.reportVideo(account.getPhoneNo(), account.getType(), allVideoMsg); | |
203 | + reportVideo = reportRpcService.reportVideo(account.getAccountNo(), account.getType(), allVideoMsg); | |
202 | 204 | if (reportVideo) { |
203 | 205 | return true; |
204 | 206 | } else { |
... | ... | @@ -221,7 +223,7 @@ public class CrawlBizService { |
221 | 223 | int hasTryTimes = 0; |
222 | 224 | int maxTryTimes = 2; |
223 | 225 | while (hasTryTimes < maxTryTimes) { |
224 | - reportLive = reportRpcService.reportLive(account.getPhoneNo(), account.getType(), yesterdayLiveMsg); | |
226 | + reportLive = reportRpcService.reportLive(account.getAccountNo(), account.getType(), yesterdayLiveMsg); | |
225 | 227 | if (reportLive) { |
226 | 228 | return true; |
227 | 229 | } else { |
... | ... | @@ -243,14 +245,14 @@ public class CrawlBizService { |
243 | 245 | public void reportLive(Account account) throws IOException { |
244 | 246 | log.info(Thread.currentThread().getName() + " spring监听器在CrawlBizService.reportLive()方法上成功收到消息: " + account); |
245 | 247 | Integer type = account.getType(); |
246 | - final String accountNo = account.getPhoneNo(); | |
248 | + final String accountNo = account.getAccountNo(); | |
247 | 249 | AccountTypeEnum typeEnum = AccountTypeEnum.getEnumByValue(type); |
248 | 250 | CrawlStrategy crawlStrategy = crawlStrategyMap.get(typeEnum); |
249 | 251 | final List<LivePool> yesterdayLiveMsg = crawlStrategy.getYesterdayLiveMsg(accountNo);// 获取昨日直播信息 |
250 | 252 | final boolean reportLive = this.doReportLive(account, yesterdayLiveMsg); |
251 | 253 | if (!reportLive) { |
252 | 254 | accountService.setAccountUndone(accountNo); |
253 | - log.error(LocalDate.now() + " 上报账户为" + accountNo + "的" + (account.getType() == 1 ? "快手" : "抖音") + "的直播数据失败"); | |
255 | + log.error(LocalDate.now() + " 上报账户为" + accountNo + "的" + AccountTypeEnum.getNameByValue(account.getType()) + "的直播数据失败"); | |
254 | 256 | } |
255 | 257 | } |
256 | 258 | } | ... | ... |
src/main/java/cn/fw/freya/service/crawl/CrawlStrategy.java
... | ... | @@ -3,6 +3,7 @@ package cn.fw.freya.service.crawl; |
3 | 3 | import cn.fw.freya.enums.AccountTypeEnum; |
4 | 4 | import cn.fw.freya.model.data.pool.LivePool; |
5 | 5 | import cn.fw.freya.model.data.pool.VideoPool; |
6 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
6 | 7 | import cn.fw.freya.utils.http.InitUserAgent; |
7 | 8 | |
8 | 9 | import java.io.IOException; |
... | ... | @@ -102,11 +103,11 @@ public interface CrawlStrategy { |
102 | 103 | List<LivePool> getYesterdayLiveMsg(String accountNo) throws IOException; |
103 | 104 | |
104 | 105 | /** |
105 | - * 更新账户粉丝数 | |
106 | + * 更新账户信息 | |
106 | 107 | * |
107 | 108 | * @param accountNo 账户号 |
108 | 109 | * @return |
109 | 110 | * @throws IOException |
110 | 111 | */ |
111 | - Integer updateAccountFans(String accountNo) throws IOException; | |
112 | + ReportAccountDto updateAccountMsg(String accountNo) throws IOException; | |
112 | 113 | } | ... | ... |
src/main/java/cn/fw/freya/service/crawl/impl/BilibiliCrawl.java
... | ... | @@ -10,6 +10,7 @@ import cn.fw.freya.model.data.Account; |
10 | 10 | import cn.fw.freya.model.data.FwCookie; |
11 | 11 | import cn.fw.freya.model.data.pool.LivePool; |
12 | 12 | import cn.fw.freya.model.data.pool.VideoPool; |
13 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
13 | 14 | import cn.fw.freya.service.crawl.CrawlStrategy; |
14 | 15 | import cn.fw.freya.service.data.AccountService; |
15 | 16 | import cn.fw.freya.utils.DateUtil; |
... | ... | @@ -154,7 +155,7 @@ public class BilibiliCrawl implements CrawlStrategy { |
154 | 155 | } |
155 | 156 | } while (currentPage * pageSize < total);// 条件为false, 退出 |
156 | 157 | log.info(String.format("%s [%s]平台账户号为: %s的视频数据的原始数据为: %s", LocalDateTime.now(), this.getType().getName(), accountNo, JSON.toJSONString(videoJsonArray))); |
157 | - videoPoolDao.deleteByPhoneNoAndDate(accountNo, previousDay, AccountTypeEnum.BILIBILI.getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
158 | + videoPoolDao.deleteByAccountNoAndDate(accountNo, previousDay, AccountTypeEnum.BILIBILI.getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
158 | 159 | // 视频数据存库 |
159 | 160 | List<VideoPool> videoPoolList = new ArrayList<>(); |
160 | 161 | StringBuilder sb = new StringBuilder(); |
... | ... | @@ -189,7 +190,7 @@ public class BilibiliCrawl implements CrawlStrategy { |
189 | 190 | .playCount(playCnt)// 播放次数 |
190 | 191 | .likeCount(Optional.ofNullable(stat.getInteger("like")).orElse(0))// 点赞数 |
191 | 192 | .commentCount(Optional.ofNullable(stat.getInteger("reply")).orElse(0))// 评论数 |
192 | - .phoneNo(accountNo) | |
193 | + .accountNo(accountNo) | |
193 | 194 | .reportDate(new Date()) |
194 | 195 | .publishTime(new Date(Archive.getLong("ctime") * 1000))// 发布时间 |
195 | 196 | .videoUrl("https://www.bilibili.com/video/" + videoId)// 视频播放地址 |
... | ... | @@ -207,7 +208,7 @@ public class BilibiliCrawl implements CrawlStrategy { |
207 | 208 | videoPoolDao.saveAll(videoPoolList);// 将收集到的视频信息保存 |
208 | 209 | } else { |
209 | 210 | final VideoPool nullVideo = VideoPool.builder() |
210 | - .phoneNo(accountNo) | |
211 | + .accountNo(accountNo) | |
211 | 212 | .type(this.getType().getValue()) |
212 | 213 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
213 | 214 | .reportDate(new Date()) |
... | ... | @@ -367,7 +368,7 @@ public class BilibiliCrawl implements CrawlStrategy { |
367 | 368 | */ |
368 | 369 | livePoolList.add(LivePool.builder() |
369 | 370 | .type(this.getType().getValue()) |
370 | - .phoneNo(accountNo) | |
371 | + .accountNo(accountNo) | |
371 | 372 | .reportDate(new Date()) |
372 | 373 | .commentUserCnt(Optional.ofNullable(obj.getInteger("danmu_num")).orElse(0))// 评论数 |
373 | 374 | //.consumeUserCnt(Optional.ofNullable(obj.getInteger("sendGiftUv")).orElse(0)) |
... | ... | @@ -400,7 +401,7 @@ public class BilibiliCrawl implements CrawlStrategy { |
400 | 401 | log.info(LocalDate.now() + " 暂未找到账户号为:" + accountNo + "的Bilibili直播数据"); |
401 | 402 | final LivePool nullLive = LivePool.builder() |
402 | 403 | .type(this.getType().getValue()) |
403 | - .phoneNo(accountNo) | |
404 | + .accountNo(accountNo) | |
404 | 405 | .reportDate(new Date()) |
405 | 406 | .build(); |
406 | 407 | livePoolDao.save(nullLive); |
... | ... | @@ -419,10 +420,10 @@ public class BilibiliCrawl implements CrawlStrategy { |
419 | 420 | */ |
420 | 421 | @Override |
421 | 422 | @Transactional |
422 | - public Integer updateAccountFans(String accountNo) throws IOException { | |
423 | - final Integer hasFoundFansCnt = common.getHasFoundFansCnt(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
424 | - if (Objects.nonNull(hasFoundFansCnt)) { | |
425 | - return hasFoundFansCnt; | |
423 | + public ReportAccountDto updateAccountMsg(String accountNo) throws IOException { | |
424 | + final ReportAccountDto hasFoundAccountMsg = common.getHasFoundAccountMsg(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
425 | + if (Objects.nonNull(hasFoundAccountMsg)) { | |
426 | + return hasFoundAccountMsg; | |
426 | 427 | } |
427 | 428 | HttpConfig config = HttpConfig.custom() |
428 | 429 | .url("https://member.bilibili.com/x/web/index/stat") |
... | ... | @@ -442,28 +443,37 @@ public class BilibiliCrawl implements CrawlStrategy { |
442 | 443 | if (!StringUtils.hasText(res)) { |
443 | 444 | throw new BusinessException("调用Bilibili[粉丝]接口失败"); |
444 | 445 | } |
445 | - assert response != null; | |
446 | - Integer fansCnt; | |
446 | + ReportAccountDto reportAccountDto; | |
447 | 447 | try { |
448 | - fansCnt = response.getJSONObject("data").getInteger("total_fans"); | |
448 | + JSONObject data = response.getJSONObject("data"); | |
449 | + reportAccountDto = ReportAccountDto.builder() | |
450 | + .fansCnt(data.getInteger("total_fans")) | |
451 | + //.followCnt(data.getInteger("followCnt")) | |
452 | + .likeCnt(data.getInteger("total_like")) | |
453 | + //.accountId(data.getString("userId")) | |
454 | + //.userOtherId(data.getString("userKwaiId")) | |
455 | + //.accountName(data.getString("userName")) | |
456 | + .build(); | |
449 | 457 | } catch (Exception e) { |
450 | 458 | log.error("获取[哔哩哔哩]fansCnt发生错误", e); |
451 | - fansCnt = 0; | |
459 | + reportAccountDto = ReportAccountDto.builder() | |
460 | + .fansCnt(0) | |
461 | + .build(); | |
452 | 462 | } |
453 | - final Account account = accountDao.findByPhoneNoAndType(accountNo, this.getType().getValue()); | |
454 | - if (Objects.nonNull(account)) { | |
455 | - accountDao.updateFans(account.getId(), fansCnt, new Date()); | |
456 | - } else { | |
463 | + final Account account = accountDao.findByAccountNoAndType(accountNo, this.getType().getValue()); | |
464 | + if (Objects.nonNull(account)) | |
465 | + accountDao.updateMsg(account.getId(), reportAccountDto.getAccountName(), reportAccountDto.getFansCnt(), new Date()); | |
466 | + else | |
457 | 467 | accountDao.save(Account.builder() |
458 | 468 | .cookiesStatus(true) |
459 | - .phoneNo(accountNo) | |
469 | + .accountNo(accountNo) | |
460 | 470 | .type(this.getType().getValue()) |
461 | - .fansCnt(fansCnt) | |
471 | + .fansCnt(reportAccountDto.getFansCnt()) | |
472 | + .accountName(reportAccountDto.getAccountName()) | |
462 | 473 | .reportDate(new Date()) |
463 | 474 | .done(false) |
464 | 475 | .build()); |
465 | - } | |
466 | - return fansCnt; | |
476 | + return reportAccountDto; | |
467 | 477 | } |
468 | 478 | |
469 | 479 | /** |
... | ... | @@ -563,11 +573,11 @@ public class BilibiliCrawl implements CrawlStrategy { |
563 | 573 | /** |
564 | 574 | * 根据账户号查到用户cookies, 并组装成String形式返回 |
565 | 575 | * |
566 | - * @param phoneNo 账户号 | |
576 | + * @param accountNo 账户号 | |
567 | 577 | * @return |
568 | 578 | */ |
569 | - public String getUserCookies(String phoneNo) { | |
570 | - return this.processCookiesToString(common.loadCookie(phoneNo, this.getType().getValue())); | |
579 | + public String getUserCookies(String accountNo) { | |
580 | + return this.processCookiesToString(common.loadCookie(accountNo, this.getType().getValue())); | |
571 | 581 | } |
572 | 582 | |
573 | 583 | /** | ... | ... |
src/main/java/cn/fw/freya/service/crawl/impl/Common.java
... | ... | @@ -10,6 +10,7 @@ import cn.fw.freya.model.data.FwCookie; |
10 | 10 | import cn.fw.freya.model.data.ResponseReceived; |
11 | 11 | import cn.fw.freya.model.data.pool.LivePool; |
12 | 12 | import cn.fw.freya.model.data.pool.VideoPool; |
13 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
13 | 14 | import com.alibaba.fastjson.JSON; |
14 | 15 | import com.alibaba.fastjson.JSONObject; |
15 | 16 | import lombok.RequiredArgsConstructor; |
... | ... | @@ -159,7 +160,7 @@ public class Common { |
159 | 160 | * @param type 账户类型 |
160 | 161 | */ |
161 | 162 | public void deleteCookies(String accountNo, Integer type) { |
162 | - cookieDao.deleteByPhoneNoAndType(accountNo, type); | |
163 | + cookieDao.deleteByAccountNoAndType(accountNo, type); | |
163 | 164 | } |
164 | 165 | |
165 | 166 | /** |
... | ... | @@ -169,7 +170,7 @@ public class Common { |
169 | 170 | * @return |
170 | 171 | */ |
171 | 172 | public List<FwCookie> loadCookie(String accountNo, Integer type) { |
172 | - return Optional.ofNullable(cookieDao.findByPhoneNoAndType(accountNo, type)) | |
173 | + return Optional.ofNullable(cookieDao.findByAccountNoAndType(accountNo, type)) | |
173 | 174 | .orElse(new ArrayList<>()); |
174 | 175 | } |
175 | 176 | |
... | ... | @@ -252,10 +253,14 @@ public class Common { |
252 | 253 | * @param reportDate 指定日期 |
253 | 254 | * @return |
254 | 255 | */ |
255 | - public Integer getHasFoundFansCnt(String accountNo, Integer type, Date reportDate) { | |
256 | - final Integer hasReportDate = accountDao.getHasReportDate(accountNo, type, reportDate); | |
257 | - if (Objects.nonNull(hasReportDate)) { | |
258 | - return hasReportDate; | |
256 | + public ReportAccountDto getHasFoundAccountMsg(String accountNo, Integer type, Date reportDate) { | |
257 | + final List<Account> hasReportDate = accountDao.getHasReportDate(accountNo, type, reportDate); | |
258 | + if (!CollectionUtils.isEmpty(hasReportDate)) { | |
259 | + final Account account = hasReportDate.get(0); | |
260 | + return ReportAccountDto.builder() | |
261 | + .fansCnt(account.getFansCnt()) | |
262 | + .accountName(account.getAccountName()) | |
263 | + .build(); | |
259 | 264 | } |
260 | 265 | return null; |
261 | 266 | } |
... | ... | @@ -269,9 +274,9 @@ public class Common { |
269 | 274 | * @return |
270 | 275 | */ |
271 | 276 | public List<VideoPool> getHasFoundVideo(String accountNo, Integer type, Date reportDate) { |
272 | - final List<VideoPool> hasReportDate = videoPoolDao.getHasReportDate(accountNo, type, reportDate); | |
273 | - if (hasReportDate.size() > 0) { | |
274 | - return hasReportDate; | |
277 | + final List<VideoPool> hasReportData = videoPoolDao.getHasReportDate(accountNo, type, reportDate); | |
278 | + if (hasReportData.size() > 0) { | |
279 | + return hasReportData; | |
275 | 280 | } |
276 | 281 | return null; |
277 | 282 | } |
... | ... | @@ -285,9 +290,9 @@ public class Common { |
285 | 290 | * @return |
286 | 291 | */ |
287 | 292 | public List<LivePool> getHasFoundLive(String accountNo, Integer type, Date reportDate) { |
288 | - final List<LivePool> hasReportDate = livePoolDao.getHasReportDate(accountNo, type, reportDate); | |
289 | - if (hasReportDate.size() > 0) { | |
290 | - return hasReportDate; | |
293 | + final List<LivePool> hasReportData = livePoolDao.getHasReportData(accountNo, type, reportDate); | |
294 | + if (hasReportData.size() > 0) { | |
295 | + return hasReportData; | |
291 | 296 | } |
292 | 297 | return null; |
293 | 298 | } | ... | ... |
src/main/java/cn/fw/freya/service/crawl/impl/DongCheDiCrawl.java
... | ... | @@ -10,6 +10,7 @@ import cn.fw.freya.model.data.Account; |
10 | 10 | import cn.fw.freya.model.data.FwCookie; |
11 | 11 | import cn.fw.freya.model.data.pool.LivePool; |
12 | 12 | import cn.fw.freya.model.data.pool.VideoPool; |
13 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
13 | 14 | import cn.fw.freya.service.crawl.CrawlStrategy; |
14 | 15 | import cn.fw.freya.service.data.AccountService; |
15 | 16 | import cn.fw.freya.utils.DateUtil; |
... | ... | @@ -183,7 +184,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
183 | 184 | assert response1 != null; |
184 | 185 | JSONArray smallVideoJsonArray = Optional.ofNullable(response1.getJSONArray("item_datas")).orElse(new JSONArray());// 获取[小视频]数据数组 |
185 | 186 | videoJsonArray.addAll(smallVideoJsonArray); |
186 | - videoPoolDao.deleteByPhoneNoAndDate(accountNo, previousDay, this.getType().getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
187 | + videoPoolDao.deleteByAccountNoAndDate(accountNo, previousDay, this.getType().getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
187 | 188 | // 视频数据存库 |
188 | 189 | List<VideoPool> videoPoolList = new ArrayList<>(videoJsonArray.size()); |
189 | 190 | log.info(String.format("%s [%s]平台账户号为: %s的视频数据的原始数据为: %s", LocalDateTime.now(), this.getType().getName(), accountNo, JSON.toJSONString(videoJsonArray))); |
... | ... | @@ -215,7 +216,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
215 | 216 | .playCount(playCount)// 播放次数 |
216 | 217 | .likeCount(Optional.ofNullable(DCSObj.getInteger("digg_count")).orElse(0))// 点赞数 |
217 | 218 | .commentCount(Optional.ofNullable(DCSObj.getInteger("comment_count")).orElse(0))// 评论数 |
218 | - .phoneNo(accountNo) | |
219 | + .accountNo(accountNo) | |
219 | 220 | .reportDate(new Date()) |
220 | 221 | .publishTime(new Date(obj.getLong("create_time") * 1000L))// 发布时间 |
221 | 222 | .videoUrl("https://www.ixigua.com/" + videoId)// 播放地址 |
... | ... | @@ -232,7 +233,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
232 | 233 | videoPoolDao.saveAll(videoPoolList);// 将收集到的视频信息保存 |
233 | 234 | } else { |
234 | 235 | final VideoPool nullVideo = VideoPool.builder() |
235 | - .phoneNo(accountNo) | |
236 | + .accountNo(accountNo) | |
236 | 237 | .type(this.getType().getValue()) |
237 | 238 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
238 | 239 | .reportDate(new Date()) |
... | ... | @@ -285,7 +286,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
285 | 286 | log.info(LocalDate.now() + " 暂未找到账户号为:" + accountNo + "的懂车帝直播数据"); |
286 | 287 | final LivePool nullLive = LivePool.builder() |
287 | 288 | .type(this.getType().getValue()) |
288 | - .phoneNo(accountNo) | |
289 | + .accountNo(accountNo) | |
289 | 290 | .reportDate(new Date()) |
290 | 291 | .build(); |
291 | 292 | livePoolDao.save(nullLive); |
... | ... | @@ -326,7 +327,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
326 | 327 | assert userInfo != null; |
327 | 328 | livePoolList.add(LivePool.builder() |
328 | 329 | .type(this.getType().getValue()) |
329 | - .phoneNo(accountNo) | |
330 | + .accountNo(accountNo) | |
330 | 331 | .reportDate(new Date()) |
331 | 332 | .commentUserCnt(commentCnt)// 评论数 |
332 | 333 | //.consumeUserCnt(Optional.ofNullable(obj.getInteger("sendGiftUv")).orElse(0)) |
... | ... | @@ -359,7 +360,7 @@ public class DongCheDiCrawl implements CrawlStrategy { |
359 | 360 | log.info(LocalDate.now() + " 暂未找到账户号为:" + accountNo + "的懂车帝直播数据"); |
360 | 361 | final LivePool nullLive = LivePool.builder() |
361 | 362 | .type(this.getType().getValue()) |
362 | - .phoneNo(accountNo) | |
363 | + .accountNo(accountNo) | |
363 | 364 | .reportDate(new Date()) |
364 | 365 | .build(); |
365 | 366 | livePoolDao.save(nullLive); |
... | ... | @@ -378,14 +379,19 @@ public class DongCheDiCrawl implements CrawlStrategy { |
378 | 379 | * @return |
379 | 380 | */ |
380 | 381 | @Override |
381 | - public Integer updateAccountFans(String accountNo) { | |
382 | - final Integer hasFoundFansCnt = common.getHasFoundFansCnt(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
383 | - if (Objects.nonNull(hasFoundFansCnt)) { | |
384 | - return hasFoundFansCnt; | |
382 | + public ReportAccountDto updateAccountMsg(String accountNo) { | |
383 | + final ReportAccountDto hasFoundAccountMsg = common.getHasFoundAccountMsg(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
384 | + if (Objects.nonNull(hasFoundAccountMsg)) { | |
385 | + return hasFoundAccountMsg; | |
385 | 386 | } |
386 | 387 | final String userId; |
388 | + String userNick; | |
389 | + String ttId; | |
387 | 390 | try { |
388 | - userId = Objects.requireNonNull(this.getUserInfo(accountNo)).getString("userId"); | |
391 | + final JSONObject obj = Objects.requireNonNull(this.getUserInfo(accountNo)); | |
392 | + userId = obj.getString("userId"); | |
393 | + userNick = obj.getString("userNick"); | |
394 | + ttId = obj.getString("ttId"); | |
389 | 395 | } catch (NullPointerException e) { |
390 | 396 | return null; |
391 | 397 | } |
... | ... | @@ -414,24 +420,32 @@ public class DongCheDiCrawl implements CrawlStrategy { |
414 | 420 | throw new BusinessException("调用懂车帝[粉丝]接口失败"); |
415 | 421 | } |
416 | 422 | final JSONArray data = response1.getJSONArray("data"); |
423 | + ReportAccountDto reportAccountDto; | |
417 | 424 | for (Object item : data) { |
418 | 425 | JSONObject obj = (JSONObject) item; |
419 | 426 | if (obj.getString("title").contains("总数")) { |
420 | - final Integer fansCnt = obj.getInteger("data"); | |
421 | - final Account account = accountDao.findByPhoneNoAndType(accountNo, this.getType().getValue()); | |
422 | - if (Objects.nonNull(account)) { | |
423 | - accountDao.updateFans(account.getId(), fansCnt, new Date()); | |
424 | - } else { | |
427 | + reportAccountDto = ReportAccountDto.builder() | |
428 | + .fansCnt(obj.getInteger("data")) | |
429 | + //.followCnt(obj.getInteger("followCnt")) | |
430 | + //.likeCnt(obj.getInteger("likeCnt")) | |
431 | + .accountId(userId) | |
432 | + .userOtherId(ttId) | |
433 | + .accountName(userNick) | |
434 | + .build(); | |
435 | + final Account account = accountDao.findByAccountNoAndType(accountNo, this.getType().getValue()); | |
436 | + if (Objects.nonNull(account)) | |
437 | + accountDao.updateMsg(account.getId(), reportAccountDto.getAccountName(), reportAccountDto.getFansCnt(), new Date()); | |
438 | + else | |
425 | 439 | accountDao.save(Account.builder() |
426 | 440 | .cookiesStatus(true) |
427 | - .phoneNo(accountNo) | |
441 | + .accountNo(accountNo) | |
428 | 442 | .type(this.getType().getValue()) |
429 | - .fansCnt(fansCnt) | |
443 | + .fansCnt(reportAccountDto.getFansCnt()) | |
444 | + .accountName(reportAccountDto.getAccountName()) | |
430 | 445 | .reportDate(new Date()) |
431 | 446 | .done(false) |
432 | 447 | .build()); |
433 | - } | |
434 | - return fansCnt; | |
448 | + return reportAccountDto; | |
435 | 449 | } |
436 | 450 | } |
437 | 451 | return null; |
... | ... | @@ -559,11 +573,11 @@ public class DongCheDiCrawl implements CrawlStrategy { |
559 | 573 | /** |
560 | 574 | * 根据账户号查到用户cookies, 并组装成String形式返回 |
561 | 575 | * |
562 | - * @param phoneNo 账户号 | |
576 | + * @param accountNo 账户号 | |
563 | 577 | * @return |
564 | 578 | */ |
565 | - public String getUserCookies(String phoneNo) { | |
566 | - return this.processCookiesToString(common.loadCookie(phoneNo, this.getType().getValue())); | |
579 | + public String getUserCookies(String accountNo) { | |
580 | + return this.processCookiesToString(common.loadCookie(accountNo, this.getType().getValue())); | |
567 | 581 | } |
568 | 582 | |
569 | 583 | /** | ... | ... |
src/main/java/cn/fw/freya/service/crawl/impl/DouYinCrawl.java
... | ... | @@ -13,6 +13,7 @@ import cn.fw.freya.model.data.LiveOverview; |
13 | 13 | import cn.fw.freya.model.data.ResponseReceived; |
14 | 14 | import cn.fw.freya.model.data.pool.LivePool; |
15 | 15 | import cn.fw.freya.model.data.pool.VideoPool; |
16 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
16 | 17 | import cn.fw.freya.service.crawl.CrawlStrategy; |
17 | 18 | import cn.fw.freya.service.data.AccountService; |
18 | 19 | import cn.fw.freya.utils.DateUtil; |
... | ... | @@ -132,13 +133,13 @@ public class DouYinCrawl implements CrawlStrategy { |
132 | 133 | */ |
133 | 134 | @Override |
134 | 135 | @Transactional |
135 | - /*public List<VideoPool> getAllVideoMsg(String phoneNo) { | |
136 | - final List<VideoPool> hasFoundVideo = common.getHasFoundVideo(phoneNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
136 | + /*public List<VideoPool> getAllVideoMsg(String accountNo) { | |
137 | + final List<VideoPool> hasFoundVideo = common.getHasFoundVideo(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
137 | 138 | if (Objects.nonNull(hasFoundVideo)) { |
138 | 139 | return hasFoundVideo; |
139 | 140 | } |
140 | 141 | final String uuid = UUID.randomUUID().toString().replace("-", ""); |
141 | - final WebDriver driver = this.getDYDriver(phoneNo, uuid); | |
142 | + final WebDriver driver = this.getDYDriver(accountNo, uuid); | |
142 | 143 | String targetUrl = "https://creator.douyin.com/creator-micro/content/manage"; |
143 | 144 | driver.get(targetUrl); |
144 | 145 | List<WebElement> endNodes; |
... | ... | @@ -146,7 +147,7 @@ public class DouYinCrawl implements CrawlStrategy { |
146 | 147 | do { |
147 | 148 | endNodes = driver.findElements(By.xpath("//div[starts-with(@class,'load-more')]/div[text()='没有更多视频']")); |
148 | 149 | if (!Objects.equals(driver.getCurrentUrl(), targetUrl)) { |
149 | - this.exitBrowser(phoneNo, uuid); | |
150 | + this.exitBrowser(accountNo, uuid); | |
150 | 151 | return null; |
151 | 152 | } |
152 | 153 | if (CollectionUtils.isEmpty(endNodes)) { |
... | ... | @@ -211,7 +212,7 @@ public class DouYinCrawl implements CrawlStrategy { |
211 | 212 | .preview(videoMsg.getJSONObject("origin_cover").getJSONArray("url_list").get(0).toString()) |
212 | 213 | .duration(jsonObj.getLong("duration") / (1000 * 1.0)) |
213 | 214 | .likeCount(statistics.getInteger("share_count")) |
214 | - .phoneNo(phoneNo) | |
215 | + .accountNo(accountNo) | |
215 | 216 | .playCount(statistics.getInteger("play_count")) |
216 | 217 | .reportDate(new Date()) |
217 | 218 | .resourceType(jsonObj.getBoolean("is_live_replay") ? 2 : 1) |
... | ... | @@ -234,7 +235,7 @@ public class DouYinCrawl implements CrawlStrategy { |
234 | 235 | videoPoolDao.saveAll(videoPoolList);// 将收集到的视频信息保存 |
235 | 236 | } else { |
236 | 237 | videoPoolDao.save(VideoPool.builder() |
237 | - .phoneNo(phoneNo) | |
238 | + .accountNo(accountNo) | |
238 | 239 | .type(this.getType().getValue()) |
239 | 240 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
240 | 241 | .reportDate(new Date()) |
... | ... | @@ -243,9 +244,9 @@ public class DouYinCrawl implements CrawlStrategy { |
243 | 244 | log.info(LocalDate.now() + " 总共获取到" + videoPoolList.size() + "条抖音视频信息"); |
244 | 245 | } catch (Exception e) { |
245 | 246 | assert log != null; |
246 | - log.error(LocalDate.now() + " 执行保存" + phoneNo + "的抖音视频数据失败", e); | |
247 | + log.error(LocalDate.now() + " 执行保存" + accountNo + "的抖音视频数据失败", e); | |
247 | 248 | } |
248 | - this.exitBrowser(phoneNo, uuid); | |
249 | + this.exitBrowser(accountNo, uuid); | |
249 | 250 | return videoPoolList; |
250 | 251 | }*/ |
251 | 252 | public List<VideoPool> getAllVideoMsg(String accountNo) { |
... | ... | @@ -279,7 +280,7 @@ public class DouYinCrawl implements CrawlStrategy { |
279 | 280 | if (element.getText().contains("没有") || element.getText().contains("起开始展示数据")) { |
280 | 281 | this.exitBrowser(accountNo, uuid); |
281 | 282 | videoPoolDao.save(VideoPool.builder() |
282 | - .phoneNo(accountNo) | |
283 | + .accountNo(accountNo) | |
283 | 284 | .type(this.getType().getValue()) |
284 | 285 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
285 | 286 | .reportDate(new Date()) |
... | ... | @@ -358,7 +359,7 @@ public class DouYinCrawl implements CrawlStrategy { |
358 | 359 | .preview(videoMsg.getJSONObject("origin_cover").getJSONArray("url_list").get(0).toString()) |
359 | 360 | .duration(Optional.ofNullable(jsonObj.getDouble("duration")).orElse(0d) / 1000) |
360 | 361 | .likeCount(Optional.ofNullable(statistics.getInteger("digg_count")).orElse(0)) |
361 | - .phoneNo(accountNo) | |
362 | + .accountNo(accountNo) | |
362 | 363 | .playCount(Optional.ofNullable(statistics.getInteger("play_count")).orElse(0)) |
363 | 364 | .reportDate(new Date()) |
364 | 365 | .resourceType(jsonObj.getBoolean("is_live_replay") ? 2 : 1) |
... | ... | @@ -390,7 +391,7 @@ public class DouYinCrawl implements CrawlStrategy { |
390 | 391 | videoPoolDao.saveAll(videoPoolList);// 将收集到的视频信息保存 |
391 | 392 | } else { |
392 | 393 | videoPoolDao.save(VideoPool.builder() |
393 | - .phoneNo(accountNo) | |
394 | + .accountNo(accountNo) | |
394 | 395 | .type(this.getType().getValue()) |
395 | 396 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
396 | 397 | .reportDate(new Date()) |
... | ... | @@ -449,7 +450,7 @@ public class DouYinCrawl implements CrawlStrategy { |
449 | 450 | .type(this.getType().getValue()) |
450 | 451 | .reportDate(new Date()) |
451 | 452 | .uploadTime(new Date()) |
452 | - .phoneNo(accountNo) | |
453 | + .accountNo(accountNo) | |
453 | 454 | .liveCnt(summarizeData.getInteger("yes_live_cnt")) |
454 | 455 | .liveDuration(summarizeData.getDouble("yes_live_duration")) |
455 | 456 | .watchTimesCnt(summarizeData.getInteger("yes_watch_cnt")) |
... | ... | @@ -514,7 +515,7 @@ public class DouYinCrawl implements CrawlStrategy { |
514 | 515 | log.info(LocalDate.now() + " 暂未找到账户号为:" + accountNo + "的抖音直播数据"); |
515 | 516 | final LivePool nullLive = LivePool.builder() |
516 | 517 | .type(this.getType().getValue()) |
517 | - .phoneNo(accountNo) | |
518 | + .accountNo(accountNo) | |
518 | 519 | .reportDate(new Date()) |
519 | 520 | .build(); |
520 | 521 | livePoolDao.save(nullLive); |
... | ... | @@ -567,7 +568,7 @@ public class DouYinCrawl implements CrawlStrategy { |
567 | 568 | */ |
568 | 569 | livePoolList.add(LivePool.builder() |
569 | 570 | .type(this.getType().getValue()) |
570 | - .phoneNo(accountNo) | |
571 | + .accountNo(accountNo) | |
571 | 572 | .reportDate(new Date()) |
572 | 573 | .commentUserCnt(Optional.ofNullable(obj.getInteger("comment_ucnt")).orElse(0))// 评论人数 |
573 | 574 | .consumeUserCnt(Optional.ofNullable(obj.getInteger("consume_ucnt")).orElse(0))// 付费人数 |
... | ... | @@ -613,7 +614,7 @@ public class DouYinCrawl implements CrawlStrategy { |
613 | 614 | } else { |
614 | 615 | livePoolDao.save(LivePool.builder() |
615 | 616 | .type(this.getType().getValue()) |
616 | - .phoneNo(accountNo) | |
617 | + .accountNo(accountNo) | |
617 | 618 | .reportDate(new Date()) |
618 | 619 | .build()); |
619 | 620 | } |
... | ... | @@ -633,10 +634,10 @@ public class DouYinCrawl implements CrawlStrategy { |
633 | 634 | */ |
634 | 635 | @Override |
635 | 636 | @Transactional |
636 | - public Integer updateAccountFans(String accountNo) { | |
637 | - final Integer hasFoundFansCnt = common.getHasFoundFansCnt(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
638 | - if (Objects.nonNull(hasFoundFansCnt)) { | |
639 | - return hasFoundFansCnt; | |
637 | + public ReportAccountDto updateAccountMsg(String accountNo) { | |
638 | + final ReportAccountDto hasFoundAccountMsg = common.getHasFoundAccountMsg(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
639 | + if (Objects.nonNull(hasFoundAccountMsg)) { | |
640 | + return hasFoundAccountMsg; | |
640 | 641 | } |
641 | 642 | final String uuid = UUID.randomUUID().toString().replace("-", ""); |
642 | 643 | final WebDriver driver = this.getDYDriver(accountNo, uuid); |
... | ... | @@ -678,9 +679,9 @@ public class DouYinCrawl implements CrawlStrategy { |
678 | 679 | // 读http日志, 处理数据 |
679 | 680 | final List<ResponseReceived> responseReceivedEvents = common.processHttpTransferData(driver); |
680 | 681 | String dataUrl = "https://creator.douyin.com/web/api/media/user/info";// 数据接口地址 |
681 | - final Integer[] fansCnt = new Integer[1]; | |
682 | + AtomicReference<ReportAccountDto> reportAccountDto = new AtomicReference<>(); | |
682 | 683 | responseReceivedEvents.forEach(item -> { |
683 | - JSONObject userInfo; | |
684 | + JSONObject data; | |
684 | 685 | try { |
685 | 686 | final HttpResponse response = common.getHttpResponse(driver, item, dataUrl); |
686 | 687 | if (Objects.nonNull(response)) { |
... | ... | @@ -690,26 +691,32 @@ public class DouYinCrawl implements CrawlStrategy { |
690 | 691 | if (Objects.isNull(body)) { |
691 | 692 | return; |
692 | 693 | } |
693 | - userInfo = body.getJSONObject("user"); | |
694 | - if (Objects.isNull(userInfo)) { | |
694 | + data = body.getJSONObject("user"); | |
695 | + if (Objects.isNull(data)) { | |
695 | 696 | return; |
696 | 697 | } |
697 | - fansCnt[0] = userInfo.getInteger("follower_count"); | |
698 | - final Account account = accountDao.findByPhoneNoAndType(accountNo, this.getType().getValue()); | |
699 | - if (Objects.nonNull(fansCnt[0])) { | |
700 | - if (Objects.nonNull(account)) { | |
701 | - accountDao.updateFans(account.getId(), fansCnt[0], new Date()); | |
702 | - } else { | |
703 | - accountDao.save(Account.builder() | |
704 | - .cookiesStatus(true) | |
705 | - .phoneNo(accountNo) | |
706 | - .type(this.getType().getValue()) | |
707 | - .fansCnt(fansCnt[0]) | |
708 | - .reportDate(new Date()) | |
709 | - .done(false) | |
710 | - .build()); | |
711 | - } | |
712 | - } | |
698 | + reportAccountDto.set(ReportAccountDto.builder() | |
699 | + .fansCnt(data.getInteger("follower_count")) | |
700 | + .followCnt(data.getInteger("following_count")) | |
701 | + .likeCnt(data.getInteger("total_favorited")) | |
702 | + .accountId(data.getString("unique_id")) | |
703 | + .userOtherId(data.getString("uid")) | |
704 | + .accountName(data.getString("nickname")) | |
705 | + .build() | |
706 | + ); | |
707 | + final Account account = accountDao.findByAccountNoAndType(accountNo, this.getType().getValue()); | |
708 | + if (Objects.nonNull(account)) | |
709 | + accountDao.updateMsg(account.getId(), reportAccountDto.get().getAccountName(), reportAccountDto.get().getFansCnt(), new Date()); | |
710 | + else | |
711 | + accountDao.save(Account.builder() | |
712 | + .cookiesStatus(true) | |
713 | + .accountNo(accountNo) | |
714 | + .type(this.getType().getValue()) | |
715 | + .fansCnt(reportAccountDto.get().getFansCnt()) | |
716 | + .accountName(reportAccountDto.get().getAccountName()) | |
717 | + .reportDate(new Date()) | |
718 | + .done(false) | |
719 | + .build()); | |
713 | 720 | } |
714 | 721 | } catch (Exception e) { |
715 | 722 | this.exitBrowser(accountNo, uuid); |
... | ... | @@ -718,7 +725,7 @@ public class DouYinCrawl implements CrawlStrategy { |
718 | 725 | } |
719 | 726 | }); |
720 | 727 | this.exitBrowser(accountNo, uuid); |
721 | - return fansCnt[0]; | |
728 | + return reportAccountDto.get(); | |
722 | 729 | } |
723 | 730 | |
724 | 731 | /** | ... | ... |
src/main/java/cn/fw/freya/service/crawl/impl/KuaiShouCrawl.java
... | ... | @@ -12,6 +12,7 @@ import cn.fw.freya.model.data.FwCookie; |
12 | 12 | import cn.fw.freya.model.data.ResponseReceived; |
13 | 13 | import cn.fw.freya.model.data.pool.LivePool; |
14 | 14 | import cn.fw.freya.model.data.pool.VideoPool; |
15 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
15 | 16 | import cn.fw.freya.service.crawl.CrawlStrategy; |
16 | 17 | import cn.fw.freya.service.data.AccountService; |
17 | 18 | import cn.fw.freya.utils.DateUtil; |
... | ... | @@ -30,20 +31,29 @@ import lombok.RequiredArgsConstructor; |
30 | 31 | import lombok.extern.slf4j.Slf4j; |
31 | 32 | import org.apache.http.client.CookieStore; |
32 | 33 | import org.apache.http.impl.client.BasicCookieStore; |
34 | +import org.apache.logging.log4j.util.PropertiesUtil; | |
33 | 35 | import org.openqa.selenium.By; |
34 | 36 | import org.openqa.selenium.Cookie; |
35 | 37 | import org.openqa.selenium.WebDriver; |
36 | 38 | import org.openqa.selenium.WebElement; |
37 | 39 | import org.openqa.selenium.support.ui.WebDriverWait; |
40 | +import org.springframework.context.SmartLifecycle; | |
41 | +import org.springframework.core.io.ClassPathResource; | |
42 | +import org.springframework.core.io.support.PropertiesLoaderUtils; | |
38 | 43 | import org.springframework.stereotype.Service; |
39 | 44 | import org.springframework.transaction.annotation.Transactional; |
40 | 45 | import org.springframework.util.CollectionUtils; |
41 | 46 | import org.springframework.util.StringUtils; |
42 | 47 | |
43 | 48 | import javax.annotation.Resource; |
49 | +import java.io.BufferedWriter; | |
50 | +import java.io.FileOutputStream; | |
44 | 51 | import java.io.IOException; |
52 | +import java.io.OutputStreamWriter; | |
45 | 53 | import java.math.BigDecimal; |
46 | 54 | import java.math.RoundingMode; |
55 | +import java.net.URLDecoder; | |
56 | +import java.nio.charset.StandardCharsets; | |
47 | 57 | import java.time.LocalDate; |
48 | 58 | import java.time.LocalDateTime; |
49 | 59 | import java.util.*; |
... | ... | @@ -62,8 +72,9 @@ import java.util.stream.Collectors; |
62 | 72 | @Service |
63 | 73 | @RequiredArgsConstructor |
64 | 74 | @SuppressWarnings("Duplicates") |
65 | -public class KuaiShouCrawl implements CrawlStrategy { | |
75 | +public class KuaiShouCrawl implements CrawlStrategy, SmartLifecycle { | |
66 | 76 | |
77 | + private boolean isRunning = false; | |
67 | 78 | private final VideoPoolDao videoPoolDao; |
68 | 79 | private final LivePoolDao livePoolDao; |
69 | 80 | private final AccountDao accountDao; |
... | ... | @@ -89,25 +100,46 @@ public class KuaiShouCrawl implements CrawlStrategy { |
89 | 100 | final List<Account> accountList = accountDao.getAllKSAccount(); |
90 | 101 | accountList.forEach(item -> |
91 | 102 | Arrays.stream(DataTypeEnum.values()).forEach(item1 -> |
92 | - threadPoolExecutor.execute(() -> { | |
93 | - final String accountNo = item.getPhoneNo(); | |
94 | - final Integer typeValue = item1.getValue(); | |
95 | - String key = accountNo + "#" + typeValue; | |
96 | - final String ns_sig3 = this.getNS_sig3(accountNo, typeValue); | |
97 | - if (Objects.nonNull(ns_sig3)) | |
98 | - sig3Map.put(key, ns_sig3); | |
99 | - }) | |
103 | + threadPoolExecutor.execute(() -> this.task(item.getAccountNo(), item1.getValue())) | |
100 | 104 | ) |
101 | 105 | ); |
102 | 106 | return true; |
103 | 107 | } |
104 | 108 | |
109 | + /** | |
110 | + * 获取类型签名task | |
111 | + * | |
112 | + * @param accountNo 账户号 | |
113 | + * @param dataType 数据类型 | |
114 | + */ | |
115 | + public void task(String accountNo, Integer dataType) { | |
116 | + String key = accountNo + "#" + dataType; | |
117 | + final String ns_sig3 = this.getNS_sig3(accountNo, dataType, true); | |
118 | + if (Objects.nonNull(ns_sig3)) | |
119 | + sig3Map.put(key, ns_sig3); | |
120 | + } | |
121 | + | |
122 | + /** | |
123 | + * 停止设置sig3Map线程池 | |
124 | + * | |
125 | + * @return | |
126 | + */ | |
105 | 127 | public boolean stopSetSig3Map() { |
106 | 128 | threadPoolExecutor.shutdownNow(); |
107 | 129 | return true; |
108 | 130 | } |
109 | 131 | |
110 | 132 | /** |
133 | + * 清空sig3Map | |
134 | + * | |
135 | + * @return | |
136 | + */ | |
137 | + public boolean cleanSig3Map() { | |
138 | + sig3Map.clear(); | |
139 | + return true; | |
140 | + } | |
141 | + | |
142 | + /** | |
111 | 143 | * 获取sig3Map |
112 | 144 | */ |
113 | 145 | public String getSig3Map() { |
... | ... | @@ -117,8 +149,13 @@ public class KuaiShouCrawl implements CrawlStrategy { |
117 | 149 | /** |
118 | 150 | * 设置sig3Map |
119 | 151 | */ |
120 | - public boolean setMapFromString(String jsonStr) { | |
121 | - HashMap<String, String> map = JSON.parseObject(JSON.parseObject(jsonStr).getString("jsonStr"), new TypeReference<>() { | |
152 | + public boolean setMapFromString(String jsonStr, boolean interior) { | |
153 | + String jsonString; | |
154 | + if (interior) | |
155 | + jsonString = jsonStr; | |
156 | + else | |
157 | + jsonString = JSON.parseObject(jsonStr).getString("jsonStr"); | |
158 | + HashMap<String, String> map = JSON.parseObject(jsonString, new TypeReference<>() { | |
122 | 159 | }, Feature.OrderedField); |
123 | 160 | map.forEach(sig3Map::put); |
124 | 161 | return true; |
... | ... | @@ -215,7 +252,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
215 | 252 | CookieStore cookieStore = new BasicCookieStore(); |
216 | 253 | cookies.setCookieStore(cookieStore); |
217 | 254 | Date previousDay = DateUtil.getPreviousDay(new Date()); |
218 | - final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.VIDEO.getValue()); | |
255 | + final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.VIDEO.getValue(), false); | |
219 | 256 | if (Objects.isNull(ns_sig3)) |
220 | 257 | return null; |
221 | 258 | Map<String, Object> params = new LinkedHashMap<>(); |
... | ... | @@ -243,8 +280,12 @@ public class KuaiShouCrawl implements CrawlStrategy { |
243 | 280 | if (!StringUtils.hasText(res)) { |
244 | 281 | throw new BusinessException("调用快手[视频]接口失败"); |
245 | 282 | } |
283 | + if (Objects.equals(response.getInteger("result"), 500002)) { | |
284 | + threadPoolExecutor.execute(() -> this.task(accountNo, DataTypeEnum.VIDEO.getValue())); | |
285 | + throw new BusinessException("获取数据失败, 尝试重新获取sig3签名信息"); | |
286 | + } | |
246 | 287 | JSONArray videoJsonArray = Optional.ofNullable(Optional.ofNullable(response.getJSONObject("data")).orElse(new JSONObject()).getJSONArray("photoList")).orElse(new JSONArray()); |
247 | - videoPoolDao.deleteByPhoneNoAndDate(accountNo, previousDay, AccountTypeEnum.KS.getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
288 | + videoPoolDao.deleteByAccountNoAndDate(accountNo, previousDay, AccountTypeEnum.KS.getValue(), ResourceTypeEnum.VIDEO.getValue()); | |
248 | 289 | // 视频数据存库 |
249 | 290 | List<VideoPool> videoPoolList = new ArrayList<>(videoJsonArray.size()); |
250 | 291 | videoJsonArray.forEach(item -> { |
... | ... | @@ -286,7 +327,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
286 | 327 | .playCount(Optional.ofNullable(obj.getInteger("playCount")).orElse(0))// |
287 | 328 | .likeCount(Optional.ofNullable(obj.getInteger("likeCount")).orElse(0))// |
288 | 329 | .commentCount(Optional.ofNullable(obj.getInteger("commentCount")).orElse(0))// |
289 | - .phoneNo(accountNo) | |
330 | + .accountNo(accountNo) | |
290 | 331 | .reportDate(new Date()) |
291 | 332 | .publishTime(PublicUtil.parseDate(obj.getString("publishTime")))// |
292 | 333 | .videoUrl("https://www.kuaishou.com/short-video/" + obj.getString("workId")) |
... | ... | @@ -305,7 +346,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
305 | 346 | videoPoolDao.saveAll(videoPoolList);// 将收集到的视频信息保存 |
306 | 347 | } else { |
307 | 348 | final VideoPool nullVideo = VideoPool.builder() |
308 | - .phoneNo(accountNo) | |
349 | + .accountNo(accountNo) | |
309 | 350 | .type(this.getType().getValue()) |
310 | 351 | .resourceType(ResourceTypeEnum.VIDEO.getValue()) |
311 | 352 | .reportDate(new Date()) |
... | ... | @@ -341,7 +382,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
341 | 382 | Date endTime = DateUtil.getThisDayMaxTime(previousDay); |
342 | 383 | Date startTime = DateUtil.getThisDayMinTime(previousDay); |
343 | 384 | //Date startTime = DateUtil.getThisDayMinTime(new Date(previousDay.getTime() - 7 * 24 * 3600 * 1000L));// 补数据使用 |
344 | - final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.LIVE.getValue()); | |
385 | + final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.LIVE.getValue(), false); | |
345 | 386 | if (Objects.isNull(ns_sig3)) |
346 | 387 | return null; |
347 | 388 | Map<String, Object> params = new LinkedHashMap<>(); |
... | ... | @@ -371,6 +412,10 @@ public class KuaiShouCrawl implements CrawlStrategy { |
371 | 412 | if (!StringUtils.hasText(res)) { |
372 | 413 | throw new BusinessException("调用快手[视频]接口失败"); |
373 | 414 | } |
415 | + if (Objects.equals(response.getInteger("result"), 500002)) { | |
416 | + threadPoolExecutor.execute(() -> this.task(accountNo, DataTypeEnum.LIVE.getValue())); | |
417 | + throw new BusinessException("获取数据失败, 尝试重新获取sig3签名信息"); | |
418 | + } | |
374 | 419 | JSONObject dataJSONObject = response.getJSONObject("data"); |
375 | 420 | JSONArray dataJSONArray = dataJSONObject.getJSONArray("details"); |
376 | 421 | /*List<JSONObject> collect = new ArrayList<>(); |
... | ... | @@ -424,49 +469,9 @@ public class KuaiShouCrawl implements CrawlStrategy { |
424 | 469 | * userHead: "https://tx2.a.kwimgs.com/uhead/AB/2021/11/11/12/BMjAyMTExMTExMjUwMzZfMjU2MTc2NDMyMV8xX2hkMjg5XzMyOA==_s.jpg" |
425 | 470 | * -userName: "长安汽车。小明聊聊车" |
426 | 471 | */ |
427 | - /*String coverUrl = obj.getString("liveCover");// 直播封面地址 | |
428 | - String playbackUrl = null; | |
429 | - final Double liveDuration = obj.getDouble("liveDuration");// 数据接口返回直播时长 | |
430 | - final Long liveStartTimeStamp = obj.getLong("liveTime");// 数据接口返回开播时间戳 | |
431 | - if (liveDuration >= 60) {// 直播时长大于等于60分钟才记录回放信息 | |
432 | - if (!CollectionUtils.isEmpty(finalCollect)) { | |
433 | - JSONObject playbackMsg; | |
434 | - if (Objects.equals(finalCollect.size(), 1) && Objects.equals(dataJSONArray.size(), 1)) { | |
435 | - playbackMsg = finalCollect.get(0); | |
436 | - Double duration = playbackMsg.getDouble("duration");// 回放信息返回直播时长 | |
437 | - final Long startTimeStamp = playbackMsg.getLong("startTime");// 回放信息返回直播开始时间戳 | |
438 | - final double timeSubAbs = Math.abs(liveDuration - duration); | |
439 | - final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue(); | |
440 | - // (Objects.equals(liveDuration, duration) || (timeSubAbs < 5))->说明时长几乎相等 | |
441 | - // (liveStartSub < 2)->说明开播时间几乎一样 | |
442 | - if (!((Objects.equals(liveDuration, duration) || (timeSubAbs < 5)) && liveStartSub < 10)) { | |
443 | - playbackMsg = null; | |
444 | - log.info(String.format("%s [%s]平台账户号为: %s的直播回放数据不匹配!!!", LocalDateTime.now(), this.getType().getName(), accountNo)); | |
445 | - } | |
446 | - } else { | |
447 | - List<JSONObject> collect1 = finalCollect.stream().filter(item1 -> { | |
448 | - Double duration = item1.getDouble("duration"); | |
449 | - final Long startTimeStamp = item1.getLong("startTime");// 回放信息返回直播开始时间戳 | |
450 | - final double timeSubAbs = Math.abs(liveDuration - duration); | |
451 | - final double liveStartSub = BigDecimal.valueOf(Math.abs(liveStartTimeStamp - startTimeStamp)).divide(BigDecimal.valueOf(60 * 1000), 1, RoundingMode.HALF_UP).doubleValue(); | |
452 | - return (Objects.equals(liveDuration, duration) || timeSubAbs < 5) && liveStartSub < 10; | |
453 | - }).collect(Collectors.toList()); | |
454 | - if (Objects.equals(collect1.size(), 1)) { | |
455 | - playbackMsg = collect1.get(0); | |
456 | - } else { | |
457 | - playbackMsg = null; | |
458 | - log.info(String.format("%s [%s]平台账户号为: %s的直播找到多条回放数据!!!", LocalDateTime.now(), this.getType().getName(), accountNo)); | |
459 | - } | |
460 | - } | |
461 | - if (Objects.nonNull(playbackMsg)) { | |
462 | - coverUrl = playbackMsg.getString("coverUrl"); | |
463 | - playbackUrl = this.playbackBaseUrl + playbackMsg.getString("productId"); | |
464 | - } | |
465 | - } | |
466 | - }*/ | |
467 | 472 | livePoolList.add(LivePool.builder() |
468 | 473 | .type(this.getType().getValue()) |
469 | - .phoneNo(accountNo) | |
474 | + .accountNo(accountNo) | |
470 | 475 | .reportDate(new Date()) |
471 | 476 | .commentUserCnt(Optional.ofNullable(obj.getInteger("commentUv")).orElse(0)) |
472 | 477 | .consumeUserCnt(Optional.ofNullable(obj.getInteger("sendGiftUv")).orElse(0)) |
... | ... | @@ -499,7 +504,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
499 | 504 | log.info(LocalDate.now() + " 暂未找到账户号为:" + accountNo + "的快手直播数据"); |
500 | 505 | final LivePool nullLive = LivePool.builder() |
501 | 506 | .type(this.getType().getValue()) |
502 | - .phoneNo(accountNo) | |
507 | + .accountNo(accountNo) | |
503 | 508 | .reportDate(new Date()) |
504 | 509 | .build(); |
505 | 510 | livePoolDao.save(nullLive); |
... | ... | @@ -517,7 +522,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
517 | 522 | object.put("playbackUrl", null); |
518 | 523 | if (CollectionUtils.isEmpty(collect)) |
519 | 524 | return object; |
520 | - final String accountNo = dbLive.getPhoneNo(); | |
525 | + final String accountNo = dbLive.getAccountNo(); | |
521 | 526 | final Double liveDuration = dbLive.getDuration();// 数据接口返回直播时长 |
522 | 527 | final Long liveStartTimeStamp = dbLive.getOpenTime().getTime();// 数据接口返回开播时间戳 |
523 | 528 | if (liveDuration >= durationThreshold) {// 直播时长大于等于durationThreshold指定的分钟才记录回放信息 |
... | ... | @@ -565,8 +570,8 @@ public class KuaiShouCrawl implements CrawlStrategy { |
565 | 570 | JSONArray objects = new JSONArray(); |
566 | 571 | if (Objects.isNull(searchKey)) |
567 | 572 | return objects; |
568 | - Map<String, Object> params = new HashMap<>(); | |
569 | - Map<String, Object> params1 = new HashMap<>(); | |
573 | + Map<String, Object> params = new LinkedHashMap<>(); | |
574 | + Map<String, Object> params1 = new LinkedHashMap<>(); | |
570 | 575 | params1.put("principalId", searchKey); |
571 | 576 | params1.put("pcursor", ""); |
572 | 577 | params1.put("count", 150); |
... | ... | @@ -610,17 +615,17 @@ public class KuaiShouCrawl implements CrawlStrategy { |
610 | 615 | */ |
611 | 616 | @Override |
612 | 617 | @Transactional |
613 | - public Integer updateAccountFans(String accountNo) throws IOException { | |
614 | - final Integer hasFoundFansCnt = common.getHasFoundFansCnt(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
615 | - if (Objects.nonNull(hasFoundFansCnt)) { | |
616 | - //return hasFoundFansCnt; | |
618 | + public ReportAccountDto updateAccountMsg(String accountNo) throws IOException { | |
619 | + final ReportAccountDto hasFoundAccountMsg = common.getHasFoundAccountMsg(accountNo, this.getType().getValue(), DateUtil.getThisDayMinTime(new Date())); | |
620 | + if (Objects.nonNull(hasFoundAccountMsg)) { | |
621 | + return hasFoundAccountMsg; | |
617 | 622 | } |
618 | 623 | HttpCookies cookies = HttpCookies.custom(); |
619 | 624 | CookieStore cookieStore = new BasicCookieStore(); |
620 | 625 | cookies.setCookieStore(cookieStore); |
621 | 626 | Map<String, Object> params = new HashMap<>(); |
622 | 627 | params.put("kuaishou.web.cp.api_ph", this.getWebApiPh(accountNo)); |
623 | - final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.FANS.getValue()); | |
628 | + final String ns_sig3 = this.getNS_sig3(accountNo, DataTypeEnum.FANS.getValue(), false); | |
624 | 629 | if (Objects.isNull(ns_sig3)) |
625 | 630 | return null; |
626 | 631 | HttpConfig config = HttpConfig.custom() |
... | ... | @@ -643,24 +648,33 @@ public class KuaiShouCrawl implements CrawlStrategy { |
643 | 648 | if (!StringUtils.hasText(res)) { |
644 | 649 | throw new BusinessException("调用快手[直播]接口失败"); |
645 | 650 | } |
646 | - Integer fansNum; | |
647 | - if (Objects.equals(response.getInteger("result"), 500002)) | |
648 | - fansNum = 0; | |
649 | - else | |
650 | - fansNum = response.getJSONObject("data").getInteger("fansCnt"); | |
651 | - final Account account = accountDao.findByPhoneNoAndType(accountNo, this.getType().getValue()); | |
651 | + if (Objects.equals(response.getInteger("result"), 500002)) { | |
652 | + threadPoolExecutor.execute(() -> this.task(accountNo, DataTypeEnum.FANS.getValue())); | |
653 | + throw new BusinessException("获取数据失败, 尝试重新获取sig3签名信息"); | |
654 | + } | |
655 | + JSONObject data = response.getJSONObject("data"); | |
656 | + ReportAccountDto reportAccountDto = ReportAccountDto.builder() | |
657 | + .fansCnt(data.getInteger("fansCnt")) | |
658 | + .followCnt(data.getInteger("followCnt")) | |
659 | + .likeCnt(data.getInteger("likeCnt")) | |
660 | + .accountId(data.getString("userId")) | |
661 | + .userOtherId(data.getString("userKwaiId")) | |
662 | + .accountName(data.getString("userName")) | |
663 | + .build(); | |
664 | + final Account account = accountDao.findByAccountNoAndType(accountNo, this.getType().getValue()); | |
652 | 665 | if (Objects.nonNull(account)) |
653 | - accountDao.updateFans(account.getId(), fansNum, new Date()); | |
666 | + accountDao.updateMsg(account.getId(), reportAccountDto.getAccountName(), reportAccountDto.getFansCnt(), new Date()); | |
654 | 667 | else |
655 | 668 | accountDao.save(Account.builder() |
656 | 669 | .cookiesStatus(true) |
657 | - .phoneNo(accountNo) | |
670 | + .accountNo(accountNo) | |
658 | 671 | .type(this.getType().getValue()) |
659 | - .fansCnt(Optional.ofNullable(response.getJSONObject("data")).orElse(new JSONObject().fluentPut("fansCnt", 0)).getInteger("fansCnt")) | |
672 | + .fansCnt(reportAccountDto.getFansCnt()) | |
673 | + .accountName(reportAccountDto.getAccountName()) | |
660 | 674 | .reportDate(new Date()) |
661 | 675 | .done(false) |
662 | 676 | .build()); |
663 | - return Optional.ofNullable(response.getJSONObject("data")).orElse(new JSONObject().fluentPut("fansCnt", 0)).getInteger("fansCnt"); | |
677 | + return reportAccountDto; | |
664 | 678 | } |
665 | 679 | |
666 | 680 | /** |
... | ... | @@ -700,12 +714,16 @@ public class KuaiShouCrawl implements CrawlStrategy { |
700 | 714 | * |
701 | 715 | * @param accountNo 快手账户号 |
702 | 716 | * @param type 密钥类型(1:粉丝, 2:短视频, 3:直播) |
717 | + * @param retryGet 是否重新获取 | |
703 | 718 | */ |
704 | - public String getNS_sig3(String accountNo, Integer type) { | |
719 | + public String getNS_sig3(String accountNo, Integer type, boolean retryGet) { | |
705 | 720 | final String key = accountNo + "#" + type; |
706 | - String NS_sig3 = sig3Map.get(key); | |
707 | - if (StringUtils.hasText(NS_sig3)) | |
708 | - return NS_sig3; | |
721 | + String NS_sig3; | |
722 | + if (!retryGet) { | |
723 | + NS_sig3 = sig3Map.get(key); | |
724 | + if (StringUtils.hasText(NS_sig3)) | |
725 | + return NS_sig3; | |
726 | + } | |
709 | 727 | final String uuid = UUID.randomUUID().toString().replace("-", ""); |
710 | 728 | final WebDriver driver = this.getKSDriver(accountNo, uuid); |
711 | 729 | String targetUrl = null; |
... | ... | @@ -852,7 +870,7 @@ public class KuaiShouCrawl implements CrawlStrategy { |
852 | 870 | * @return |
853 | 871 | */ |
854 | 872 | public String getRandomUserCookies() { |
855 | - final List<FwCookie> cookies = common.loadCookie(common.getRandomUserByType(this.getType().getValue()).getPhoneNo(), this.getType().getValue()); | |
873 | + final List<FwCookie> cookies = common.loadCookie(common.getRandomUserByType(this.getType().getValue()).getAccountNo(), this.getType().getValue()); | |
856 | 874 | StringBuffer sb = new StringBuffer(); |
857 | 875 | sb.append("clientid=3;"); |
858 | 876 | cookies.forEach(item -> { |
... | ... | @@ -903,4 +921,78 @@ public class KuaiShouCrawl implements CrawlStrategy { |
903 | 921 | return true; |
904 | 922 | } |
905 | 923 | |
924 | + @Override | |
925 | + public int getPhase() { | |
926 | + return 1;// 默认为0 | |
927 | + } | |
928 | + | |
929 | + @Override | |
930 | + public boolean isAutoStartup() { | |
931 | + return true;// 默认为false | |
932 | + } | |
933 | + | |
934 | + @Override | |
935 | + public void stop(Runnable callback) { | |
936 | + log.info("springIOC停止, 将签名信息从Map中导出到配置文件"); | |
937 | + callback.run(); | |
938 | + isRunning = false; | |
939 | + final HashMap<String, String> props = new HashMap<>(); | |
940 | + props.put("KSAccountNS_sig", JSON.toJSONString(sig3Map)); | |
941 | + updateProperties("NS_sig3Msg.properties", props); | |
942 | + } | |
943 | + | |
944 | + @Override | |
945 | + public void start() { | |
946 | + log.info("springIOC启动, 将签名信息从配置文件读出并导入到Map中"); | |
947 | + isRunning = true; | |
948 | + Properties props; | |
949 | + try { | |
950 | + props = PropertiesLoaderUtils.loadAllProperties("NS_sig3Msg.properties"); | |
951 | + for (Object key : props.keySet()) { | |
952 | + if (Objects.equals(key, "KSAccountNS_sig")) | |
953 | + this.setMapFromString(props.get(key).toString(), true); | |
954 | + } | |
955 | + } catch (IOException e) { | |
956 | + log.error(e.getMessage()); | |
957 | + } | |
958 | + } | |
959 | + | |
960 | + @Override | |
961 | + public void stop() { | |
962 | + log.info("stop"); | |
963 | + isRunning = false; | |
964 | + } | |
965 | + | |
966 | + @Override | |
967 | + public boolean isRunning() { | |
968 | + return isRunning; | |
969 | + } | |
970 | + | |
971 | + public void updateProperties(String fileName, Map<String, String> keyValueMap) { | |
972 | + String filePath = Objects.requireNonNull(PropertiesUtil.class.getClassLoader().getResource(fileName)).getFile(); | |
973 | + Properties props; | |
974 | + BufferedWriter bw = null; | |
975 | + try { | |
976 | + filePath = URLDecoder.decode(filePath, StandardCharsets.UTF_8); | |
977 | + log.debug("updateProperties propertiesPath:" + filePath); | |
978 | + props = PropertiesLoaderUtils.loadProperties(new ClassPathResource(fileName)); | |
979 | + log.debug("updateProperties old:" + props); | |
980 | + bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath)));// 写入属性文件 | |
981 | + //props.clear();// 清空旧的文件 | |
982 | + for (String key : keyValueMap.keySet()) { | |
983 | + props.setProperty(key, keyValueMap.get(key)); | |
984 | + } | |
985 | + log.debug("updateProperties new:" + props); | |
986 | + props.store(bw, ""); | |
987 | + } catch (IOException e) { | |
988 | + log.error(e.getMessage()); | |
989 | + } finally { | |
990 | + try { | |
991 | + assert bw != null; | |
992 | + bw.close(); | |
993 | + } catch (IOException e) { | |
994 | + e.printStackTrace(); | |
995 | + } | |
996 | + } | |
997 | + } | |
906 | 998 | } | ... | ... |
src/main/java/cn/fw/freya/service/rpc/AccountRpcService.java
... | ... | @@ -35,13 +35,13 @@ public class AccountRpcService { |
35 | 35 | /** |
36 | 36 | * 账号cookie失效, 上报服务器 |
37 | 37 | * |
38 | - * @param phoneNo 账号 | |
39 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
38 | + * @param accountNo 账号 | |
39 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
40 | 40 | * @return 结果 |
41 | 41 | */ |
42 | - public boolean pushExpireAccount(String phoneNo, Integer type) { | |
42 | + public boolean pushExpireAccount(String accountNo, Integer type) { | |
43 | 43 | Map<String, Object> params = new HashMap<>(); |
44 | - params.put("account", phoneNo); | |
44 | + params.put("account", accountNo); | |
45 | 45 | params.put("type", type); |
46 | 46 | HttpConfig config = HttpConfig.custom() |
47 | 47 | .url(getBaseUrl() + PathConstant.EXPIRE_ACCOUNT) |
... | ... | @@ -55,7 +55,7 @@ public class AccountRpcService { |
55 | 55 | String message = Optional.ofNullable(resObj.getString("message")).orElse("账号cookie失效上报失败"); |
56 | 56 | throw new BusinessException(status, message); |
57 | 57 | } |
58 | - accountService.updateAccountCookiesStatus(phoneNo, type, false); | |
58 | + accountService.updateAccountCookiesStatus(accountNo, type, false); | |
59 | 59 | return true; |
60 | 60 | } |
61 | 61 | |
... | ... | @@ -86,7 +86,7 @@ public class AccountRpcService { |
86 | 86 | jsonArray.forEach(item -> { |
87 | 87 | final JSONObject obj = (JSONObject) item; |
88 | 88 | final AccountDto dto = new AccountDto(); |
89 | - dto.setPhoneNo(obj.getString("account")); | |
89 | + dto.setAccountNo(obj.getString("account")); | |
90 | 90 | dto.setPlaybackSearchKey(obj.getString("playbackSearchKey")); |
91 | 91 | dto.setGroupId(obj.getLong("groupId")); |
92 | 92 | list.add(dto); | ... | ... |
src/main/java/cn/fw/freya/service/rpc/ReportRpcService.java
... | ... | @@ -4,6 +4,7 @@ import cn.fw.freya.common.PathConstant; |
4 | 4 | import cn.fw.freya.model.data.pool.LivePool; |
5 | 5 | import cn.fw.freya.model.data.pool.VideoPool; |
6 | 6 | import cn.fw.freya.model.dto.rpc.LivePoolDto; |
7 | +import cn.fw.freya.model.dto.rpc.ReportAccountDto; | |
7 | 8 | import cn.fw.freya.model.dto.rpc.VideoPoolDto; |
8 | 9 | import cn.fw.freya.utils.RequestUtil; |
9 | 10 | import cn.fw.freya.utils.http.HttpConfig; |
... | ... | @@ -32,18 +33,19 @@ public class ReportRpcService { |
32 | 33 | private String baseUrl; |
33 | 34 | |
34 | 35 | /** |
35 | - * 账号粉丝数上报 | |
36 | + * 账户信息上报 | |
36 | 37 | * |
37 | - * @param accountNo 账户号 | |
38 | - * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
39 | - * @param fans 粉丝数 | |
38 | + * @param accountNo 账户号 | |
39 | + * @param type 账户类型(1:快手, 2:抖音, 3:懂车帝, 4:Bilibili) | |
40 | + * @param accountMsg 账户信息 | |
40 | 41 | * @return |
41 | 42 | */ |
42 | - public boolean reportFansCnt(String accountNo, Integer type, Integer fans) { | |
43 | + public boolean reportAccountMsg(String accountNo, Integer type, ReportAccountDto accountMsg) { | |
43 | 44 | Map<String, Object> params = new HashMap<>(); |
44 | 45 | params.put("account", accountNo); |
45 | 46 | params.put("type", type); |
46 | - params.put("fans", fans); | |
47 | + params.put("fans", accountMsg.getFansCnt()); | |
48 | + params.put("accountName", accountMsg.getAccountName()); | |
47 | 49 | HttpConfig config = HttpConfig.custom() |
48 | 50 | .encoding(java.nio.charset.StandardCharsets.UTF_8.displayName()) |
49 | 51 | .url(getBaseUrl() + PathConstant.REPORT_FANS) | ... | ... |
src/main/java/cn/fw/freya/task/DataCaptureTask.java
... | ... | @@ -16,7 +16,6 @@ import com.alibaba.fastjson.JSONObject; |
16 | 16 | import lombok.RequiredArgsConstructor; |
17 | 17 | import lombok.extern.slf4j.Slf4j; |
18 | 18 | import org.springframework.context.ApplicationEventPublisher; |
19 | -import org.springframework.scheduling.annotation.Scheduled; | |
20 | 19 | import org.springframework.stereotype.Component; |
21 | 20 | import org.springframework.util.CollectionUtils; |
22 | 21 | |
... | ... | @@ -51,7 +50,7 @@ public class DataCaptureTask { |
51 | 50 | /** |
52 | 51 | * 每分钟执行多线程同时抓取数据 |
53 | 52 | */ |
54 | - @Scheduled(cron = "0 0/1 * * * ?") | |
53 | + //@Scheduled(cron = "0 0/1 * * * ?") | |
55 | 54 | public void capture() { |
56 | 55 | final ThreadPoolExecutor threadPoolExecutor = ThreadPoolUtil.getThreadPool(); |
57 | 56 | BlockingQueue<Runnable> queue = threadPoolExecutor.getQueue();// 获取工作队列 |
... | ... | @@ -78,11 +77,11 @@ public class DataCaptureTask { |
78 | 77 | }); |
79 | 78 | final Integer accountType = currentAccount.getType();// 当前账户类型 |
80 | 79 | final Integer nextAccountType = Optional.ofNullable(nextAccount.getType()).orElse(-1);// 下一个账户类型 |
81 | - final String nextAccountNo = Optional.ofNullable(nextAccount.getPhoneNo()).orElse("");// 下一个账户号 | |
80 | + final String nextAccountNo = Optional.ofNullable(nextAccount.getAccountNo()).orElse("");// 下一个账户号 | |
82 | 81 | final Date todayDayMinTime = DateUtil.getThisDayMinTime(new Date()); |
83 | 82 | if (accountType.equals(2) && nextAccountType.equals(2)) { |
84 | 83 | if (!Objects.equals(nextAccountNo, "") && !Objects.equals(nextAccountType, -1) && |
85 | - (Objects.nonNull(common.getHasFoundFansCnt(nextAccountNo, 2, todayDayMinTime)) && | |
84 | + (Objects.nonNull(common.getHasFoundAccountMsg(nextAccountNo, 2, todayDayMinTime)) && | |
86 | 85 | Objects.nonNull(common.getHasFoundVideo(nextAccountNo, 2, todayDayMinTime)) && |
87 | 86 | Objects.nonNull(common.getHasFoundLive(nextAccountNo, 2, todayDayMinTime)) |
88 | 87 | )) { |
... | ... | @@ -97,7 +96,7 @@ public class DataCaptureTask { |
97 | 96 | /** |
98 | 97 | * 每2分钟执行抓取数据 |
99 | 98 | */ |
100 | - @Scheduled(fixedRate = 2 * 60 * 1000, initialDelay = 5000) | |
99 | + //@Scheduled(fixedRate = 2 * 60 * 1000, initialDelay = 5000) | |
101 | 100 | public void captureLivePlayback() { |
102 | 101 | Double durationThreshold = 60d;// 设置直播时长阈值 |
103 | 102 | final Random random = new Random(); |
... | ... | @@ -107,7 +106,7 @@ public class DataCaptureTask { |
107 | 106 | .collect(Collectors.toList());// 找到直播时长>60分钟, 失败次数<30的直播数据 |
108 | 107 | Collection<List<LivePool>> values = withoutPlaybackLive |
109 | 108 | .stream() |
110 | - .collect(Collectors.groupingBy(LivePool::getPhoneNo)) | |
109 | + .collect(Collectors.groupingBy(LivePool::getAccountNo)) | |
111 | 110 | .values() |
112 | 111 | .stream() |
113 | 112 | .peek(item -> item.sort(Comparator.comparing(LivePool::getGetPlaybackFailTimes)))// 把某个人每条直播按失败次数排序 |
... | ... | @@ -115,8 +114,8 @@ public class DataCaptureTask { |
115 | 114 | .limit(5)// 一次找5个人的直播 |
116 | 115 | .collect(Collectors.toList()); |
117 | 116 | for (List<LivePool> list : values) {// 遍历每个人的直播集合 |
118 | - final String accountNo = list.get(0).getPhoneNo(); | |
119 | - Account account = accountDao.findByPhoneNoAndType(accountNo, 1);// 获取账号实体 | |
117 | + final String accountNo = list.get(0).getAccountNo(); | |
118 | + Account account = accountDao.findByAccountNoAndType(accountNo, 1);// 获取账号实体 | |
120 | 119 | final List<JSONObject> playbackMsg = this.getPlaybackMsg(account);// 获取该人的直播回放信息 |
121 | 120 | boolean flag = false; |
122 | 121 | for (LivePool item : list) { |
... | ... | @@ -170,7 +169,7 @@ public class DataCaptureTask { |
170 | 169 | if (Objects.nonNull(playbackSearchKey)) |
171 | 170 | userLivePlayback = kuaiShouCrawl.getUserLivePlayback(playbackSearchKey); |
172 | 171 | else |
173 | - userLivePlayback = kuaiShouCrawl.getUserLivePlayback(account.getPhoneNo()); | |
172 | + userLivePlayback = kuaiShouCrawl.getUserLivePlayback(account.getAccountNo()); | |
174 | 173 | final List<JSONObject> collect = userLivePlayback |
175 | 174 | .stream() |
176 | 175 | .filter(item -> { | ... | ... |
src/main/java/cn/fw/freya/utils/RequestUtil.java
... | ... | @@ -696,10 +696,7 @@ public class RequestUtil { |
696 | 696 | // 设置通用的请求属性 |
697 | 697 | conn.setRequestProperty("accept", "*/*"); |
698 | 698 | conn.setRequestProperty("connection", "Keep-Alive"); |
699 | - conn.setRequestProperty("Host", "cp.kuaishou.com"); | |
700 | 699 | conn.setRequestProperty("Content-Type", "application/json"); |
701 | - conn.setRequestProperty("Content-Length", "84"); | |
702 | - conn.setRequestProperty("Cookie", "kuaishou.web.cp.api_ph=c634819dfa9a1da1762bafcf5d195fd101b4;kuaishou.web.cp.api_st=ChZrdWFpc2hvdS53ZWIuY3AuYXBpLnN0EqAB_xuzZVzMjD9DNrreTtCT1cQDRKvB60dNkgWBOQI3mk8_F0WAM1qRKnUtcZYuGH0JTMUntF7JMrs8L7vYLP9tpQ25ppobabbfAcPBqztI7OJdc7MqSwrjanYe6PRZCHnU-tALse-CVxzMFtCl304ekWU1o9fjm7VBQ9EEkC9Q35erQ2RbrnucqQI5E3p_9cd0JE9J8odcLgXOjbWQvT0OuhoSPRRvGtXySX7EnaufBy__uLw_IiA-3ieQkuU_bNGof-EIcBSlmCzad9Ut9hWRS5nEILA9FCgFMAE;_did=web_656080669F3F2217;userId=2079628287;did=web_94f084024029be79aade1f079e2b82e1731a;"); | |
703 | 700 | // 发送POST请求必须设置如下两行 |
704 | 701 | conn.setDoOutput(true); |
705 | 702 | conn.setDoInput(true); | ... | ... |
src/main/resources/NS_sig3Msg.properties
0 → 100644
src/main/resources/alert.sql
0 → 100644
1 | +alter table ACCOUNT drop constraint UKB04BR4OH2RS73RNUSEXU2NLWG; | |
2 | +alter table ACCOUNT drop constraint UKSOWL8PT6SDTPQPVTXFDP0NPU0; | |
3 | +alter table ACCOUNT drop column ACCOUNT_NO; | |
4 | +alter table ACCOUNT alter column PHONE_NO rename to ACCOUNT_NO; | |
5 | + | |
6 | +drop index IDXTGFKFY1N98UJQVJ5ME0VR3FSV; | |
7 | +drop index IDXKWOBILLHNTYYT02FVAQAM5G5; | |
8 | +alter table COOKIE drop column ACCOUNT_NO; | |
9 | +alter table COOKIE alter column PHONE_NO rename to ACCOUNT_NO; | |
10 | + | |
11 | +alter table LIVE_POOL drop constraint UKANITO7VXALLS54057JU6KJHDF; | |
12 | +alter table LIVE_POOL drop constraint UKRQ8QS6Q2H9NPW3GV40B86LRXM; | |
13 | +alter table LIVE_POOL drop column ACCOUNT_NO; | |
14 | +alter table LIVE_POOL alter column PHONE_NO rename to ACCOUNT_NO; | |
15 | + | |
16 | +alter table VIDEO_POOL drop constraint UKL4792GABX9U74HBTHQ0VQM1FG; | |
17 | +alter table VIDEO_POOL drop constraint UKQ3ROPUUMLOIHN45FGCSUK77G; | |
18 | +alter table VIDEO_POOL drop column ACCOUNT_NO; | |
19 | +alter table VIDEO_POOL alter column PHONE_NO rename to ACCOUNT_NO; | ... | ... |